原神が好きなので原神でプログラミングの勉強をする その2

前回の続きです。

環境を構築しよう

今回動かしたいgenshin-dbを使うには、解説ページによるとNode v12とnpmのインストールが必要と書いてあります。
まずは用語解説から。

Node(Node.js)

JavaScriptを動かすマシンのようなものです。

もともとJavascriptはWebサイト(HTML)を(視覚的に)動かすために生まれました。ただのHTMLでは動きのある表示はできませんが、JavaScriptを使うと、ボタンを押すと文字が変わったり、Webサイト上に1秒ごとに動く時計を置いたりできるようになります。

これがあまりにも便利だということでありとあらゆるWebサイトで使われるようになった結果、Webサイト以外でも使えたら便利じゃない?ということで生まれたのがNode.jsです。

Node.jsを使ってjavascriptを動かすことで、ブラウザを必要とせず、コマンドでJavascriptを扱えるようになっています。

npm (Node Package Manager)

Node.jsにくっついているパッケージマネージャーです。
iOSに入っているAppStoreやAndroidに入っているPlayStoreのような感じ。
今回使うgenshin-dbもnpm上で公開されています。

今回はこれだけあれば動かすことができるので、実質Node.jsだけインストールすれば大丈夫ですね。

Node.jsのインストール方法ですが、Windowsであれば公式サイトからダウンロードしてインストールしてもよいですし、wingetでもインストールが可能です。wingetはかなり便利なので使えるようにしておくとよいですね。

Windows11なら標準で使えますし、Windows10でも勝手に使えるようになっていることが多いですが、使えない場合は下記からアプリ インストーラーをインストールすれば使えるようになります。

wingetでNodeをインストールするにはコマンドプロンプトかPoweshellにて下記コマンドを打つだけ。

winget install OpenJS.NodeJS

PowerShellはWindowsのアイコンを右クリックして出てくるメニューから開けますよ。

インストール後にnode -vと打ってバージョンが表示されればOKです。
同様にnpm -vと打つとnpmも使えるようになっているはず。

PS C:\> node -v
v18.7.0
PS C:\> npm -v
8.15.0

これで準備は完了です。

genshin-dbをインストールしよう

では早速genshin-dbを入れてみたいと思います。

PS C:\Users\namae> cd ~
PS C:\Users\namae> npm install genshin-db

added 3 packages, and audited 5 packages in 4s

found 0 vulnerabilities

念のためユーザーディレクトリに移動するcd ~を実行してから、npm install genshin-dbを実行してインストールします。

これで完了です。

genshin-dbを使ってみよう

nodeを実行して、「const genshindb = require('genshin-db');」とコマンドを打ちます。

PS C:\Users\namae> node
Welcome to Node.js v18.7.0.
Type ".help" for more information.
> const genshindb = require('genshin-db');
undefined

今回はコマンドの意味とかはおいておいて、まず使ってみましょう。

まずは検索と結果が日本語でできるようにします。

genshindb.setOptions({queryLanguages: ['Japanese'], resultLanguage: 'Japanese'})

では早速検索してみましょう。

説明を見ると検索に使えるコマンドはこのようなものがあるようです。
試しに一番上にあるキャラクターのコマンドを使ってみましょう。

キャラクター情報を見てみる

「胡桃」で検索してみます。

> genshindb.characters('胡桃')
{
  name'胡桃',
  fullname'胡桃',
  title'雪晴梅香',
  description'「往生堂」七十七代目堂主、若くして璃月の葬儀を仕切り、責任を持ってそれを執り行っている。',
  rarity'5',
  element'炎',
  weapontype'長柄武器',
  substat'会心ダメージ',
  gender'女',
  body'GIRL',
  association'LIYUE',
  region'璃月',
  affiliation'往生堂',
  birthdaymmdd'7/15',
  birthday'7月15日',
  constellation'彼岸蝶座',
  cv: {
    english'Brianna Knickerbocker',
    chinese'陶典',
    japanese'高橋李依',
    korean'김하루'
  },
  costs: {
    ascend1: [ [Object], [Object], [Object], [Object] ],
    ascend2: [ [Object], [Object], [Object], [Object], [Object] ],
    ascend3: [ [Object], [Object], [Object], [Object], [Object] ],
    ascend4: [ [Object], [Object], [Object], [Object], [Object] ],
    ascend5: [ [Object], [Object], [Object], [Object], [Object] ],
    ascend6: [ [Object], [Object], [Object], [Object], [Object] ]
  },
  images: {
    card'https://static.wikia.nocookie.net/gensin-impact/images/2/22/Character_Hu_Tao_Card.jpg',
    portrait'https://static.wikia.nocookie.net/gensin-impact/images/5/50/Character_Hu_Tao_Portrait.png',
    icon'https://upload-os-bbs.mihoyo.com/game_record/genshin/character_icon/UI_AvatarIcon_Hutao.png',
    sideicon'https://upload-os-bbs.mihoyo.com/game_record/genshin/character_side_icon/UI_AvatarIcon_Side_Hutao.png',
    cover1'https://webstatic.hoyoverse.com/upload/uploadstatic/contentweb/20210224/2021022411345864283.png',
    cover2'https://webstatic.hoyoverse.com/upload/uploadstatic/contentweb/20210224/2021022411361082980.png',
    'hoyolab-avatar''https://img-os-static.hoyolab.com/communityWeb/upload/e160b5fac097d628f5b2227fd507373b.png',
    nameicon'UI_AvatarIcon_Hutao',
    nameiconcard'UI_AvatarIcon_Hutao_Card',
    namegachasplash'UI_Gacha_AvatarImg_Hutao',
    namegachaslice'UI_Gacha_AvatarIcon_Hutao',
    namesideicon'UI_AvatarIcon_Side_Hutao'
  },
  url: { fandom'https://genshin-impact.fandom.com/wiki/Hu_Tao' },
  stats: [Function (anonymous)],
  version'1.3'
}

