한 달만에 건독 매크로 중간보고 시간이다.

ㄹㅇ 오래도 걸렸네, 그 새에 해가 바뀌었음;;



뭐 곧 설날이니까 이 타이밍에 해도 ㄱㅊ을듯?


턀갤 여러분 모두 새해 복 많이 받으세요.



그간 뭐 개인적으로도 구직활동이다 뭐다 정신이 없어서 늦어진 것도 있지만

중간보고가 늦었던 더 근본적인 이유는 실제로 작업이 힘들었기 때문인데



1) 저번 중간보고에서 말했던 대로

각종 달성치나 수정치들을 turn tracker에 저장하도록 내부 로직을 수정하다 보니

거의 밑바닥부터 다시 만드는 거랑 비슷한 수준의 수정이 필요했고

(이 과정에서, 불필요하게 1d0을 던지던 로직을 다 뜯어고쳐서 전체 렉의 30% 가량을 줄였음)


2) 1)의 연장선상으로, 이제 매크로들 간에 데이터를 전달하는 흐름이 만들어졌으니

이 여러 개의 매크로 간 상호작용을 다 완성하지 않으면

결국 이게 어떻게 작동한다는 건지 보여줄 수도 없는 상태가 되었으며


3) 이러니저러니 해도 슬슬 내부 로직들이 완성되는 단계다 보니,

이걸 보기 좋게 보여주는 UI 설계의 비중이 작업의 상당 부분을 차지하게 됐는데, 

내가 미술 재능은 영 꽝이라는 사실을 간과했다...



그래서 대충 이번에 다룰 내용은, 


1. 현재 매크로 UI의 개략

2. 사용자 커스텀 기능의 소개

3. turn tracker pointer를 통한 이동 방법과 각종 수정치들의 저장 시연


정도면 될 거 같음.




1. 현재 매크로 UI의 개략



지금까지 건독 매크로 개발과정을 따라온 사람이라면

내가 보통은 조건문으로 처리했을 법한 것들을 죄다 template overwriting으로 때웠다는 걸 이미 알고 있을 거임.



그래서 생긴 필연적인 문제가 이거.



7cf3c028e2f206a26d81f6e44e857668


표의 제목이 정체불명의 지저분한 숫자로 남는다.

저 숫자들이 중복인지 아닌지로 덮어쓸지 여부를 결정하니까...



사실 이게 그리 큰 문제냐, 하면은

지저분한 숫자가 불편하세요? 불편하면 자세를 고쳐않아 하면 그만이긴 한데...



7ff3c028e2f206a26d81f6e44689746d



이게 좀 큰 문제였다.

Roll20 사용 유저 중 절반 정도는 채팅창의 크기를 건드리지 않는다더라...!


보이기에 지저분한 걸로 끝이면 모르겠는데, 저 길다란 숫자 제목이 챗창의 거의 절반에서 3분의 1을 잡아먹잖아.


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fdcc79bf00a6507f1f6ed378a1


이렇게 수정해도 여전히 내 마음에는 안 들었다. 공간을 너무 잡아먹어.

이래서야 뭔 데이터를 우겨넣기도 힘들거니와


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fdcc7cef0da20370106ed378a1


이렇게 버튼들을 잔뜩 집어넣으면 레이아웃이 망가지는 문제도 컸음.


그래서 이 레이아웃을 전면수정하기로 했다.

어떻게든 내어쓰기를 좀 시켜야 채팅창을 안 늘려쓰는 사람도 좀 볼만한 매크로가 될 것 같았음.




그러니까 이제 문제는 두 가지지.


1) 제목을 어떻게 당겨 쓰는데?

2) Roll20은 표의 제목 칸과 내용 칸의 크기가 안에 들어갈 객체의 크기에 따라 유동적인데

어떻게 제목이 들어갈 공간의 최소 크기를 확보하지?



1) 은 내가 CSS에 대해서 잘 몰라서, 뭐 position을 absolute로 바꾸고 뭐고 별 짓거리를 다 해봤는데,

