## MOD MOD導入や改造にあたり必要な知識をまとめる。 導入方法や作成方法は各自の環境で構築する事。 ### はじめに 最も簡単な方法はVer1.0.0を元にする方法である。 Ver1.0.0まではC#スクリプトのままであるため比較的簡単に本体改造が行える。 Ver1.0.0より後はIL2CPPによる変換がされているため、アセンブラの知識が必要になる。 本項ではVer1.0.0をベースに解説するが、それ以降のバージョンでもアセンブラとなるだけでおおむね同じである。 ### ランキング登録の停止 EarthCloudScript.POSTのCommonData.server_data_setへのPOSTを停止する事で、MODデータのランキング登録を防止することができる。 ランキング登録をせずにクラウドセーブだけを利用することも可能ではあるが、 自前のゲームサーバーを構築し、CommonData.server_nameを変更するのが望ましい。 ### ゲーム開始初期値の変更 DataObjectScriptの初期値を書き換えることで初期ステータスを変更できる。 * データ削除時はDataObjectScript.dataINZ * 机の引き出し時はDataObjectScript.timeDataINZ ### ステータス上限の変更 DataObjectScriptの***_maxを書き換えることでステータス上限を変更できる。 有用なものは下記の通り。 階級を単独で書き換えても、対応するボーナスは別途で用意しないといけない。 | 変数名 | 上限値 | 用途 | |---------------|--------------:|-------------------------------------| | level_max | 29,999 | レベル上限(Ver1.0.0時点) | | gold_max | 999,999,999 | 資金上限 | | exp2_max | 9,999,999,999 | 経験値上限、exp_maxは利用していない | | people_max | 99,999,999 | 人口上限 | | earth_max | 299 | 地球レベル上限(Ver1.0.0時点) | | damage_max | 9,999,999 | 単発与ダメージ上限 | | ship_type_max | 9,999 | 艦種熟練度上限 | なお、2,147,483,647以上に設定する場合はlong型へ変更する必要がある。 ### 単発与ダメージ上限の撤廃 前述の[単発与ダメージ上限](#ステータス上限の変更)を上昇させたところで[加算攻撃力の10000倍制限](ダメージ計算.md#旗艦の与ダメージ)がある。 Ver1.0.7以降であれば[銀河の英雄](兵種.md#人類の覚醒)が実装されているが、Ver1.0.0で実現するのであれば上限自体を取り払う方が簡単である。 加算攻撃力の上限は以下にて実装されている。 * 旗艦はPlayerShip.setModify * 僚艦・艦載機はPlayerSubShipScript.setModify * 敵艦はEnemyShip.setModify なお、ダメージを2,147,483,647以上に設定する場合は***_power_plusやそれらに関する変数もlong型へ変更する必要がある。 ### 戦闘の効率化 本ゲームの問題点の一つに戦闘時の処理落ちがあげられる。 多弾頭兵器や大量の武装を発射した時が顕著である。 これらは主に3つの要因からなる。 #### 弾の当たり判定 弾と弾、弾と相手艦の当たり判定にRigidbody2Dによる当たり判定を用いている。 弾の当たり判定を負荷の小さいものへ変更すると大幅な改善が見られる。 #### 弾の発射処理 前回の弾データを保存し、次回の弾発射時にGameObjectを新たに作らずに再利用できるPoolという仕組みが実装されている。 このPoolが非効率な実装になっている。 Poolを使用しないだけで、わずかに改善が見られる。 * Pool.GetInstanceでpooledObjectListへ毎回 ``RemoveAll(o => o == null)`` を行っている * pooledObjectListへアクティブなGameObjectを接続してしまっている * RemoveObjectCheckを実行し、その中でpooledObjectList.ToArrayなどを実施している 普通のPool実装に変更すればこのような非効率になる事はない。 [Object pool pattern](https://en.wikipedia.org/wiki/Object_pool_pattern) #### 弾の誘導処理 誘導力を持つ弾も処理落ちの要因となる。 ホーミング処理はShot1.MoveXであるが前述までに比べると比較的一般的なものである。 ゲーム性に影響がでるが毎フレーム行っているこの処理を数フレームに1回にし、ホーミング方向を強くするなどで改善可能である。 ### 10000撃破称号取得不能バグ修正 [10000撃破称号取得不能バグ](バグ.md#10000撃破称号取得不能バグ)の原因はif文の判定順が原因である。 StageClearScript.Startは下記のようになっている。 判定の順番を逆にすれば取得可能になる。 ```cs if (this.DOS.clear_defeat_num >= 1000) { FunctionScript.setMedalOne(this.DOS, 57); // 銀河無双! 1エリア撃破数:1000撃破 } else if (this.DOS.clear_defeat_num >= 10000) { FunctionScript.setMedalOne(this.DOS, 58); // 大銀河無双!! 1エリア撃破数:10000撃破 } ``` ### 幻・メタルSFのメタル倍率追加 難易度光化以上で登場する幻・メタルSFには[メタル倍率](資源.md#メタル倍率)が設定されていない。 幻・メタルSFにもメタル倍率を設定したい。 StageCotrolScriptのbonus_metal_outの配列サイズを拡張し、StageCotrolScript.AddPointにてenemy_noが208撃破時にフラグを立て、 StageCotrolScript.Updateにてふさわしいメタル倍率を設定すればよい。 bonus_resource_flagフラグを設定し、StageClearScriptにて幻・メタル資源入手を表示するのが望ましい。 ### ドロップ数調整 本ゲームの特徴として終盤になればなるほど異常な周回数を求められる。 原因の一つに難易度に比べ武装や装甲シールの[ドロップ数](武装ドロップ.md)が非常に低いことがあげられる。 光化では敵の強さが約1000倍されるのに対し、ドロップ数は6倍にとどまる。 装甲シールについては全く上昇しない。 EnemyShip.playerEndでドロップ品が管理されている。 item_raceとitem_noは次の通り設定される。 | item_race | 名称 | item_no | |----------:|------------------|----------------------------| | 0 | 主砲 | 武装のNo | | 1 | 副砲 | 武装のNo | | 2 | 弾幕 | 武装のNo | | 3 | 機関 | 機関のNo | | 4 | 資金 | 資金量、ボスは2倍 | | 5 | 救助 | 1~人口-1のランダム | | 6 | 設計図 | 艦のNo | | 7 | 装甲回復ドローン | 1~29のランダム | | 8 | 装甲シール | セットしているが意味はない | | 9 | エネルギーパック | 1~29のランダム | | 10 | 弾薬 | 1~29のランダム | | 11 | 資源 | 通常敵ドロップ無し | ドロップ数はPlayerShip.getItemにて管理されている。 ドロップ数を見直しゲームバランスを調整したい。 | item_race | 名称 | ドロップ数 | |----------:|------------------|-------------------------------------------------| | 0 | 主砲 | 1 + enemy_level | | 1 | 副砲 | 1 + enemy_level | | 2 | 弾幕 | 1 + enemy_level | | 3 | 機関 | 1 + enemy_level | | 4 | 資金 | [(item_no + 資金Lv) * (1 + 小型艇熟練度 / 100)] | | 5 | 救助 | item_no + 救出人数Lv | | 6 | 設計図 | 1 + enemy_level | | 7 | 装甲回復ドローン | item_no + 回復率Lv(ランダム) | | 8 | 装甲シール | 1固定 | | 9 | エネルギーパック | item_no | | 10 | 弾薬 | item_no + 弾薬補給率(ランダム) | | 11 | 資源 | item_no | ### 味方艦、武装、機関、敵艦追加時の注意点 味方艦、武装、機関、敵艦を追加した際に、追加後に削除を行うと宇宙船ドックや宇宙基地で編成不能になったり、 ゲーム中に挙動がおかしくなってしまう。 原因は味方艦、武装、機関、敵艦をインデックス管理しているため、目的のものが見つからなかった場合に未初期化変数(全て空文字)を返すためである。 下記に対しとりあえずゼロ番のデータを返すなどすればエラーは防げる。 * 味方艦はPlayerData.getPlayerData * 主砲はWeaponData.getWeaponDataMain * 副砲はWeaponData.getWeaponDataSub * 弾幕はWeaponData.getWeaponDataBarrage * 機関はGeneratorData.getGeneratorData * 敵艦はEnemyData.getEnemyData なお、これにより地球に機関などが未設定のため発生する[僚艦 地球配備バグ](バグ.md#僚艦地球配備バグ)も解消できる。 ### 難易度の追加 味方艦を強化すればそれに応じて敵艦も強化したい。 方法は2つあり、既存の難易度を強化するか新難易度を作成することである。 既存の難易度を強化するのが最も簡単でFunctionScript.getEnemyLevelを変更すればよい。 現在は調整不足と言わざるを得ない、難易度 真破のLv上限引き上げなどをするのが無難である。 また、真破はチップ合計50制限があるためGameStageScript.isErrorCheckで無効化も合わせて実施したい。 なお、Lv上限を4292以上に引き上げ時は変数もlong型にする必要がある。 終盤のボスの基礎装甲が1,000,000あるため、Lv上限が4292を超えるとオーバーフローする。 ### 艦種熟練度の調整 艦種熟練度には[工作船](艦種熟練度.md#工作船)や、[消防船](艦種熟練度.md#消防船)のように必要ないものや、 [病院船](艦種熟練度.md#病院船)や、[輸送船](艦種熟練度.md#輸送船)のように高く上げる意味がないものが多い。 これらを意味のあるものへ見直したい。 既存の艦種熟練度は以下にて実装されている事が多い。 * 旗艦はPlayerShip.setModify * 僚艦・艦載機はPlayerSubShipScript.setModify * 敵艦はEnemyShip.setModify * 戦闘中はStageCotrolScript.Update