いろいろな情報が出てきました。
とりあえずすぐ見えるところでは武器の種類とか誕生日とか声優とかがわかりますね。

ただcostsと書かれてるところには[Object]となっていてなんのデータが入ってるのかわかりません。
これは表示上こうなっているだけなので、個別の情報を見ると表示されます。

> genshindb.characters('胡桃').costs
{
  ascend1: [
    { name'モラ'count20000 },
    { name'炎願のアゲート·砕屑'count1 },
    { name'霓裳花'count3 },
    { name'トリックフラワーの蜜'count3 }
  ],
  ascend2: [
    { name'モラ'count40000 },
    { name'炎願のアゲート·欠片'count3 },
    { name'未熟の玉石'count2 },
    { name'霓裳花'count10 },
    { name'トリックフラワーの蜜'count15 }
  ],
  ascend3: [
    { name'モラ'count60000 },
    { name'炎願のアゲート·欠片'count6 },
    { name'未熟の玉石'count4 },
    { name'霓裳花'count20 },
    { name'微光花の蜜'count12 }
  ],
  ascend4: [
    { name'モラ'count80000 },
    { name'炎願のアゲート·塊'count3 },
    { name'未熟の玉石'count8 },
    { name'霓裳花'count30 },
    { name'微光花の蜜'count18 }
  ],
  ascend5: [
    { name'モラ'count100000 },
    { name'炎願のアゲート·塊'count6 },
    { name'未熟の玉石'count12 },
    { name'霓裳花'count45 },
    { name'原素花の蜜'count12 }
  ],
  ascend6: [
    { name'モラ'count120000 },
    { name'炎願のアゲート'count6 },
    { name'未熟の玉石'count20 },
    { name'霓裳花'count60 },
    { name'原素花の蜜'count24 }
  ]
}

[Object]の中身には{ name: 'モラ', count: 20000 }などの情報が入っていたのがわかりますね。
英語知識が0なのでascendの意味は分かりませんが、1~6まであるところを見るとレベル上限の開放のことを言ってるようですね。

ほかにはstatsの部分も[Function (anonymous)]となっていて中身が見えていません。
ですがこちらは先ほどのObjectとは異なりFunction(関数)のため、適切な引数を用意する必要があります。

マニュアルを見ると、レベルを入力することでstats(日本語で言うステータス)を見ることができるようです。試しにレベル90のステータスを見てみます。

> genshindb.characters('胡桃').stats(90)
{
  level90,
  ascension6,
  hp15552.307232559891,
  attack106.43438284689182,
  defense876.1519925053435,
  specialized0.8840000033378601
}

レベル80や60のような上限突破をしている状態とそうでない状態があるレベルの際は、レベルに加えて'+'の引数を与えてあげると突破済みのステータスになるようです。

> genshindb.characters('胡桃').stats(80)
{
  level80,
  ascension5,
  hp13721.446858335694,
  attack93.9047114922596,
  defense773.0087762532967,
  specialized0.7879999876022339
}
> genshindb.characters('胡桃').stats(80,"+")
{
  level80,
  ascension6,
  hp14459.029866148194,
  attack98.95221210261116,
  defense814.5617700277107,
  specialized0.8840000033378601
}

スキル情報を見てみる

同様に胡桃のスキル(talent)も見てみます。

