デコードWakfuのアクションエフェクトをJavaScript


こんにちは!
今日私はMMORPGのスペルの効果からいくつかの文字列論理テンプレートをデコードする方法を共有したい.

🤖 文脈


私は開発中ですDiscord Bot これは与えられたwakfu装置からデータを取得する.幸いなことに、必要な情報のほとんどは利用可能ないくつかのエンドポイントは、この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"
  }
}
The [#1] コードは、機体動作の定義から最初のパラメータを使うように言います.ただし、パラメータはペアになります.この場合、1番目のパラメータは固定値で、レベルに応じた値をとります.params[0] + params[1] * level22 + 0*18 . So [#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] and [#3] , でも[~3] and [>2] 同様に.
それを見て、形式でいくつかの条件式を識別することができます{<condition>?<valueIfTrue>:<else>} .
明らかに、式{[>2]?s:} 何かが2より高いとき、語に複数を与えることはありますか.
同じ論理を使用して、式全体が印刷する条件をチェックします[#1] Mastery [#3] or [#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であるかどうかを調べます.
機器のparamsをチェックすることで、2つの引数(4つの値)があることがわかりますelse 値.
クール、今我々はこの{[=2]?:s} 他の言語が使うので、どれがバグであるでしょうか{[>2]?s:} .
ここの鍵は[>2] conditionは最後に評価されたパラメータを参照します.
このように{[>2]?s:} 私たちは[#2] が2より大きい(または英語の説明で行く場合は等しい).
ここでは、スペイン式をJavaScriptコードに変換する方法を示します.
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ここで奇妙なのは、3つ以上の引数を持つ機器が何かを持っていることです30 Dominio1 説明として.しかし、この条件を満たす装置は一つもない.
これまでのところ、良い.

🐲 例:ボス



さて、上司の例を確認できます.」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]:}:}"
  }
},
これはクレイジーに見えるかもしれませんが、私たちはそれを解決するために必要なすべての情報を持っています.
基本的に次のように読みます.
つの引数があるならば、3つ以上の議論があるならば、それはHPのパーセンテージを癒やします.The [el6] タグは「軽元素」を意味する[ecnbi]/[ecnbr] 私が何であるかについてわからない若干のアイコン.
前の例として、3つ以上の引数を持つ機器がないので、説明は終わります[el6] Heal: 24

💻 暗号


今までのところ、これらの式を評価する一般的な方法をコード化できます.
私が続けた戦略は、すべての条件構造をJavaScriptの状態に文字列リテラル内の三項式に交換することでした.
So {[>2]?s:} なる
`${ stack > 2 ? 's' : '' }`
例えば.
同様に、パラメータ値とスワップを事前に計算します[#1] to
`${ stack = value }`
返り値が値になり、スタック値が更新されます.
コードを見るのは簡単だと思います.
< div >
< p >いくつかのアクションIDでは、そのパレメータに対して異なる計算が必要になります.p >
このGISTは1980年代からのレプリカですparseEffect.js ファイルaraknomecha-scrapper , WakeUデータを収集し、情報を提供するプロジェクトCorvo Astral , 私がこの記事の冒頭で言及した不協和音p >
ここではtest file それで、あなたはこの構文解析の結果をチェックすることができて、多分それをあなた自身で微調整することができますp >

📜 結論


すべての説明をチェックすることでactions.json , 私たちは実際にそれらのそれぞれのためにカスタムパーサーを作成することができました、特に、私たちがアカウントを考慮しないならば、装置が全く以前に与えられた条件に落ちないケースをbr/>
しかし、論理を理解して、これらの要約のためにパーサーを実装することは、時間の価値があるのに十分に挑戦的でしたbr/>
この投稿コンテンツは、先ほどの特定され、ほんの数人の人々を助けるかもしれないが、それは共有するクールな知識ですD


彼らがフォーラムで発見したものを共有するために0 m 1 n 0 u 5に大きい感謝!p >