1. 반대손 무장의 명중률 계산식에서 [전투 거리]를 꼭 표기해야 하는가?
근접 무기의 [양손 공격] 매크로를 열심히 만들면서
쿼리의 작동 순서를 직관적인 형태로 뜯어고치다가 부닥친 문제.
일단 아래 건 실제로 완성한 건 아니고, 작동을 위해 임시로 모양만 흉내내 놓은 거긴 한데...
일단 근접 [양손 공격]을 하면 아마 이런 식으로 굴림 결과가 출력될 거고,
사격과 마찬가지로 구체적인 공격 내용 설명에서
전투 거리가 [지근거리], [근거리], [중거리], [장거리] 중 무엇인지 지시해 줄 거임.
그리고 주로 쓰는 손의 명중률에서는, 이렇게 마우스를 가져다 대면
[지근거리]의 [거리별 명중 수정]이 출력되어 나오게 할 수 있음.
그런데 지금 내가 작성해 놓던 방식으로는, 반대손 무장의 경우는
[지근거리]를 사용했다는 것을 명중률 계산식에서 주석으로 달 수 없고,
[반대손 무장의 거리별 명중 수정]이라는 모호한 말로 뭉뚱그릴 수밖에 없을 거 같음...
그러니까 이렇게 할 수가 없다는 소리지.
그래서 저렇게 출력할 방법이 없느냐? 하면 그건 아님.
결국 저 문제가 나온 게,
'index로 값을 받아오더라도, 그 값에 할당된 주석은 가져올 수 없다'는 점 때문인데
그러면 애당초 명중률 전체를 Query 내에 들어가도록 하면 되는 일이긴 함.
즉 내가, 지금 필요한 Query들을 순차적으로 호출하게 만들어놓은 해당 코드를
이런 느낌으로,
명중률 계산식을 아예 안에 넣어버리는 식으로 해결할 수 있다... 이거임.
...근데 과연 이럴 필요가 있을까...?
결국 이게 [지근거리]인지 [근거리]인지 같은 건 표 위에도,
주로 사용하는 손의 무장 명중률 계산식에도 다 나온단 말임...
결국 저 계산식이 나오게 한 이유는 [전투 거리]를 잘못 클릭해서 에러플이 나는 걸 방지하는 용도인데,
머릿속에 무장의 [거리별 명중 수정]을 외우고 다니는 게 아니고서야
반대손 무기에 [전투 거리]가 출력되지 않는 거 때문에,
시트에 거리별 수정치를 잘못 적었다는 걸 캐치해 낼 수는 없거든.
그래서 굳이 이렇게 고칠 필요가 있을까, 가 첫 번째 고민.
2. 패시브 [클래스 아츠]의 적용 여부를 파악하는 로직 설계 관련
위에서 [반대손으로 공격]이 나와서 고민하게 된 부분.
건독에서는 기본적으로 반대손(보통은 왼손)으로 하는 판정은 -20%의 보정을 받게 되어 있는데,
클래스 아츠 《오프 핸드 트레이닝》을 습득하면 이 보정을 치워버릴 수 있음.
예전에는 이걸 그냥 일일히 수동으로 수정치 입력하게 만들 생각이었는데...
사실 애초에 빌드를 쌍권총/쌍검으로 짜 온 플레이어가 이걸 전부 일일히 하게 만들면
귀찮음이 너무 가중된다는 생각이 들어서
이 처리를 좀 자동으로 하게 만들 생각이었음.
즉 캐릭터 시트에 클래스 아츠 1~8이라는 attribute를 만들어 주고
여기에 자기 클래스 아츠를 입력하면
이걸 매크로가 파악해서 특정 문자열이 있으면 해당 수정치가 자동으로 변하도록 하는,
그런 기능을 구현하려 했는데...
문제는 이거임, Roll20은, 적어도 무료 기능 수준에서는, 문자열 비교 기능을 지원하지 않음.
즉 'attribute가 특정 문자일 때만 다르게 작동하는 매크로'를 만들려고 하면
prefix 트릭을 바탕으로 꽤나 꼼수를 쓰는 수밖에 없음.
기본적으로는, 가능한 모든 입력값에 해당하는 attribute를 다 따로 만들어줘야 함.
근데 생각나는 방법들이 다들 서로 다른 문제점이 있음:
1) 그냥 캐릭터 시트마다 '《오프 핸드 트레이닝》 습득 여부' attribute를 만들어서 true/false를 입력하게 하고
이에 따라서 매크로를 통제하는 방법.
다른 매크로들은 대충 이런 식으로 작동하게 만들었으니 가장 간단한 방법이긴 한데...
근데 기본적으로 《오프 핸드 트레이닝》처럼 매크로 동작 과정에 작용하는 다른 [클래스 아츠]가 꽤 있다는 게 걸림.
내가 셈하기로는, 《오프 핸드 트레이닝》 말고도 매크로 상으로 구현해야 하는 패시브가
《숏 버스트》, 《마스터즈》가 기본 룰북에 있는 클래스 아츠고,
서플 바이츠 더 불렛까지 구현한다 치면, 《앱소브》 정도가 더 있고
《더블 탭》도 1턴짜리 즉발기지만, [부위 공격] 사격 매크로를 뜯어고쳐야 해서
아마 이것도 인식하게 만들어야 할 거 같음...
이렇게 보면, 습득 여부 확인 토글이 5개나 되는데
이걸로 괜찮은건가? 싶다.
2) 각 [클래스 아츠]마다 숫자 코드를 배정해 놓고
매칭 연산으로 매크로를 서로 다르게 작동시키는 방법
가장 일반적인 방법이고, 지금까지 많이 써 왔는데 문제가...
거시적으로 보자면,
'[클래스 아츠]의 존재에 따라서 다른 쿼리창이 뜨게 하는 등,
단순한 수치 변경 외에 매크로의 작동 과정에 영향을 주게 하는' 건
구현하기가 굉장히 힘들어지고
당장의 문제라면, 지금 만들어놓은 사격 매크로들의 index 순서에 영향을 주는 수정이 필요한지라
결국 사격 매크로들을 조금씩이나마 또 다 갈아엎어야 한다는 게 문제임;;
특히 《숏 버스트》는 후술할 3)을 혼자서 따로 구현해야 할 가능성이 매우 커 보인다.
3) 가능한 모든 [클래스 아츠]입력값마다, has(클래스 아츠 이름) 형태로 불리언 값을 반환받도록 attribute 왕창 만들기
이렇게 말하니까 되게 난해한데, 예시를 들자면
@hasOppHandTraining_아다만시 = false
@hasOppHandTraining_어프렌티스 = false
@hasOppHandTraining_엔돌핀 = false
@hasOppHandTraining_오프 핸드 트레이닝 = true
@hasOppHandTraining_캐퍼시티 업 = false
...
@hasShortBurst_아다만시 = false
@hasShortBurst_어프렌티스 = false
...
이런 식으로, 존재 여부를 판별해야 하는 모든 클래스 아츠와
가능한 모든 클래스 아츠의 입력값마다 일치 여부를 파악하는 attribute들을 다 만들어서
시트의 클래스 아츠 1~8 중에 true가 하나 있으면 다르게 작동하게 하는... 그런 구조를 만들자는 거임.
이론적으로는 겁나 간단하고 깔끔하긴 한데,
문제는 건독 기본 룰북에 등재되어 있는 클래스 아츠는 공용 포함해서 8*8+10=74개가 있고
서플에 추가된 걸 합하면... 중복을 빼더라도, 한 100개는 될 거라는 거임.
그리고 내가 지금 판별해야 한다고 말한 클래스 아츠만 5개니까,
약 500개의 attribute를 매크로 캐릭터 시트에 일일히 만들어야 한다.
...아무리 그래도 이건 너무 미친짓이 아닌가...? 싶다.
심지어 홈브류로 클래스 아츠를 더 만들던가 하면 또 그만큼 더 매크로를 만들어야 한다는 점에서
확장성도 영 아님.
4) 에러 메시지를 무시하고 작동하는 방식
그래서 든 생각이 뭐냐면,
예전에 attribute의 특성을 이용해서, 없는 attribute를 호출하면서 돌아가는 매크로를 연구한 게 있거든?
이걸 3)에 적용해서,
@hasOppHandTraining_아다만시, @hasOppHandTraining_어프렌티스 같은 attribute를 만들지 말고
그냥 에러를 뱉게 한 다음, 에러가 나오면 false로 연결되게 만드는...
그런 구조를 적용해 봤음.
이런 느낌으로 꽤 잘 작동하긴 한다.
기본적으로 뭔가 존재하지 않는 클래스 아츠를 추가한다고 해도
숫자 코드나 비교연산 결과를 따로 만들 필요도 없어서 확장성도 좋고
무엇보다 판정하는 [클래스 아츠] 하나마다
매크로 캐릭터 시트에 attribute를 6개만 추가하면 되기 때문에
구현이 가장 간단하다는 장점이 큼.
...다만 역시 문제는,
빨간색 에러 메시지가 PC가 가지고 있는 클래스 아츠 개수만큼,
혹은 1개 더 적게 뜬다는 사실 그 자체임.
PL 입장에서는, 챗창이 저걸로 꽉 차게 되니까.
물론 에러 메시지는 PL한테만 보이는 거라서, 로그에도 남지 않고
그냥 새로고침 한 번만 해도 날아가는 거긴 해.
하지만 당장 위에서 채팅 친 내용이 위로 올라가는 것부터가 귀찮을 거 같기도 하고
뭘 잘못 설정한 것도 아닌데, 에러 메시지가 챗창에 뜬다는 것 자체가
기분 나쁠 사람도 있지 않나 싶다...
5) 그냥 얌전히 수정치 손으로 입력하게 하기
6) 아니 그냥 지금부터 JavaScript 공부하기
그래서 님들 보기에는 뭐가 가장 나은 해결책 같음???
4)를 적용하면 여러분은 많이 불편할 거 같나유?
세줄요약좀
머꼬 이게