찾아보니 간단한 해결책이 있더라고. 음수 마진(negative margin).


뭔 사령학파 주문 이름 같은데, CSS에서 크기가 정해져 있는 물건에 margin 속성을

위나 왼쪽에 음수로 지정하면 그만큼 물체가 ‘당겨지는’ 효과를 적용할 수 있음.



그리고 2)의 해결책은... 이미 내가 발견했었지?


이 버그 쓸 일이 없을 거 같다고 했는데... 이번에 쓸모를 찾았다!


간단히 말해, 한 줄에 ‘제목이 들어갈 여백 다단’, ‘내용이 들어갈 다단’을 만드는 거지.

저 지저분한 숫자는 내용이 들어갈 다단의 제목으로 써서 날려버리고,

그 앞의 여백 다단에는 크기가 정해져 있는 빈칸을 집어넣으면 최소 공간이 만들어지는 셈



그렇게 해서...


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fd9d7fb002f10072196ed378a1


이렇게 굴림 결과/명중률을 한 줄에 다 넣을 수 있게 됐음.


심지어 이런 것도 가능해짐.


78f3c028e2f206a26d81f6e44e89736e


다중 목표 사격에서 위에 사격 제원을 설명하는 칸, 

겉보기에는 아까의 단일 목표 사격과 마찬가지로, 그냥 template의 기본 설정을 쓴 것처럼 보이잖아?


7bf3c028e2f206a26d81f6e04f85766e


사실 내부적으로는 저 제목처럼 보이는 굵은 글씨는, 다 내가 CSS를 설정해서 만든 거임 ㅋㅋㅋ

채팅창을 왕창 늘리지 않는 이상 거의 구별이 안 갈 거라 자신한다.


그리고 이 덕분에


7af3c028e2f206a26d81f6e440807065


이렇게 잘못된 입력을 사용했을 때 에러 메시지를 띄우는 게 가능함.

물론 애당초 잘못된 입력을 할 수 없도록 설계하는 게 맞겠지만... 

Roll20의 무료기능 수준에서 거기까지 하기는 상당히 힘들다.


75f3c028e2f206a26d81f6e74587776d


현재 각종 판정 결과 매크로들은 채팅창을 늘리면 이런 느낌이 된다.

표의 제목은 표의 내용과 붙어 있어야 제목으로서 가시성이 좋으니까 이런 느낌이 좋지.



하지만 이렇게 판정 결과를 출력하는 거 말고

턴을 진행하는 버튼 중심의 매크로의 경우는, 표에 ‘내용’이랄 게 없잖아?

이 경우는 단추들의 상대적 위치가 이리저리 이동하는 것보다는,

채팅창의 왼쪽이나 오른쪽에 바짝 붙어 정렬되는 게 나을 거 같아서 


74f3c028e2f206a26d81f6e646817664


7ced9e36ebd518986abce89545837d6d1d

이런 느낌으로 만들었음.


7cec9e36ebd518986abce8954580776bd6


안타깝게도 무기 선택 창은, 후술할 사용자 커스텀 기능 때문에

(저 ‘왼쪽 정렬’은 display 속성을 absolute로 설정해서 구현한 거라, 

template의 레이아웃에서 공간을 차지하지 않고, 따라서 버튼 크기가 바뀌면 오작동하는 문제가 있음)

완전한 왼쪽 정렬은 좀 포기하는 수밖에 없었고


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fd9c7cbf50f207261c6ed378a1

7cef9e36ebd518986abce8954188736838


이동&행동의 해결 처리 창 쪽도, 여러 개의 버튼이 모여있을 때 absolute 속성을 쓰면 매우 번거롭기 때문에

그냥 완전한 왼쪽 정렬은 포기했음.

하지만 보다시피 메모나 기타 내용 란의 내용물이 길면 그만큼 제목 란의 크기 증가가 억제되는 효과가 있다 보니

