Javascript로 Wakfu를 디코딩하는 동작 효과
오늘은 MMORPG 마법 효과에서 어떤 문자열 논리 템플릿을 디코딩하는 방법을 공유하고 싶습니다.
🤖 언어 환경
주어진 Wakfu 장치에서 데이터를 검색하는 Discord Bot 을 개발하고 있습니다.다행히도, 대부분의 필요한 정보는 사용할 수 있다. 비록 일부 단점이 있지만forum post.그 중 하나는 장치가'동작 id'에 따라 발생할 수 있는 효과이다.
문제는 이런 효과 설명은 텍스트에 디코딩이 필요한 변수를 덧붙인다는 것이다.
🐤 예: 단순
장치Royal Tofu Helmet로부터items.json
{
"definition": {
"item": {
"id": 9481,
"level": 18,
// ...
},
"equipEffects": [
{
"effect": {
"definition": {
"id": 184439,
"actionId": 1053,
"areaShape": 32767,
"areaSize": [],
"params": [22, 0]
}
}
},
// ...
]
},
// ...
}
이것은 actions.json 의 동작입니다.{
"definition": {
"id": 1053,
"effect": "Gain : Maîtrise Distance"
},
"description": {
"fr": "[#1] Maîtrise Distance",
"en": "[#1] Distance Mastery",
"es": "[#1] dominio distancia",
"pt": "[#1] de Domínio de distância"
}
}
[#1]
코드는 장치 동작 정의의 첫 번째 인자를 사용합니다.그러나 매개변수가 쌍으로 나타납니다.이 경우 첫 번째 매개 변수는 고정 값에 등급에 따라 축소된 값을 더한 것입니다: params[0] + params[1] * level
⇒ 22 + 0*18
. 그래서 [#1]
= 22
.따라서
22 Distance Mastery
지금까지는 상당히 간단했다.🎃 예: 중간
다른 예를 살펴보겠습니다.
장치 Gelano
"definition": {
"id": 127211,
"actionId": 1068,
"areaShape": 32767,
"areaSize": [],
"params": [
30,
0,
3,
0
]
}
{
"definition": {
"id": 1068,
"effect": "Gain : Maîtrise Élémentaire dans un nombre variable d'éléments"
},
"description": {
"fr": "{[~3]?[#1] Maîtrise [#3]:[#1] Maîtrise sur [#2] élément{[>2]?s:} aléatoire{[>2]?s:}}",
"en": "{[~3]?[#1] Mastery [#3]:[#1] Mastery of [#2] random{[=2]?:} element{[=2]?:s}}",
"es": "{[~3]?[#1] Dominio[#3]:[#1] Dominio de [#2] elemento{[>2]?s:} aleatorio{[>2]?s:}}",
"pt": "{[~3]?[#1] Domínio[#3]:[#1] Domínio sobre [#2] elemento{[>2]?s:} aleatório{[>2]?s:}}"
}
}
현재 우리는 [#2]
과[#3]
뿐만 아니라 [~3]
과[>2]
도 있다.보기를 통해 우리는 형식
{<condition>?<valueIfTrue>:<else>}
의 일부 조건 표현식을 식별할 수 있다.분명히 어떤 물건이 2보다 높을 때 표현식
{[>2]?s:}
은 단어에 복수를 부여하는 데 쓰인다.동일한 논리를 사용하여 전체 표현식은 인쇄할 조건
[#1] Mastery [#3]
또는 [#1] Mastery of [#2] random{[=2]?:} element{[=2]?:s}
을 검사합니다.이러한 기호의 의미를 이해하기 위해 우리는 0M1N0U5 게임 포럼에서 공유한 발견을 볼 수 있다.
Operators +, -, ~ to check the number of parameters.
<, >, = with two behaviours:If it comes with a parameter on the left [2=3], I use it as a constant compared to the parameter on the right using the operator that is naturally between both.
Every time I solve a calculated parameter, it is stacked so I can use it later.
If it comes without a number on the left, then I read the value from the top of the stack and use it as a value and in the same way as mentioned above.
우리는 [3] 파라미터의 수량이 적어도 3인지 검사한다고 생각한다.
장치의 매개 변수를 검사하면 두 개의 매개 변수 (4개의 값) 가 있기 때문에 계산 결과는
else
값이다.쿨, 이제 우리는 이것
{[=2]?:s}
이 생겼다. 이것은 아마도 버그일 것이다. 왜냐하면 다른 언어가 사용되기 때문이다{[>2]?s:}
.여기서 관건은
[>2]
조건이 마지막 평가의 매개 변수를 가리키는 것이다.따라서 표현식
{[>2]?s:}
에서 [#2]
이 2보다 큰지 확인합니다(영어 설명과 일치하면 같습니다).다음은 스페인어 표현식을 자바스크립트 코드로 변환하는 방법입니다.
let stack = 0
const hasThreeOrMoreArguments = params.length >= 6 // [~3]
const firstParam = () => { // [#1]
const value = params[0] + params[1] * level
stack = value
return value
}
const secondParam = () => { // [#2]
const value = params[2] + params[3] * level
stack = value
return value
}
const thirdParam = () => { // [#3]
const value = params[4] + params[5] * level
stack = value
return value
}
const isLastStackValueGreatherThanTwo = () => stack > 2 // [>2]
const plural = () => isLastStackValueGreatherThanTwo() ? 's' : '' // [>2]?s:
// {[~3]?[#1] Dominio[#3]:[#1] Dominio de [#2] elemento{[>2]?s:} aleatorio{[>2]?s:}}
const description = `${hasThreeOrMoreArguments ?
`${firstParam()} Dominio${thirdParam()}`
:
`${firstParam()} Dominio de ${secondParam()} elemento${plural()}} aleatorio${plural()}`
}`
이 장치에 대한 설명은 30 Dominio de 3 elementos aleatorios
이상하게도 세 개 이상의 파라미터가 있는 장치의 설명은 30 Dominio1
과 유사하다.그러나 이 조건을 충족시킬 수 있는 설비는 하나도 없다.지금까지 모든 것이 순조롭다.
🐲 예: boss
이제 boss 예시를 검사할 수 있습니다. "Gray Mage's Wand"
{
"definition": {
"item": {
"id": 23189,
"level": 109,
// ...
},
"useEffects": [
{
"effect": {
"definition": {
"id": 212575,
"actionId": 1084,
"areaShape": 32767,
"areaSize": 1,
"params": [
2.4,
0.201
]
}
}
},
// ...
]
},
// ...
}
{
"definition": {
"id": 1084,
"effect": "Soin : Lumière"
},
"description": {
"fr": "Soin [el6] : [#1]{[+3]?% des PV:}{[+3]?{[1=3]? max:{[2=3]? courants:{[3=3]? manquants:{[4=3]? max:{[5=3]? courants:{[6=3]? manquants:}}}}}}:}{[+3]?{[4<3]? du lanceur:{[7<3]? de la cible:}}:}{[-2]?{[0=2]? [ecnbi] [ecnbr]:}:}{[+2]?{[2=2]? [ecnbi]:}:}{[+2]?{[1=2]? [ecnbr]:}:}",
"en": "[el6] Heal: [#1]{[+3]?% of HP:}{[+3]?{[1=3]? max:{[2=3]? current:{[3=3]? lost:{[4=3]? max:{[5=3]? current:{[6=3]? lost:}}}}}}:}{[+3]?{[4<3]? of the caster:{[7<3]? of the target:}}:}{[-2]?{[0=2]? [ecnbi] [ecnbr]:}:}{[+2]?{[2=2]? [ecnbi]:}:}{[+2]?{[1=2]? [ecnbr]:}:}",
"es": "Cura [el6]: [#1]{[+3]?% de los PdV:}{[+3]?{[1=3]? máx.:{[2=3]? actuales:{[3=3]? faltantes:{[4=3]? máx.:{[5=3]? actuales:{[6=3]? faltantes:}}}}}}:}{[+3]?{[4<3]? del lanzador:{[7<3]? del objetivo:}}:}{[-2]?{[0=2]? [ecnbi] [ecnbr]:}:}{[+2]?{[2=2]? [ecnbi]:}:}{[+2]?{[1=2]? [ecnbr]:}:}",
"pt": "Cura [el6]: [#1]{[+3]?% dos PV:}{[+3]?{[1=3]? máx.:{[2=3]? atuais:{[3=3]? perdidos:{[4=3]? máx.:{[5=3]? atuais:{[6=3]? perdidos:}}}}}}:}{[+3]?{[4<3]? do lançador:{[7<3]? do alvo:}}:}{[-2]?{[0=2]?[ecnbi] [ecnbr]:}:}{[+2]?{[2=2]? [ecnbi]:}:}{[+2]?{[1=2]? [ecnbr]:}:}"
}
},
이것은 미친 듯이 보일 수도 있지만, 0M1N0U5 덕분에 우리는 문제를 해결하는 데 필요한 모든 정보를 가지고 있다.기본 내용은 다음과 같습니다.
"일정량을 치유한다. 만약 3개 이상의 파라미터가 있다면 일정 비율의 생명을 치유한다. 만약 세 번째 파라미터가 1과 같다면 최대 생명치이다. 만약 2와 같다면 현재 생명치이다. 만약 3개가 있다면 생명을 잃는다"등이다.
[el6]
라벨의 뜻은'경원소'와'[ecnbi]/[ecnbr]
어떤 아이콘인지 확실하지 않습니다.이전의 예와 같이 3개 이상의 파라미터를 가진 장치가 없기 때문에 설명은 최종적으로
[el6] Heal: 24
💻 코드
이로써 우리는 이러한 표현식을 계산하기 위해 통용되는 방법을 작성할 수 있어야 한다.
내가 따르는 정책은 모든 조건 구조를 문자열 문자의javascript 조건 삼원 표현식으로 교환하는 것이다.
그래서
{[>2]?s:}
`${ stack > 2 ? 's' : '' }`
예:유사한 방식으로 나는 미리 매개 변수 값을 계산하고
[#1]
를`${ stack = value }`
따라서 되돌아오는 값이 값이 되고 창고 값이 업데이트됩니다.코드만 표시하는 것이 더 쉽다고 생각합니다.
일부 동작 ID는 매개 변수에 대해 다른 계산을 해야 하고, 심지어는Makabrafire 장치 자체에 대해 하드코딩을 해야 한다는 것을 알 수 있습니다
이gist는 parseEffect.js중araknomecha-scrapper 파일의 복사본입니다. 이 프로젝트는wakfu 데이터를 수집하여 Corvo Astral에 정보를 제공합니다. 이것은 제가 본고에서 처음에 언급한 디스코드bot
이것은test file, 그래서 당신은 이 해석 결과를 검사할 수 있습니다. 아마도 스스로 조정할 수 있을 것입니다
📜 결론
은(는) 검사actions.json의 모든 설명을 통해 실제로 각각의 사용자 정의 해석기를 만들 수 있습니다. 특히 앞에서 언급한 조건에 부합되지 않는 장치를 고려하지 않는 경우
그러나 이러한 인코딩의 논리를 이해하고 해석기를 실현하는 것은 도전이며 시간이 걸릴 것이다
이 글의 내용은 특정한 사람들을 대상으로 한 것으로 소수에게만 도움이 될 수 있지만 이것은 매우 멋진 지식 공유이다.D
0M1N0U5 포럼에서 발견한 것을 공유해 주셔서 감사합니다
Reference
이 문제에 관하여(Javascript로 Wakfu를 디코딩하는 동작 효과), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/heymarkkop/decoding-wakfu-s-action-effects-with-javascript-1nm2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)