帝国界日報

多岐にわたるゲームのプレイ日記を主体としてます。 ロードラよ、永遠なれ。

自作効果作成まとめ(パッシブスキル編)

Library of Ruinaにて、専用ツールを用いて自作のバトルページやコアページを製作できるようになっています。
その中で「自作であらゆる効果を作って実装したい」人向けのまとめ記事です。
※筆者はc#の知識は一切ありません。デコンパイラしたコードを見ながら動作内容を理解しているようなものです。ご注意くださいませ…。

注意事項

・筆者はc#の知識は一切ありません。専用用語の解説はできませんのであらかじめご了承ください。
・記事現在のバージョンは「1.1.0.6a7」のものです。
・公式Mod利用ツールの導入マニュアルはSteam内パッチノートにて存在しています。あらかじめそちらをご覧ください。
・今現在「近接」と「遠距離」のページのみ作成できるようです。「装着時発動」や「広域」は作成できないようです。
・生存中の味方及び敵を参照するコードを利用してパッシブやページアビリティを作成しても動作しない不具合(?)があるようです。(例:[戦闘開始]味方全員の体力をX回復)
・Mod内で作成したページIDを用いてコアページ固有のバトルページ(固有E.G.O等)を追加するコードは動作しないようです。(もともと存在しているページIDを追加する分には問題ない模様)IDを参照する方法を知っている方がいらっしゃるならば情報提供をお願いいたします…。(既存パッシブでは赤い霧、シャオ、「四卦」、紫の涙など)

パッシブスキルを作成する

自作パッシブスキルを作成する流れは以下の通りです。
1.visualstudioなどでプログラムを組む
2.作成したdllファイルをModを作成するディレクトリ内にある「Assemblies」に突っ込む
3.Mod作成ツールを起動し、フォルダを読み込む。パッシブ追加場所から作成する。
が基本の流れです。ここではプログラムを組むところでの解説を行います。

パッシブスキルを作成する前に

真っ白な状態でいざ作成…は無理です。
どのように作りたいか、攻略Wikiを見ながら考えてみましょう。(攻略Wiki
Library Of Ruina 攻略 Wiki | Fandom)

簡単なのが「幕の開始時、パワー1を得る」や「攻撃的中時、体力を2回復する」といったところでしょうか。
また、dnSpyなどデコンパイラソフトを利用してdllファイルを覗けるものがあるととても楽に理解できます。また、デフォルトのパッシブスキルはすべてID数字で管理されているので、攻略Wikiとデコンパイラソフトはセットで使うと良いです。

プログラムを記述する前に

初めに「using」で必要となるものを記述します。(ライブラリを使用するという意味合い…だと思います。とりあえずこれは必須事項。)
新規作成した際、「using system;」が記述されています。
参考とするパッシブスキル等を見た際、usingが2つ以上あるならば、それらを付け加えておくことを忘れずに。
※ダイスの最小値、最大値を増減させるものなどで「using LOR_DiceSystem;」が記述されています。

よく使われるコード

では実際に作ってみましょう。
まず最初に「public class PassiveAbility_(パッシブスキル名※何でもよい。Mod作成ツール内のスクリプト選択でこの名前が表示されます):PassiveAbilityBase」を入力しましょう。
この時入力予測で目的のものが表示されたらtabキーで挿入すると楽です。
そのあと中かっこ「{}」を入力し、そのかっこ内にプログラムを組んでいきます。
よく使われるものは以下の通りです。(すべてpublic override void ○○という形で記述されます。なお、すべて「発動するタイミング」です。)

・「OnRoundStart()」:幕の開始時
・「OnWaveStart()」:舞台開始時
・「BeforeRollDice(…)」:ダイスを振る前(主に威力増減や最小値・最大値増減に使用。)
・「OnSucceedAttack(…)」:攻撃的中時
・「OnLevelUpEmotion()」:感情レベルが上昇したとき
また
・「public override bool IsImmue(...)」:状態異常の無効化
も使用できます。ただし、一つのクラス(パッシブスキル)につき1つまでしか指定できない模様。