이렇게 표를 막 늘리지 않으면 티도 안 날 거라 생각함.



대충 이런 느낌이라면 좁은 채팅창을 쓰는 사람도 편하게 쓸 수 있지 않을까... 싶긴 한데


솔직히 모니터 해상도 설정을 건드리거나 해도 똑바로 잘 작동할지 걱정이긴 해;




2. 사용자 커스텀 기능의 소개



건독은 총격전 룰이고, 아마 건독같은 쌉마이너 룰을 굳이 플레이하려 하는 사람이 있다면

그 사람은 꽤나 총을 좋아하는 사람일 거임.


과연 그런 사람이,

“나의 커스텀 노리쇠 뭉치, 장전식 손잡이, 텍스처 그립까지 달린 이탈리안 클래식 베넬리 M4를 봐줘, 어떻게 생각해?”

를 참을 수 있을까???



아마 아닐 거임. 

그러니까 FPS 게임에서 킬을 한 총기 이미지를 띄우듯이

사용자가 자기 총기 선택 버튼을 커스텀하는 기능을 추가하는 건 필수라고 생각했다.



그리고 이와 마찬가지로, PL들끼리 지금 채팅창에 뜬 턴 진행 창이 누구 건지 헷갈리는 일이 줄어들도록

자신이 진행하는 창의 외견을 조금 꾸밀 수 있으면 좋겠다고도 생각했고.



그래서 일단 상대적으로 더 간단한 타이틀 꾸미기 기능부터 설명하자면

PC와 NPC의 시트를 켜 보면 Ability 란에


7ce99e36ebd518986abce89542837d6a1d


이렇게 커스텀 관련 매크로들이 잔뜩 있다.

템플릿_CSS 란을 열어보면


7ce89e36ebd518986abce89543857d6e


이렇게 디폴트 설정인, 보라색 배경에 흰 글씨를 지시하는 내용이 적혀 있을 뿐이다.

각 매크로들은 지금 선택한 토큰의 템플릿_CSS 매크로를 호출해서 표를 그리고 있는 거임.


7ceb9e36ebd518986abce8954f837d65


그러니 이걸 이렇게 수정하면


7cea9e36ebd518986abce8954580766f9d


오도짜세 해병이 될 수 있다 아쎄이!


혹시 해병문학 밀리터리 세션을 할 일이 있을 때, 이런 앙증맞은 매크로를 적용한다면

그야말로 모칠좋고 톤톤좋은 일이 아니겠는가!


7ce59e36ebd518986abce89547867d6846


혹은 이렇게 아예 배경 사진으로 쓸 만한 링크를 따 와서


7ce49e36ebd518986abce8954089746a21


보노보노를 넣어서 정말로 데단한 매크로를 만들 수도 있음.

글자 색에 그라데이션을 넣으려고 했는데, 이걸 위해 필수인 

backgrond-color 속성 대신 background에 바로 색을 집어넣는 게 Roll20에서는 막혀 있는 거 같다. 슬프다.



그렇다면 무기 선택의 경우는 어떨까.


7fed9e36ebd518986abce89544807365b1


기본적으로는 시트에 기입된 사격 모드와 사용 스킬에 맞춰서


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fd9c2abc51a60a741c6ed378a1


이렇게 사격 모드에 따라 가능한 사격 방식을 확인하고, 사용 스킬에 따라 적절한 아이콘이 적용되도록 설계되어 있지만


7fef9e36ebd518986abce89544817d6cd8


자신의 주무장 종류를 찾아 들어가서, 적당한 사진의 링크를 집어넣는 등 좀 손을 봐 주면


7fee9e36ebd518986abce8954f82726cfa


만해를 해방할 수 있다.



만약 평범한 용병 PC를 만들고 싶다면, 대신 자기가 쓰는 총기 사진을 넣으면 되겠지?

여담이지만 건독은 룰북에 일본도 데이터가 있다. 야쿠자들 무장으로 넣으라는 의도였을까...



