Starbound moddingメモ

starboundのマルチプレイ対応moddingのあれこれについての備忘録

カスタム武器を作る-ピストル編①

jsonコーディングでカスタム武器を作っていくまでの過程を書いていこうと思います。長くなるので複数の記事にわたって分けていく予定です。

 

今回は製作に必要なアプリケーション一式の紹介と共にアセットファイルから武器の叩き台(テンプレート)となるjsonファイルを作っていこうと思います。

 

 

■必要なモノ

 

資料として使う為、Assetのunpackも必須です。

 

jsonアイテムをセーブデータに輸入するにあたって、セーブデータのバックアップを取っておくことをお勧めします。(念のため)詳しくは以下の記事を参照してください。

yunyustarbound.hatenablog.com

 

 

それでは製作の手順を順を追って紹介していきます。

 

今回作るモノはこちら

 

www.youtube.com

 

Team Fortress 2」 というゲームの武器「ブルートザオガー」の再現武器を作っていこうと思います。

 

この武器の仕様で、スタバで再現したい事は

 

  • 武器の見た目/発射音
  • 重力に引っ張られる注射器のprojectile(放射物)
  • projectileが敵にヒットした際にHPを吸収する機能
  • ヒットした際のティコーン音(TF2のヒット音有りにしたときのやつ)

 

という感じ。このあたりは再現できるように作っていこうと思います。

 

 

今回やる内容が結構長くて初めてjsonを触る方には若干複雑なので、最終手段として今日書く内容を全て終わらせたjsonファイルを置いておきます。

custompistoltest.json - Google ドライブ

 

そのまま使ってもらってもいいんですが、これから色んなカスタムアイテムを自作していきたい方はjsonの書き方やスタバのカスタムアイテムの知識が必要になってくるのでまずは以下の手順を一通りやってみる事をおすすめします。

 

 

それでは早速、武器の叩き台を作っていきましょう。

 

この武器はプライマリーファイアのみが有効な為、今回はcommonpistolを元武器として使います。(rarepistolとかironrevolverでもさほどやる事に違いは無いです)

commonpistolは、スターバウンドにおける無名武器(common,uncommon,rareグレード)の武器群で、ランダムに攻撃力や名前、見た目が出力される武器種のひとつです。

 

「commonpistol」のキーワードでunpackされたアセットフォルダ内で検索を掛けます。

はい。見つかりました。

 

この「activeitem」ファイルというのが、Starboundの各アイテムのパラメータをjson形式で格納しているconfigファイルとなります。

 

とりあえずこのファイルをnotepad ++で開いてみましょう。

 

こんな感じで、パラメータがブワーッと出てきました。

これらのパラメータが、この武器で変更可能なほぼ全ての項目があらかじめ書かれているものとなります。(厳密にいうと違うのですが今はそんな感じの認識でいいと思います)

 

とりあえずassetファイルを直接編集するのはご法度なため、npp+(notepad++)でファイルを新規作成します。

 

asset内のアイテムconfigファイルを武器のjsonファイルとして出力する際にはひとつ重要なルールがある為、先にそれを手打ちで書いちゃいましょう。

 

こんな感じです。

countは出力するアイテムの量で、nameはitemNameと一緒です。

parametersの先にactiveitemファイルの全コンテンツが格納されます。

 

それではこの"parameters": の先にactiveitemファイルの全ての内容をコピペします。

 

こうなりました。

 

そしてこのファイルを<武器名>.jsonとして保存します。

とりあえず私はcustompistoltest.jsonとして保存しました。保存先に関しては、assetフォルダ内に入れちゃうとゴチャゴチャしてくるのでデスクトップとかカスタムアイテムのjson専用フォルダをどこかに作ってそこにストックしていくといいと思います。

 

余談ですがjsonで保存すると、各パラメータがjsonフォーマットに従って色分けされます。便利ですね。

 

さて、先程このファイルにはすべてのパラメータが記述されたものと書きましたが、実はまだ不十分な点があります。というのも、activeitemファイルにおいても、他のconfigファイルから内容を読み込む(ファイルパスを指定する)ことによって内容の記述を省略している部分があるためです。

 

なので次は省略部分をこのコードに反映させたいと思います。

 

まずその省略部分とは、こいつの事です。

(私と同じ書き方をしていれば)17行目で指定されている「gun.animation」。

このファイルは銃の見た目とmuzzleflash(打った時の銃口の光)の画像を管理しているconfigファイルです。

 

それでは再びファイル名でasset内の検索を掛けます。

 

ありました。

 

これをnpp+で開きます。

 

 

またjsonの記述がババーっと書かれてます。

それでは次にこの内容を新規保存した武器のjsonファイルへと統合(コピペ)したいと思います。

 

貼り付け先はjsonファイル19行目の"animationCustom"です。

ただここで気を付けてほしい点があります。

それは、このままanimationファイルを全選択して"animationCustom"の{ }内に貼り付けを行った場合、{ }がダブっておりjsonの構文エラーが起るという事です。

 

 