tabキーで挿入した際、中かっこの中に「base.○○;」が挿入されますが、スルーで大丈夫です。一応消さないように。

実際にパッシブスキルを作成する

ここからは実際に例を用いて紹介していきます。

初級編:「攻撃的中時に回復するパッシブスキルを作成する」

例:攻撃的中時、体力2、混乱抵抗値2回復
参考元パッシブ:「体力回収(ID240016)」「精神回収(ID240015)」
掃除屋ネームドコアから入手できるパッシブ。こいつらを組み合わせてみよう。
※usingはこれ以降すべて省略します。追加のusingが必要な場合、記載します。

public class PassiveAbility_○○:PassiveAbilityBase
{
 public override void OnSucceedAttack(BattleDiceBehavior behavior)
 {
  base.OnsuccedAttack(behavior);
  this.owner.RecoverHP(2);
  this.owner.breakDeteal.RecoverBreak(2);
 }
}

攻撃的中時なので「OnSucceedAttack」。tabキーで挿入し、baseの行まで自動的に入力される。
「RecoverHP」で体力を、「breakDeteal.RecoverBreak」で混乱抵抗値を回復できる。
ちなみにカッコ内の数字を変えることで回復量を変化できる。
正の整数(int)ならば何でもいいのでこんなこともできる。

public class PassiveAbility_○○:PassiveAbilityBase
{
 public override void OnSucceedAttack(BattleDiceBehavior behavior)
 {
  base.OnsuccedAttack(behavior);
  int healHp=(int)((float)this.owner.MaxHp*0.25f);
  int healBreak=(int)((float)this.owner.breakDeteal.GetDefaultBreakGauge()*0.3f);
  this.owner.RecoverHP(healHp);
  this.owner.breakDeteal.RecoverBreak(healBreak);
 }
}

こうすると、最大体力の25%、最大混乱抵抗値の30%を回復するになる。壊れかな。
ちなみに変数(healHpやhealBreak)は何でも可。自分が分かりやすいものを。
※最大体力を取得するには「this.owner.MaxHp」、最大混乱抵抗値は「this.owner.breakDeteal.GetDefaultBreakGauge()」で取得できる。
※掛け算・割り算させるとき、一度float型(浮動小数点型)で行ってからint型に変換させると確実。参考元パッシブ:「安如泰山(250003)」「安不忘危(250004)」

中級編:「幕の開始時、バフを得る効果」

例:幕の開始時、パワー3を得る。
参考元パッシブ:「したたか(243105)」
参考元では条件が記されていたがその条件を取っ払ったもの。
パッシブスキルのみならず、あらゆる場面において、バフやデバフを付与する効果は似たような形で記載される。ある意味とてもよく使う。

public class PassiveAbility_○○:PassiveAbilityBase
{
 public override void OnRoundStart()
 {
  base.OnRoundStart();
  this.owner.bufListDeteal.AddKeywordBufThisRoundByEtc(KeywordBuf.Strength,3,this.owner);
 }
}

バフ・デバフの名称は、攻略Wikiの「wiki内コンテンツ→MOD→バトルページの特殊能力ID」の最初のほうに書かれている。参考にされたし。
「対象.bufListDeteal.AddKeywordBuf~(KeywordBuf.バフ名称,付与数(int),対象)」で記述する。
基本的に、幕の開始時にパッシブスキルで付与される効果はThisRoundByEtcで行う。
付与したいバフ・デバフの数に応じて、同じ様に記述すること。
※パワーと忍耐を付与したければ、StrengthとEnduranceでそれぞれ記述する必要がある。
※初級編同様、付与数はintであればよいので変数を挟んで行うのもよい。

