Javascript로 Wakfu를 디코딩하는 동작 효과

23853 단어 javascriptwakfu
안녕하세요.
오늘은 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] * level22 + 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.jsaraknomecha-scrapper 파일의 복사본입니다. 이 프로젝트는wakfu 데이터를 수집하여 Corvo Astral에 정보를 제공합니다. 이것은 제가 본고에서 처음에 언급한 디스코드bot


이것은test file, 그래서 당신은 이 해석 결과를 검사할 수 있습니다. 아마도 스스로 조정할 수 있을 것입니다


📜 결론


은(는) 검사actions.json의 모든 설명을 통해 실제로 각각의 사용자 정의 해석기를 만들 수 있습니다. 특히 앞에서 언급한 조건에 부합되지 않는 장치를 고려하지 않는 경우

그러나 이러한 인코딩의 논리를 이해하고 해석기를 실현하는 것은 도전이며 시간이 걸릴 것이다

이 글의 내용은 특정한 사람들을 대상으로 한 것으로 소수에게만 도움이 될 수 있지만 이것은 매우 멋진 지식 공유이다.D


0M1N0U5 포럼에서 발견한 것을 공유해 주셔서 감사합니다

좋은 웹페이지 즐겨찾기