そのため、あらかじめ間違いの無いよう"animationCustom"の{ }を消し、その後思考停止で全選択コピペできるようにしておきます。

 

"animationCustom"の{ }を消しました。

ではこの : と , の間({ }があった位置)にanimationファイルの全内容をベシっと貼り付けます。

 

貼り付けた状態。

インデントが汚いですが気にしない。気になる方はjson成型サービスで直すといいと思います。

 

次にゲーム内に取り込む前に不要な記述を削除します。

45行目、53行目、61行目の末尾に記載されているコレ

たぶんコメント的に挿入されてるんだとは思いますが、//の記述はjsonファイルとして間違ってる為、このままではエラーが出て出力できません。

 

なので消します。

3箇所ともこんな感じになればOKです。

 

 

それではいよいよゲーム内で確認です!

 

作り終わったjsonファイルをゲーム内でチャット欄に打ち込めるspawnitemコマンドに変換します。

 

  1. まずDescriptor to Commandにアクセスします

  2. jsonファイルの内容を全選択し、コピーします


  3. DescriptorToCommandページの上のボックス内に貼り付けます

    (改行されまくってるので分かりづらいですが、すべてコピペした状態です)



  4. ページの下の方にあるGenerate Text Commandを押します
    f:id:yunyu_sb:20180224095456p:plain

  5. Outputにspawnitemコードが出力されるので、Copy to Clipboardでコピーします


  6. スタバを起動し、チャット欄に"/admin"と打ち込み、管理者権限を付与します

     

  7. コピーしておいたspawnitemコマンドを貼り付けて発言します

 

 

 

 

 

 

f:id:yunyu_sb:20180224103549p:plain

はい。(白目)

f:id:yunyu_sb:20180224103634p:plain

 

武器アイテムどころか、家具カテゴリのパーフェクトジェネリックアイテムが生成されてしまいました。

実はこれ、jsonファイルとしては正しいのですが、スターバウンドの武器アイテムとして間違ったパラメータが入っている事からエラーが発生し、パーフェクトジェネリックアイテムに強制的に置き換えられてしまっています。

 

 

カスタムアイテム製作のはじめたての頃はこれを5億回はやるので、とりあえずここから何が間違っているのかを解決するための方法をご紹介したいと思います。

 

  1. まずエラーログに出力する為、エラーアイテムを拾ってください
  2. Steam版なら、\Steam\steamapps\common\Starboundを開きます
  3. storageフォルダを開き、中にあるStarbound.logを開きます

     

  4. 最終行あたりを確認するとアイテムに関するログが出ている事がわかります

    f:id:yunyu_sb:20180224104528p:plain

 

横に長いので、右にスクロールしていくとこんな事が書いてあります。

 

attempt to perform arithmetic on a table value (local 'baseDps')

 

ざっくり翻訳すると、カスタムアイテム内で記述されているbaseDpsの書き方おかしいっすって感じです。

 

実は、今回素材として使っているcommonpistolは、冒頭で軽く触れたとおりモノによって武器の攻撃力やファイアレートなどがランダムに適用される仕組みがあります

 

そのためactiveitemファイルにおいてもfireTime,baseDps,energyUsageのそれぞれの値がランダム範囲を示す書き方になってます。

 

カスタムアイテムはパラメータを決定した状態で書かなければいけない為、今回はこの記述方法がエラーとして引っかかった事になります。

 

jsonファイルの130行目~132行目を見てみると、このようになっています。

 

ここは"primaryAbility"内の設定項目で、文字通り左クリック時のアビリティの設定がされている箇所になります。

 

このfireTime,baseDps,energyUsageを単一の数字に戻してあげましょう。

武器を本格的に作っていくときに変えればいい話なので、適当に一番大きい値で直してみました。

 

それでは再びDescriptor to Commandを使用して、アイテムを呼び出してみます。

 

 

ピストルが出力されれば成功です。

見た目もランダム部分のパラメータを弄ってないので出力するごとに見た目が変わりますが、カスタムアイテムの叩き台としてはこれで完成です。

 

 

 

色々アイテムを作っていくならこれまでの作業を省略する為に、今回作ったカスタムアイテムのjsonをテンプレートとして別名保存しておくと楽だと思います。

 

 

それでは今回書いた記事の内容の中で、大切なことを改めてまとめて終わりたいと思います。

 

  1. activeitemファイルに武器グラと音を除くすべてのパラメータが格納されている

  2. activeitemファイル内で指定されているanimationファイルをanimationCustomに記述することで完全なパラメータが開示された状態になる

  3. activeitemファイルからカスタムアイテムのjsonにする時は、"count","name","parameters"の記述追加を忘れずに

  4. ゲーム内に実装した時にパフェジェネになる時はStarbound.logを見てヒントを探る

 

それでは次回は今回作った叩き台を基に、いよいよ注射器銃を作っていきたいと思います。