> genshindb.talents('胡桃')
{
  name'胡桃',
  combat1: {
    name'通常攻撃·往生秘伝槍法',
    info'**通常攻撃**\n' +
      '槍による最大6段の連続攻撃を行う。\n' +
      '\n' +
      '**重撃**\n' +
      '一定のスタミナを消費して前方に突進し、経路上の敵にダメージを与える。\n' +
      '\n' +
      '**落下攻撃**\n' +
      '空中から落下し地面に衝撃を与える。経路上の敵を攻撃し、落下時に範囲ダメージを与える。',
    attributes: { labels: [Array], parameters: [Object] }
  },
  combat2: {
    name'蝶導来世',
    info'燃え続ける炎のみが、この世の不浄を払うことができる。\n' +
      '一定のHPを消費して、周囲の敵をノックバックし、冥蝶の舞状態に入る。\n' +
      '\n' +
      '**冥蝶の舞**\n' +
      '·胡桃のHP上限を基準に攻撃力がアップする。この効果でアップできる攻撃力の最大値は、胡桃の基礎攻撃力の400%まで。\n' +
      '·攻撃ダメージは炎元素ダメージとなり、元素付与によって他の元素に変化することはない。\n' +
      '·重撃は敵に血梅香効果を与える。\n' +
      '·胡桃の中断耐性がアップする。\n' +
      '\n' +
      '**血梅香**\n' +
      '血梅香状態の敵は、4秒毎に1度、炎元素ダメージを受ける。このダメージは元素スキルダメージと見なされる。\n' +
      '同一ターゲットに付与される血梅香効果は同時に最大1つまで。また、血梅香効果の継続時間は効果を付与した胡桃のみが更新可能。\n' +
      '\n' +
      '**冥蝶の舞**は継続時間終了時、または胡桃の退場や戦闘不能時に解除される。',
    description'胡桃が学んだ秘伝の槍法、その教えの一句目は「槍よ切り開け黄泉の道、蝶よ引き寄せ来世の橋。」',
    attributes: { labels: [Array], parameters: [Object] }
  },
  combat3: {
    name'安神秘法',
    info'灼熱の魂を振り回し、広範囲に炎元素ダメージを与える。\n' +
      '敵に命中した時、胡桃のHP上限を基準に自身のHPが回復する。この効果は命中した敵1体毎に発動し、最大で5体まで効果が発 動する。\n' +
      '胡桃のHPが50%以下の時、より高いダメージと回復効果を持つ。',
    description'既にこの世を去った者がまだ元気そうにしていると、往生堂は焦燥や不安に駆られる。火葬は胡桃の心を一番落ち着かせることができる手段である。そのため、彼女は焦燥すればするほど、火力が上昇する。',
    attributes: { labels: [Array], parameters: [Object] }
  },
  passive1: {
    name'蝶隠の時',
    info'**蝶導来世**による**冥蝶の舞**状態終了後、チーム全員(胡桃自身を除く)の会心率+12%、継続時間8秒。'
  },
  passive2: { name'血のかまど'info'胡桃のHPが50%以下の時、炎元素ダメージ+33%。' },
  passive3: { name'多々益善'info'料理を完璧調理した時、18%の確率で「微妙な」品質の同一料理を獲得する。' },
  costs: {
    lvl2: [ [Object], [Object], [Object] ],
    lvl3: [ [Object], [Object], [Object] ],
    lvl4: [ [Object], [Object], [Object] ],
    lvl5: [ [Object], [Object], [Object] ],
    lvl6: [ [Object], [Object], [Object] ],
    lvl7: [ [Object], [Object], [Object], [Object] ],
    lvl8: [ [Object], [Object], [Object], [Object] ],
    lvl9: [ [Object], [Object], [Object], [Object] ],
    lvl10: [ [Object], [Object], [Object], [Object], [Object] ]
  },
  images: {
    combat1'Skill_A_03',
    combat2'Skill_S_Hutao_01',
    combat3'Skill_E_Hutao_01_HD',
    passive1'UI_Talent_S_Hutao_05',
    passive2'UI_Talent_S_Hutao_06',
    passive3'UI_Talent_Cook_ExtraFailedItem'
  },
  version'1.3'
}

試しに元素スキル(combat2)の詳細を見てみます。

> genshindb.talents('胡桃').combat2.attributes
{
  labels: [
    'スキル消費|{param1:P}現在HP',
    '攻撃力アップ|{param2:F2P}HP上限',
    '血梅香ダメージ|{param3:P}',
    '血梅香継続時間|{param4:F1}秒',
    '継続時間|{param5:F1}秒',
    'クールタイム|{param6:F1}秒'
  ],
  parameters: {
    param1: [
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896,
      0.30000001192092896
    ],
    param2: [
      0.0384100005030632,
      0.040709998458623886,
      0.04301000013947487,
      0.04600000008940697,
      0.04830000177025795,
      0.050599999725818634,
      0.05358999967575073,
      0.05657999962568283,
      0.05956999957561493,
      0.06255999952554703,
      0.06554999947547913,
      0.06853999942541122,
      0.07152999937534332,
      0.07451999932527542,
      0.07750999927520752
    ],
    param3: [
      0.63999998569488530.6880000233650208,
      0.7360000014305115,  0.800000011920929,
      0.84799998998641970.8960000276565552,
      0.95999997854232791.0240000486373901,
      1.08800005912780761.1519999504089355,
       1.2159999608993531.2799999713897705,
      1.3600000143051147,  1.440000057220459,
      1.5199999809265137
    ],
    param4: [
      888888,
      888888,
      888
    ],
    param5: [
      999999,
      999999,
      999
    ],
    param6: [
      161616161616,
      161616161616,
      161616
    ],
    param7: [
      444444,
      444444,
      444
    ]
  }
}

今回はここまで。

次回はこれらのデータを使って自作のプログラムを作ってみたいと思います。

この記事が気に入ったらサポートをしてみませんか?