아무튼, 무기의 종류는 물론 주무장일 때와 부무장일 때 적용할 수 있는 커스텀을 다 구별해 놨는데

서로 다른 총기로 쌍권총을 들거나, 쌍검을 들거나 하는 걸 원하는 사용자가 있을 것 같아서였다.

근데 아무리 그래도 쌍 활이나 쌍 투척용 단검 같은 미친 조합은 안 나올 거 같아서

투사 무기는 주무장, 부무장 구별 없이 투척과 무기 전투 두 종류로만 퉁쳤음.


쌍 활을 들 합리적인 이유가 있다고 생각하시는 분께서는 댓글로 의견을 달아주세요. 수정사항에 반영하겠음...




대체 이걸 어케했노 싶은 분들을 위해서 내부 로직을 좀 설명하자면


7fe99e36ebd518986abce89547877065b6


사격 모드에 이런 식으로 숫자를 부여해 놓은 다음


7fe89e36ebd518986abce8954283716f69

이런 과정으로 해당 사격 방식에 그 무기를 사용할지 말지 정하는 식임.


비슷하게 사용 아이콘을 정하는 과정에서도


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fd9b79ef01fc50221e6ed378a1


이렇게 커스텀 CSS 구문을 불러오고.


드럽게 귀찮아서 그렇지 사실 그렇게 어려운 방식은 아니라서,

굳이 건독 정도로 귀찮은 룰이 아니더라도, PL들마다 매크로를 다르게 꾸미면서 내부 로직은 통일하고 싶을 때는

이런 객체지향적(?)인 방법을 좀 써 보는 것도 추천함.




3. turn tracker pointer를 통한 이동 방법과 각종 수정치들의 저장 시연



저번 중간보고 때 말했던 것처럼, 몇 가지 문제점

(턴 트래커에 올라오는 모든 토큰의 이름을 서로 다르도록 바꿔줘야 한다던가,

턴 트래커를 끄면 매크로가 동작하지 않는다던가, 매우 귀찮다던가 등등...)을 감수하고

어차피 turn tracker pointer를 쓰기로 결심한 이상


이동 방식이나 다종다양한 달성치들을 같은 방식으로 저장하도록 만들지 말아야 할 이유가 없다.


7fea9e36ebd518986abce89544807c6c2a


그래서 이제 이니셔티브를 4로 나눈 값에 이동 방식을 저장하고


7fe59e36ebd518986abce8954e82706e


이동 방식에 따른 수정치도 이렇게 이니셔티브를 그때그때 받아와서 나누는 식으로 동작한다.


7fe49e36ebd518986abce8954e847d6b


문제는 건독은 〈감지〉,〈상황파악〉만 이렇게 별도의 이동 방식에 대한 수정치가 적용되는데...

예전에야 앞의 쿼리가 뒤에 나오는 동명의 쿼리 선택지를 덮어씌우는 걸 이용해서 이걸 해결했지만

이제는 이동 방식 설정 쿼리 자체가 없어져 버렸기 때문에

임의의 스킬 판정 롤에서 수정치 적용이 곤란해져 버리는 문제가 생겨서


7eed9e36ebd518986abce8954786776a19


이렇게 내부의 inline roll 처리에 영향을 주지 않는 값을 집어넣어서, 


7eec9e36ebd518986abce8954188716f91


그걸로 index manipulation을 하는 방식으로 처리하는 수밖에 없었다.

이 방법 떠올리느라 좀 힘들었었음...ㅜㅜ


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fdcf2eb105f2547e4a6ed378a1


물론 목표가 전력 이동일 때 사격 명중률이 줄어드는 것도 자동으로 적용된다.


자세히 본 사람이라면 prefix가 @{target|사격 목표 선택|trackerPrefix}로 target에서 받아오도록 되어 있는 부분이 의문스러울 수도 있겠는데

이건 뒤의 @{target|사격 목표 선택|token_name}이 하나만 있을 때는 별 문제가 안 되지만

