Starbound moddingメモ

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

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

前回に引き続き、いよいよアビリティの編集です。

今回の記事で注射器銃はひとまず完成。

 

 

前回はこちら

yunyustarbound.hatenablog.com

 

武器ダメージのバランスは、バニラのアドベンチャー後半をベースにして書いていきます。

 

まずは基礎ダメージ値を設定しましょう。

"parameters">"primaryAbility"内に記載されている"baseDps"という値があります。

 

こちらをパラメータごと削除し、代わりに"baseDamage"を挿入します。

 

更に、同じ階層に存在する、"energyUsage"も変更します。

こちらはエネルギーの使用量ですが、デフォルトでは乱射するには高めの値になっている為、こちらを3に変えてみます。

 

次に、projectile(放射物)の挙動を変えていきましょう。

まず、先程と同階層内にある"projectileType"を変更します。このプロパティは一発毎の初弾として発射されるprojectileの種類を変える事が出来ます。

 

各projectileは、asset内のprojectilesフォルダに一つづつ独立したjson形式のファイル形式で格納されています。

 

デフォルトは"standardbullet"が設定されている為、銃を撃つごとにベーシックな銃弾が発射されます。

 

TF2の注射器銃の弾は、重力影響を受けて弧を描くように飛び、地面や壁に突き刺さったりしますが、Starboundでは弓のprojectileがちょうどこの挙動に近い為、今回は"ironarrow"を初弾のprojectileに設定します。

 

この状態で出力すると、projectileがstandardbulletからironarrowに変わっていることが確認できます。

 

次に、このprojectileに基本情報を盛り込んでいきましょう。

同じ階層の中に、"projectileParameters"というパラメータがあります。

f:id:yunyu_sb:20180225165020p:plain

 

このパラメータ内では、設定されたprojectileの威力・スピード・見た目・生存時間などの基本的な情報に加え、projectileが壊れた時に実行するアクションprojectileが定期的に実行するアクションprojectileが地形と衝突した時に行うアクションprojectileがエンティティに衝突した時のアクションなど、各タイミングに行うアクションを設定できます。

 

アクションの種類は

  • projectile (放射物)
  • particle (アニメーションや画像、テキストなど)
  • monster (モンスター。名前や見た目、挙動などのパラメータも変更可能)
  • sound (sfxフォルダやmusicフォルダ内の任意のoggを指定可能)

などがあり、任意のタイミングで任意のアクションを行うように設定が可能です。

個人的にはこのprojectileのコントロールがスターバウンドのjsonコーディングの中で一番自由度が高い部分でと思ってます。

 

 

今回はprojectileをコントロールして、元ネタ武器の

「敵に弾が当たった時、自分が回復する」という機能の再現を行っていきます。

 

初めから"knockbackRange"が挿入されてますが、使わないので消しましょう。

f:id:yunyu_sb:20180225170716p:plain

 

 

とりあえず"敵にヒットした時"という部分以外を先に完成させる為、以下の項目を書き込みましょう。

"power" : 10,

"speed" : 60,

"timeToLive" : 5,

"piercing" : false,

"processing" : ""

 

"power"はprojectileごと(ironarrowのみ)の威力、speedは60、timeToLiveは生存時間、piercingはエンティティ(プレイヤーやモンスター)を貫通するかどうかを示しています。

 

また"processing"は、Directivesコードを挿入することでprojectileの見た目を変更できます。今回は注射器の画像を使って見た目の変更をしてみましょう。

 

f:id:yunyu_sb:20180225172203p:plain

とりあえず描いたものがこちら。

 

これを武器画像の時と同様に、Drawable Generatorで読み込み、「Single Texture Directives」でDirectivesコードにします。

 

さて、これを直接貼り付けたいところです…が、仮にそれをやってしまうとこういう状態になります。

 

 

 弾が見えなくなってしまいました。

 これは、projectileの元画像よりも、差し替え後の画像のサイズが大きい事から、正常に色の置き換えが行えずにこのような現象が発生してしまっているという状態です。

 

そのため、画像差し替えを行う場合はDirectivesコードの前に、画像サイズを大きくするためのDirectivesコードを挿入しなければなりません。

 

それは"?scalenearest=数値"です。

 