ちなみに。参考元では条件が記されていたのでそちらの解説を行う。
理解しておくと、感情レベル3以上の時や5以上の時、残り体力が25%以下の時などさらに拡張できるようになる。
「int num=(this.owner.emothionDeteal.EmothonLevel+1)/2;」
→変数「num」に「自分の感情レベルに+1した数を2で割ったもの」を代入している。
emothonDeteal.EmothonLevelで感情レベルを取得できる。
「if(num>0)」及びそれ以降の中かっこ
→if(条件式)で条件式を満たしたときにその下にある中かっこのプログラムを実行する。
それぞれ保護と混乱保護を、numの値だけ付与するようになっている。

上級編:「体力を失った分だけ幕の開始時バフを付与する/体力を回復した分だけ幕の開始時バフを付与する」

例:30ダメージを受けるたびに幕の開始時パワーを得る。30回復する度に忍耐を得る。
参考元パッシブ:「Rabbit施術(251001)」「Rhino施術(251002)」「Reindeer施術(251003)」
※参考元パッシブは失った体力を参照する効果のみ。

    public class PassiveAbility_Ex05:PassiveAbilityBase
    {
        private int _allDamege;
        private int _allHeal;
        public override void OnLoseHp(int dmg)
        {
            base.OnLoseHp(dmg);
            this._allDamege += dmg;
        }
        public override void OnRecoverHp(int amount)
        {
            base.OnRecoverHp(amount);
            this._allHeal += amount;
        }
        //ここまで:失ったHP総数と回復したHP総数を取得
        public override void OnRoundStart()
        {
            base.OnRoundStart();
            int damege = this._allDamege;
            int heal = this._allHeal;
            if (damege >= 30) 
            {
                int bufnum_1 = (int)(damege / 30);
                this.owner.bufListDetail.AddKeywordBufThisRoundByEtc(KeywordBuf.Strength, bufnum_1, this.owner);
                //減少したHPが30以上ならば、30失うたびにパワー1を得る
            }
            if (heal >= 30)
            {
                int bufnum_2 = (int)(heal / 30);
                this.owner.bufListDetail.AddKeywordBufThisRoundByEtc(KeywordBuf.Endurance, bufnum_2, this.owner);
                //回復したHPが30以上ならば、30回復するたびに忍耐1を得る
            }
        }
    }

※実際に作成したものをまんま載せました。
まず、このクラス(パッシブスキル)すべてで変数を使えるようにしたいので「private int 変数名」であらかじめ宣言しておく。
体力を失ったときは「OnLoseHp(…)」、回復したときは「OnRecoverHp(…)」。
それぞれ失った体力分、回復した体力分をカウントさせている。
あとは幕の開始時「OnRoundStart()」で処理を行っている。
ちなみに、これは際限なく上昇していくので、上限を用いたいときはバフを付与するそれぞれのif文の中で
「if(bufnum_X>=○○)
{
bufnum_X=○○;
}」
とバフを付与する文の手前に挟めばよい。

終わりに

今回はパッシブスキル編でした。ちなみに、似たような方式でバトルページアビリティやダイスアビリティも作成できます。必要なら記事作るかも。
攻略wikiにて、参考にしたいパッシブスキルを見つけたら、そのソースコードを見ながら作ると大体作成できます。
なお、最初に書いたように「生存中の味方」や「生存中の敵」を参照するものはうまく動かないようです。(参考元例:ビリビリ、守護者)
また、専用ページやE.G.O追加系のパッシブスキルはModで追加するページIDを参照する場合、上手くいかないようです。(既存のページIDは正常に動きます。)
これらが使えればさらに幅が広がるのですが…。
なお、あまりに強力すぎるパッシブスキルを作成するのはあまり推奨できません。やるなら2週目以降の制限プレイとかで。
ちなみに筆者はエンディングを経験済みです。2週目制限プレイ用に自分用のコアぺージやバトルページを作っているような感じです。

それから…「揺らぎ」については非常に特殊です。
こればっかりは私にもわからないので、強力な敵を作る際は、「すべてのバトルページのコストを前もって0にしておく」「パッシブスキルやバトルページアビリティでドロー能力を加えておく」のが望ましいかと。唯一揺らぎを持たなかった残響楽団のエイリーンを参考にするのもいいかも。