혹시 내가 건독 매크로 개발과정을 만드는 걸 좀 유심히 본 사람이라면,

내가 prefix라고 명명한 attribute들을 순차적으로 호출하는 것을 통해

다른 attribute나 ability를 지연되어 작동하게 하는 것으로

시트의 attribute 값에 따라서 다양한 기능들이 동적으로 작동하게 하는 것을 봤을 것이다.



예컨대, 시트의 입력값이 '빨강'이냐 '파랑'이냐에 따라 다르게 동작하는 매크로를 만들려면


a76500ad360ab4668fff5a51ce5cc8d8d02b5695568f076202c07d946c5adf


이렇게 시트의 상태를 설정하고


a76500ad360ab4668f332b6d565cd1e9150d91195a8a0427fe0bd9c6580b16d7f8a0bfea


이렇게 '색상_빨강'이나 '색상_파랑'이 ability로 뒤늦게 들어가도록 만들어서


a76500ad360ab4668f332b6d565dc0ecad67a7b722c2e62df08e1f56c5327126


이렇게 값을 출력할 수 있다.



다만 이 방식에는 약간의 결점이 있는데, 위의 '입력값'을 잘 보기 바란다.




내가 알기로 api를 사용하지 않고서는 시트의 attribute에

입력할 수 있는 값의 종류나 범위를 제한하는 것이 불가능하다.


그래서, 만약 내가 할당하지 않은 값을 시트에 넣을 경우


a14a36ad0f26782cbe4d5a48c291a8fd594d7342d3d80b3d9574a414825b0208dbec266a63bdef56b01836191b5f9a


이렇게 오류를 일으킨다.



그런데 이 결과를 유심히 보다가, 좀 이상하다는 생각이 들었다.

'No ability was found for %{Test1|색상_노랑}' <- 이 부분...


왜 '%{Test1|색상_노랑}'이지???

'%{Test1|Test1|색상_노랑}'이라는 형식에 안 맞는 값이어야 하는 거 아냐???



그래서 몇 가지 실험을 해 본 결과, 재미있는 것을 알아냈다.



2cbfd92aecc6212a9347963fc40ca8c771b5182a991af3932da5ea2279f4d5


ability의 경우 작동 방식이 상당히 기괴하다.

기본적으로는 |로 구별된 항이 세 종류일 경우, 중간에 있는 의미없는 값을 무시하면서 작동하지만,

구별된 항이 네 개일 경우에는 뒤의 두 개를 사용해서


2cbfd92aecc6212a9347963fc401aeee48d9e39d4971271b81c94d384b6b


이렇게 ability를 호출하게 된다.


항이 5개를 넘어갈 경우 아예 'TypeError: wt is undefined'를 출력하면서 작동하지 않고.



그렇다면 attribute의 경우는 어떨까?


2ca9c434ecd02db26b332b4d565bf6e06c67287d3c7537bbd30574e7e86537db17


attribute의 경우는 훨씬 더 간단하게 동작한다.

Max가 아닌 한, 호출할 attribute명 뒤에 |로 구별된 값을 아무리 많이, 길게 넣더라도


2ca9c434ecd02db26b332b4d565bf6ed86dd436aba04ba11309f8876187d97a3


이를 무시하고 작동한다.



눈치챘겠지만, 이번에 사용하려는 것은 이 트릭이다.

에러를 일으키는 '할당되지 않는 값'을 | 뒤로 보내면 attribute 처리 과정에서 지워질 것이며



a14a36ad0f26782cbe4d9638ee09a8eb6d9687ec7f4e4072654d151d2ca1025f1c5275f963a2


이미 우리는, 존재하지 않는 attribute나 ability를 호출할 때

prefix와 중괄호만 없애고 그 사이 문자열은 그대로 반환한다는 사실을 알고 있으니까.



a1682caa2737782a8a675b59f39f3433823db9893ec5dd2f918db7ea

그래서 다음과 같이, ability로 바로 이동하는 게 아니라 attribute를 중계하도록 시트를 수정한 다음


a04804ad0e0776b660b8f68b12d21a1dc0579d30


이렇게 코드를 작성하면


a14a20ad1a1e782da74b5a5eea5de3dd588a687065fa727dd05e8eab65d0


'Error' ability가 정상적으로 호출되는 것을 확인할 수 있다.




이를 응용하면, 무기를 사용할 때 적용할 능력치 등이 시트에 제대로 할당되지 않았을 때

어느 칸에 값이 누락되었는지를 안내해 주는 메시지를 채팅창에 띄우는 등

오류에 대한 처리를 수행하는 것이 가능해진다.




...다만 개인적으로는 이 방법을 사용하기가 조금 망설여지는 것이...


갠적으로는 매크로에서 attribute를 가급적 사용하지 않으려 하는 게,

attribute는 삭제 시 경고 메시지가 뜨지 않아서,

진짜로 순수하게 클릭 미스로 시트를 고장낼 여지도 많고


보면 알겠지만, 이 작동방식을 쓰면 '매크로의 정상적 작동 과정에 할당되어 있는 경우들'마다

중계하는 attribute를 다 만들어줘야 하는데...


이것도 상당히 귀찮은 일인지라;;;




머 쓰고 싶은 사람들은 씁시다, 라는 원론적인 이야기로 이만 마치겠읍니다.