만약 매크로 하나에서 target의 attribute를 몇 개씩 가져와서 prefix를 적용시키면 버그가 나기 때문임.


정확한 원인은 모르겠는데, 아무래도 @{target| 방식으로 attribute를 가져오는 것과

@{selected|, @{시트 이름|으로 attribute를 호출하는 것에 모종의 처리 순서 차이가 있는 거 같음.


때문에 두 번째 @{target|사격 목표 선택|token_name}이 미처 치환되지 않고 prefix가 적용되어서, 


7eee9e36ebd518986abce89544857d6d


이렇게 @{target이라는 속성이 없다는 에러를 계속 띄우기 때문에,

처음에는 prefix로 바뀌는 prefix를 만드는 식으로 층위를 점점 높이는 방식으로 대응했다가

다중 목표 사격에서 prefix를 열댓 번이나 호출하는 거 때문에 포기했고

어쩔 수 없이 모든 시트에 tracker에 대한 prefix를 내장시켜 뒀음. 이건 버그가 없더라고.




이렇게 이동 방법을 자동화했으면

이제 판정에 쓰이는 다른 값들도 자동화해야겠지?



앞에 무기 선택창에서 무기의 사격 방식에 코드값을 부여했던 거랑 같은 방법으로


7ee99e36ebd518986abce8954281766b88


이렇게 사격 모드를 정하는 쿼리 테이블을 가변적으로 받으면서

사격 모드에 따라 서로 다른 값을 역시 턴 트래커에 저장한다.

(저 요상한 식은 1, 2, 3, 5를 0, 1, 2, 3으로 바꾸는 가장 간단한 식... 

이라고 생각하고 만들었는데, 실제로 가장 빠르게 작동하련지는 모르겠다.)


7ee89e36ebd518986abce89547887569f6


달성치와, 그 달성치가 적용되는 것이 다중 목표 사격이었다면 몇 번째 표적이었는지도 저장하고.


7eeb9e36ebd518986abce8954386726a34


물론 부위 공격일 경우, 조준 부위도 명중 굴림 단계에서 선언하고 저장하게 해 놨어.

보면 index를 써서 트래커에 할당하도록 해 놨는데, 이건 수식 전체를 평범하게 트래커에 더하는 식으로 코드를 짜 버리면

사격 부위 쿼리를 호출할 때마다 트래커에 더하는 것까지 반복해 버려서 그럼.


7eea9e36ebd518986abce8954783726bafdd


그러면 이렇게 대미지 굴림에서는 쿼리에 ‘자동’을 클릭하는 것만으로 저장된 값을 꺼내 쓸 수 있지.

대미지 굴림 매크로를 예전처럼 단일/다중/부위 공격으로 나눌 필요도 없고.



20발 이상의 제압 사격의 설정에 대해서는 메모리에 저장하는 자릿수가 바뀌었을 뿐,  예전과 별 차이 없으니 생략.



판정 외에 포인터를 쓰는 부분은 지금으로서는 하나밖에 없는데,

행동 선언 시에, 선언한 행동의 카테고리를 저장하도록 해 놨음.


행동 선언 이후에, [끼어들기]가 이루어지거나, 그냥 판정이 너무 길어지거나 해서 

‘이동&행동의 해결’ 창이 채팅창에서 저 위로 올라갔을 때, 이 값을 기준으로 창이 값을 가변적으로 만들 수 있도록.


물론 6.5바이트짜리 메모리에 이니시에 이동 방식에 값을 꽉꽉 쑤셔 넣다 보니, 이 값의 범위가 침범당하지 않을 거라 기대할 수 없으니기본적으로 행동의 처리 단계에서 이 값은 지워지고, 메모리에 정확히 이니시와 이동 선언, 

해당 행동의 값만 저장되어 있는 게 아니면 그냥 행동 표를 공란으로(즉 이미 행동을 처리했다는 식으로) 출력하도록 했음.



뭐 FVTT 같은 걸 쓰면 각종 수정치나 상태이상 같은 걸 죄다 저장하는 것도 가능하겠지만

Roll20 무료계졍 수준에서 할 수 있는 건 이 정도 응용이 한계인 거 같다.




4. 마무리


viewimage.php?id=39afc021&no=24b0d769e1d32ca73dea85fa11d028316d89837e453d871a154fbca342cbf9d865373d25045b9cd2ec72fb98e0afbffbf65e43fdc87eea07f05671106ed378a1


7ee49e36ebd518986abce8954383746a


그것 말고도 이니셔티브 판정 자동화라던가도 만들기는 했는데...

뭐라고 해야 할까, 도입부에서도 했던 말이지만 매크로가 충분히 정교해지니까

이제 진짜 ‘전부’ 작동하도록 만들어야 좀 보는 사람 입장에서 왜 이렇게 만들었는지 이해가 갈 거 같다는 느낌...?



그게 아니더라도, 마스터링 경험도 없고 이런 자동화 툴을 많이 만져본 적도 없는 입장에서

잘 알지도 못하는 룰 맨땅 헤딩으로 만들자니까 ‘이걸 쓸 일이 있나...?’ 싶은 부분이 많아진다.


예컨대 이런 거.

‘명중 굴림의 결과를 자동화했는데, [나인 라이브스] 클래스 아츠로 대미지가 비관통이 된다면,

이 때는 PL이 조작을 어떻게 해 줘야 하는가?’


나야 룰과 내부 매크로 로직을 이해하고 있으니까,

그냥 ‘장갑치를 99로 해서 무조건 비관통으로 처리해 버리던지, 

아니면 달성치를 죄다 1로 바꿔서 수동 입력하던지’라고 간단하게 끝나는데,

과연 사용자들이 거기까지 바로 생각이 닿을까???


근데 그렇다고 대미지 판정에다가 관통 여부를 자동/관통/비관통 중 정하는 별도의 드롭박스를 만드는 건 

너무 지저분하지 않을까...?


이런 생각이 계속 들다 보니


79ed9e36ebd518986abce8954083706c02


이런 식으로 툴팁으로 뇌절을 치거나 하게 되더라고.



지금으로서 가장 걱정되는 건, 위에서 말했던 것처럼 온갖 꼼수로 점철된 UI 객체들 배치가

모니터 해상도 설정이 다르다던가, Stylus 등의 플러그인을 적용하거나, 기타등등의 이유로 뻑나면 어쩌지 하는 거.

이건 ㄹㅇ 내가 남들에게 보여줘야 파악이 되는 부분이니.



그런 맥락에서 지인들에게 ‘이거 보기 ㄱㅊ음???’ 같은 질문을 수시로 해 가며

그리고 그 때마다 뜻밖의 대답이 돌아오는 경험을 하면서 느끼는 건데



역시 이런 건 혼자서 완성본을 뚝딱 만들어내는 게 안 된다...


여러 사람들이 써 가면서 완성해야 하는 게 맞는 거 같음.



역시 점점 매크로가 완성 단계에 이를수록, 내 혼자서 뚝딱 해치울 수 있는 범주가 줄어든다는 기분이 든다.

솔직히 앞으로 얼마만큼 시간이 더 걸릴지 모르겠음. 

그 사이 취직할 수도 있고, 남은 기능들을 배치하는 데 내가 얼마나 삽질을 할지도 감이 안 잡히고.

제압 사격의 대미지 굴림을 어떤 식으로 표현하는 게 최선인지도 모르겠고,

저격이나 체이스의 TRS 같은 것도 자동화할지 여부도 아직 못 정했고...



그래서, 아무래도 다음 매크로 중간보고 때는 세부사항은 좀 미완성일지언정 거의 완성된 턴 흐름을 다 만들어서

턀갤러들 중 지원자들을 방에 초대해서 피드백을 받을 수 있는 정도까지 좀 구현해보고 싶다.



뭐 희망사항일 뿐, 그게 진짜 될지는 모르겠지만.


그럼 이만.