これを画像のDirectivesコードの前に挿入します。数値の部分は、変更後の画像サイズに合わせて調整する必要があります。

 

今回の場合は、注射器の画像もまあまあ小さめなので、?scalenearest=2 (元画像のサイズを2倍)にしてみます。

f:id:yunyu_sb:20180225173540p:plain

 

無事注射器が発射されるようになりました。

 

それでは次に、「敵に弾が当たった時、自分が回復する」の部分を作っていきたいと思います。

 

まずはprojectileにタイミングアクションを設定する為のパラメータを追記します。

"actionOnHit" : [

],

 先程の"processing"にコンマを打ってない(=最後尾のパラメータである)為、後ろに追加するよりは前に追加した方がコンマの足し引きを考えなくていいのでややこしくないかもしれません。(私は見やすさ的にタイミング関係は最後尾に書くクセがあるのですが)

 

という事で"power"の前に書いてみました。

この"actionOnHit"は、敵エンティティに親projectileがヒットした時、[ ]内のアクションを実行するというタイミング設定です。

そのため今の書き方の場合はironarrowがヒットした時に[ ]内を実行するという風になってます。

 

それでは次に、実行してほしいアクションを書きます。

これはprojectileアクションの記述方式です。

どのアクションも"action" : "アクションの種類"の記述で種類が決定されます。

 

"type"はprojectileアクションを行う際のprojectileの種類を設定できます。

 

今回は"tentaclefist"を使います。このprojectileはエイリアン系の触手銃で使われているprojectileで、撃ったあとに持ち主の所に戻って来る特性を持ちます。

 

"config"は"projectileParameters"と同じく、"power","speed","timeToLive"や各種タイミング指定とアクションが挿入できます。"config"自体を書かなかった場合、デフォルトのprojectileの設定になります。

 

 

これで注射器が敵に当たった場合、tentaclefistが発生するという挙動ができました。

 

 

ただ、この状態で敵を撃った時に分かるように、現在の状態のtentaclefistでは生まれてから戻ってくるまでの時間が結構かかってしまっています。

 

この後の回復処理をすばやく発生させるために、tentaclefistがすぐに帰ってくるようにconfigを編集しましょう。

"speed" : 100,

"onlyHitTerrain" : true,

"movementSettings" : {"collsionEnabled" : false},

"returning" : true,

"returnOnHit" : true,

"controlForce" : 100000,

"pickupDistance" : 3,

"snapDistance" : 0,

"maxDistance" : 0,

"ignoreTerrain" : true,

"minVelocity" : 1,

"stickTime" : 0,

"actionOnReap" : [ ]

 

一気に結構書きました。

 新しいパラメータだけ説明を書いていきます。

 

  • "onlyHitTerrain"
    地形のみにヒットさせるかどうか(trueなのでエンティティにはヒットしなくなる)

  • "movementSettings"
    projectileの基本的な挙動(重力値・空気抵抗・コリジョンなど)を設定できる

  • "collsionEnabled" ("movementSettings"内)
    地形衝突を有効にするかどうか(falseなので地形に衝突しなくなる)

  • "returning" 戻って来る系projectileの専用パラメータ
    初めから戻ってる状態かどうか (trueなので生まれた瞬間から戻り始める)

  • "returnOnHit" 戻って来る系projectileの専用パラメータ
    敵にヒットしたら戻り始めるか (この場合ぶっちゃけ書かなくていい)

  • "controlForce" 戻って来る系projectileの専用パラメータ
    どのぐらいの力で戻って来る時の軌道を正確に制御するか

  • "pickupDistance" 戻って来る系projectileの専用パラメータ
    オーナーからどの位離れててもprojectileを戻りきった事にして消すか

  • "snapDistance" 戻って来る系projectileの専用パラメータ
    どの位の距離で折り返して戻り始めるか

  • "maxDistance" 戻って来る系projectileの専用パラメータ
    どの位の距離進むことが出来るか

  • "ignoreTerrain" 戻って来る系projectileの専用パラメータ
    地形を無視するか (trueなので地形を無視する)

  • "minVelocity" 戻って来る系projectileの専用パラメータ
    最小進行距離

  • "stickTime" 戻って来る系projectileの専用パラメータ
    戻る前に滞空してその場に留まり続けられる時間

こんな感じです。

戻ってくる系のprojectileは挙動を細かく設定できるので必然的に長くなっちゃいますね。

 

最後の"actionOnReap" : []"actionOnHitと同じくタイミング指定記述です。

"actionOnReap"はどんな原因であってもprojectileがワールドから消えた際、[ ]内にあるアクションを実行するというタイミング指定です。

 

 現在の状態でゲーム内で確認すると、初弾の注射器が敵に当たった時、tentaclefistが出現し、真っ先に帰ってきて消えるという挙動になっていると思います。

 

次は"actionOnReap"に回復用のprojectileを設定し、tentaclefistが消えた時にその場所に回復ゾーンを展開するという挙動を追加します。

 

と、その前に

tentaclefistは問題なく帰って来るように設定できたので、"processing"を使って、tentaclefistを透明化します。

 

"processing" : "?scalenearest=0",

を追記します。

 

 これでtentaclefistの大きさが0になったため、tentaclefistは見えなくなりました。

 

それでは"actionOnReap"の中身を追加していきます。

{

    "action" : "projectile",

    "type" : "healingzone",

    "config" : {

    }

}

 

projectileアクションの"healingzone"を設定しました。

healingzoneは、杖のアビリティに設定されているヒール領域を出現させるprojectileです。

 

敵を撃って試してみましょう。

 

 

敵を撃つと即座に自分の位置にヒール領域が展開されます。

ただ、今のままだとグラフィックが邪魔なのと生存時間が長すぎる為、configで調整を行います。

"timeToLive": 0.1,

"persistentAudio" : "/assetMissing.wav",

"processing" : "?scalenearest=0"

 

"timeToLive"を0.1に設定することで重複しすぎていたのを解消、"persistentAudio"をasset直下に存在する無音のwavファイルを指定することでヒール領域の音を消し、"processing"でグラフィックを消しました。

 

余分なサウンドや表示が消え、ステータスエフェクトのみが適用されるようになりました。これで注射器がヒットしたらHPを吸収する機能の再現は完了です。

 

ただ、"healingzone"の仕様上どうしても敵と味方の両方に作用してしまう為、

敵と隣接した状態で撃つと敵も回復してしまいます…

 

こればかりはバニラのパラメータを使用してアイテムを製作するというカスタムアイテムにおいてはどうしても難しいです。

 

でも銃って離れて使うものだから…問題ないよね…?

 

 

これでほとんど完成なんですが、使ってないアクションの紹介がてら、もうひとつ簡単な機能を足したいと思います。

元ネタのTF2でヒット音の設定をONにしている時に鳴る、独特なベルの音を再現します。

 

"tentaclefist"が生成されるのと同じタイミングの"actionOnHit"内にアクションを追加します。

{

    "action" : "loop",

    "count" : 2,

    "body" : [

    ]

},

 

 この"loop"というアクションは、"count"で指定されている量に応じて、"body"内のアクションを同時に実行するというものです。

 

"sound"アクションで音を鳴らす際、単一ではボリュームをコントロールするパラメータが無い為、この"loop"というアクションを使う事で、疑似的に音量を増やすことが出来ます。

 

それでは"body"の中に"sound"アクションを挿入します。

{

    "action" : "sound",

    "options" : ["/sfx/objects/alarmbell_stop.ogg"]

}

 

このサウンドファイルは、objects(家具)で使われているベルの音です。

ゲーム内で確認を行い、敵に攻撃がヒットした瞬間にベルの音が鳴っていれば完了です。

 

 

4回に分けて記事を書いてきましたが、これにてひとまずピストルのカスタムアイテム製作は終了です。

 

ここで紹介したパラメータ以外でも、stanceやparticleEmittersなど書ききれなかったものもありましたが、また紹介する機会があればそちらも書いていきたいと思います…

(ただアイテムを作りながら記事を書いていくのが思ってたよりハードだったので次こういう記事を書くのは間が空くと思います…)

 

 

 

今回完成したjsonファイルはこちらでダウンロードできます。

作るのは大変そうだけど、カスタムアイテムは使ってみたいという方もぜひどうぞ。

custompistoltest_chapter4.json - Google ドライブ