GOREとにゃんこの桃源郷

主観的にCDのレビューやら、日記やら、色々と。
ゴアとかメタルとかロックとか

SPRG日誌Vol.8 - 敵の援軍出現ターン数を操作

2022-07-29 | SRPG Studio

 援軍が毎ターン出てくるのもなァ、どうなんだろうなァ、と思った。

 自動開始イベントを毎ターン起動できるように設定する。

①「ターン数」という変数を用意し、そこに現在のターン数を代入する。

②変数「ターン数」を2で剰余した結果、0なら援軍が有効になる。(このターンに援軍が出現できる)

③変数「ターン数」を2で剰余した結果、1なら援軍が無効になる。(このターンは援軍が出現できない)

④この自動実行イベントを実行済み解除にする。

 ※現在のターン数は、システム「ターン」で取得できる。

 

 無論、援軍イベントは別途マップ上に毎ターン出現するよう設定しておく。上記イベントの場合だと2ターンに1回、つまり1ターン置きに援軍が出現する。剰余を3にすれば、3ターンに1回という設定も可能だし、乱数で剰余することでランダム出現を演出することも出来る。

 ランダムで出現する時などは特に、前回書いた出現メッセージのスクリプトが役立つ。


SPRG日誌Vol.7 - 敵の援軍出現時にメッセージ表示

2022-07-28 | SRPG Studio

 敵の援軍とは、ファイアーエムブレム(通称FE)で言うところの増援のこと。ユニットの援軍設定にて、援軍出現ターン等を設定することで、規定ターンに援軍ユニットが指定場所に出現する。出現予定の援軍ユニットは別途、ユニット設定で作成が必要。

 プレイヤーターンの終わりか、エネミーターンの終わりに任意で出現させることが可能。デフォルトでは、特に演出も無く登場するが、FEのように出現したことをメッセージで伝えたい。想いって、伝えないと伝わらないもんでしょ。

 メッセージテロップを画面上部に出すことにした。自動実行イベントでも頑張れば設定できそうな気がするが、出現できなかった時の判定など、色々作り込みが難しそうだったのでスクリプトで設定。

追記箇所:赤文字
その他仕様:text = "このダブルクォーテーション内に入力した文字が表示されます。"
MessagePos.TOP:画面下部に表示する場合はMessagePos.BOTTOMに変更
あとメッセージの中央寄せしたくない場合はmessageTeropの3つ目の引数(trueになっている部分)をfalseに変更


ReinforcementChecker._moveTop = function() {
 var result = MoveResult.CONTINUE;
 var text = "敵の増援が 現れた!"
  if (this._moveReinforcementUnit() !== MoveResult.CONTINUE) {
  // 現在の範囲内の出現が終えたら、次の範囲を調べる
  if (this._checkDivisionArea()) {
   // 次の援軍を処理する前に、一定時間待機する。
   // これは、切り替えが素早く行われると、援軍を確認しにくくなるため。
   this.changeCycleMode(ReinforcementCheckerMode.WAIT);
  }
  else {
   // これ以上、登場する援軍が存在しない場合は終了
   result = MoveResult.END;
   this._engn = root.getEventGenerator();
   this._engn.messageTerop(text, MessagePos.TOP, true);
   this._engn.execute();
  }
 }
  
 return result;

};


SPRG日誌Vol.6 - 実行条件設定の小技

2022-07-23 | SRPG Studio

 イベントの実行条件について、ちょっとした設定方法を知りました。

① 例えば、上の画像のようなイベント設定をしていた場合です。この条件だと、支援レベル(変数の値)と支援自分(これも変数の値)が特定ユニットIDの時だけ、メッセージ表示が発生します。ただ、条件が複雑になるほど、設定項目が増えるほど、設定の手間も増えます。

 

② ここにイベントを追加した時、こちらも一つ上のイベントと同じ条件にしたいと思います。ただ変数設定を複数実施するのが手間です。

 

③ 同じ条件を設定したいイベントとまとめて選択します。CTRLキーを押しながら、あるいは並んでいる場合はSHIFTキーを押しながら選択します。

④ 選択範囲の中で、設定したい条件が既に記載されているほうのイベントコマンド上で右クリックし、「実行条件を設定」を選びます。

 

⑤ 既に設定された条件を編集する画面になります。(設定したい条件が既に記載されているイベントコマンドの実行条件が表示されている)この状態で「OK」を押下して確定させます。

 

⑥ 実行条件が設定されていなかったイベントに、上記で確定した実行条件が付与されます。


 この方法を知るまで、一個ずつ手動で設定しており非常に大変でした。以前から触っている人にとっては当然の機能かもしれないのですが、意外と説明書(ヘルプ)に載っていない事が多いように思います。※探し方の問題?

 今後も、何か有益な情報を見付けたら記載するつもりです。作成中断して、期間が空いた時、こういうTIPSは自分の為にもなりますからね。


SPRG日誌Vol.5 - ローカル管理用の表を作る

2022-07-21 | SRPG Studio

 案外にまめな性分もあるので、RPGツクールを作る時には管理表を作成している。ツクールの場合はモンスターリストや装備、魔法の計算シミュレータも作って管理していた。今回はとりあえず仲間キャラが多いため、仲間の一覧だけ作成した。ダメージ計算などは単純且つFE準拠にしているため、他に必要なものは無さそうに思っている。強いて言えば、武器やアイテムの一覧は手元にあると便利そうだ。

上の画像が、キャラクターデータの一覧。名前や初期値、成長率を記載している。各成長率は列ごとに、最も高い数値を黄色、最も低いものを青になるよう条件付き書式で設定する。属性はマスタ設定値を別シートに置いているので、右側のセルに数値を入力すれば対応する属性アイコンが出る。

シート下部には各列の最大値、最低値や、対象が何人いるか出るようにしている。属性についても、各属性毎に何人いるか表示させている。

 と言う具合に、各性能の偏りを凡そ把握したい目的がある。特に属性は、全体的にバランス良い人数で調整したいところ。なお、ツクールではモンスターを数百種類も作ることから、名前の重複があるとセルが赤くなるようにしていたが、SRPGでは重複することが必然なので、そのあたりの管理も不要だ。あと何よりエディタがかなり軽量で、開いて確認することが今のところ苦になっていない。いずれ増えてきたら重くなるのだろうか。その場合、敵の増援は撃破済みのキャラを内部的に復活させてまたアクティブにするような姑息な手を使おうと思う。試していないが、それくらいはイベント設定で可能だと思っている。

 ちなみに今回は最大78人の仲間キャラにする。分岐で二者択一などの仲間選びも考えると、それくらいは必要な気がする。何故80人でなくより中途半端な78人にしたかは、6で割り切れるから。会話フラグを変数に持たせているのだけれど、1人に対して変数1つは重くなりそうなので、最大値が111111の変数(入れ物)を沢山準備している。1人につき1桁を割り振って、0がオフ、1をオンとして管理している。変数13個あれば78人分が賄えるため経済的だ。

 しかし実はイベントを作っていて気付いたことがある。1人1つのフラグは必要無く、対応する人同士は二人で1つのフラグで賄えることが判明した。それはつまり、1人目に必要なフラグ数は78人の場合77個であり、1人目と2人目は既にフラグを持っているので、2人目に必要なフラグは-1した76個となる。次の人に行くほど-1されるので、丁度77!みたいなことになる。階乗の足し算バージョンになるはずだが、数学は中学までで終わったので何と呼べばいいのか、どう表現できるのか分からない。

 そう、最初は買ったばかりだったので、会話イベントは一方通行と思い込んで作っていた。実際は、どちらからでもにチェックを入れれば、両方にフラグが立つし、イベントコマンド毎に実行条件を分けられるため、1つのイベントに2人分作ってしまえた。その時アクティブなほうのIDはスクリプトコマンドで変数に取得しているので、その変数を基に分岐させている。

 紆余曲折あったが、まだMAP1を作っている途中で、分からないことだらけだ。クエストって何だ、EXマップって何をするマップだ、とかもまだ分かってない。最近のFEにはある機能なのかもしれんが、こちとら烈火の剣までしか知らないので仕方ない。この後もまた、幾度となく進退繰り返すのだろう。こういう制作ツール系のゲームにおいて、仕様把握はやりながら覚えるのがベストに違いないのだから。


SPRG日誌Vol.5 - デフォルトのゴブリン顔グラ差分

2022-07-19 | SRPG Studio

 ゴブリンが仲間になるSRPGを作りたくて、と言ってもキャラチップは緑色のみ。ということで、緑の範囲内でマイナーチェンジさせた。左上の3匹だけ微修正している。

 で、作った後にデフォルトのキャラチップが青いことに気が付いたんだ。

goblin

デフォルトとの違い。※記載しなければ分からないくらい僅かな修正。何故か⇒自分で描くスキルが無い。

・色合いが多少濃く、鼻が少し低く、目が少し細い奴。

・色合いが多少薄く、鼻が少し低く、犬歯が無く、耳が少し短い奴。

・色合いが多少黄色く、角が生えてる奴。


SPRG日誌Vol.4 - クラスタイプ死霊系からはダメージ吸収できない設定

2022-07-17 | SRPG Studio

 クラスタイプが死霊系からHPを吸収できるのは、何となく違和感がある。まぁ、それを言うと死霊系(=アンデッド⇒死後)にHPがあるのも違和感があるのだが…。とはいえゲーム性質上、無敵にはしたくない。何故なら俺は、ファイアーエムブレム外伝とティアリングサーガを足して2で割って0を掛けたようなゲームを作るのだから!

 ダメージ吸収を武器に設定して、有効相手を選択しようと思ったら、そもそもそんな項目無かった。だからまたスクリプトに少しだけ手を加えた。ようやくデフォルトのスクリプトの読み方が分かってきた気がする。エイリアスこそ一向に覚えないもののね。

仕様:攻撃対象(ダメージを受ける側)のクラスタイプ名が「死霊系」の場合、攻撃者はHP吸収が出来ない。

変更箇所:赤文字


AttackEvaluator.ActiveAction.evaluateAttackEntry = function(virtualActive, virtualPassive, attackEntry) {
 if (!attackEntry.isHit) {
  return;
 }
 
 attackEntry.damagePassiveFull = attackEntry.damagePassive;
 
 // 攻撃を受ける側のダメージの最終調整を行う
 attackEntry.damagePassive = this._arrangePassiveDamage(virtualActive, virtualPassive, attackEntry);
 
 // 攻撃をする側のダメージの最終調整を行う。
 // 通常、攻撃をする側にダメージが生じることはないため、damageActiveは原則0になる。
 // ダメージがマイナスである場合は、回復とみなされる。
 if(virtualPassive.unitSelf.getClass().getClassType().getName() == "死霊系") {
  attackEntry.damageActive = 0;
 }
 else {
  attackEntry.damageActive = this._arrangeActiveDamage(virtualActive, virtualPassive, attackEntry);
 }
};


SPRG日誌Vol.3 - 盾というカテゴリを作る

2022-07-15 | SRPG Studio

 ファイアーエムブレム外伝か、ティアリングサーガに倣った盾を作りたいと思い立ったが吉日。それから連日のように神社にお参りをしたのだが、一向に盾が完成する気配は無かった。それもそのはず、実はその盾、スクリプトやデータ設定を駆使して作成する必要があったのだ。愕然とした…。だから俺はあの神社を賽銭泥棒と呼ぶことに決めた。


↓ 重さ2の武器を所持。さらに重さ1の盾を2つ所持しているため、速さ5-2-1-1=敏捷1になる。

 もう1つ、盾を加味した守備力が表示されることで、現在の成長状態が不明瞭になるので、メインのステータスウインドウは純粋な能力値だけが載るように変更した。これは好みの問題だと思う。

変更箇所:赤文字



// 盾はカスタムパラメータに入力 {shield:true}
// 盾の場合だけ、所持しているだけでも重量に加算する。
AbilityCalculator.getAgility = function(unit, weapon) {
 var agi, pow, value;
 var spd = RealBonus.getSpd(unit);
 
 if (DataConfig.isItemWeightDisplayable() && weapon !== null) {
  if (Miscellaneous.isPhysicsBattle(weapon)) {
   pow = RealBonus.getStr(unit);
  }
  else {
   pow = RealBonus.getMag(unit);
  }
  

  // 所持アイテムの総重量を取得
  var i, item, count;
  var sweight = 0;
  count = UnitItemControl.getPossessionItemCount(unit);
  
  for(i = 0; i < count; i++){
   item = UnitItemControl.getItem(unit, i);
   if((item !== null)&&(item.isWeapon() == false)){
    if( typeof item.custom.shield === 'boolean' ) {
     sweight += item.getWeight();
    }
   }
  }
  // 重さ - 力(魔力)
  value = weapon.getWeight() + sweight;
  if (value > 0) {
   // 力(魔力)が重さより低いため、その差分だけ敏捷を下げる
   agi = spd - value;
   if(agi < 0) {
    agi = 0;
   }
  }
  else {
   agi = spd;
  }
 }
 else {
  // 重さを表示しない場合は、速さが敏捷と同一になる
  agi = spd;
 }
 
 return agi;
};

UnitStatusScrollbar._createStatusEntry = function(unit, index, weapon) {
 var statusEntry = StructureBuilder.buildStatusEntry();
  
 statusEntry.type = ParamGroup.getParameterName(index);
 // ParamGroup.getLastValue ⇒ ParamGroup.getClassUnitValueに変更することでアイテムやステートボーナスを含めない
 statusEntry.param = ParamGroup.getClassUnitValue(unit, index, weapon);
 statusEntry.bonus = 0;
 statusEntry.index = index;
 statusEntry.isRenderable = ParamGroup.isParameterRenderable(index);
  
 return statusEntry;
};


SPRG日誌Vol.2 - 各計算式をFE紋章の謎に倣う

2022-07-13 | SRPG Studio

 掲題の通り、ファイアーエムブレム紋章の謎(検索ミスのために誤表記でも下に書いておこう)と、デフォルトの計算式は色々違っている。せっかく外観仕様はFEっぽいのだから、計算式もFEに合わせたい、そのほうがたぶん調整しやすい!と思い立ったので変えた。

 誤記:パイヤーンエンブレム, ファイヤ印もんちょんの納豆味噌, 紋章'sミステリー アイヤー!エムブレム

変更箇所:赤文字


DamageCalculator.calculateAttackPower = function(active, passive, weapon, isCritical, totalStatus, trueHitValue) {
 var pow = AbilityCalculator.getPower(active, weapon) + CompatibleCalculator.getPower(active, passive, weapon) + SupportCalculator.getPower(totalStatus);
 //特攻はデータ設定のコンフィグを無視して、FE紋章に合わせ力+(武器威力*3)にする。
 //powには既に武器威力が含まれているので、武器威力*2を足すことで実質*3になる。 
 if (this.isEffective(active, passive, weapon, isCritical, trueHitValue)) {
  pow = Math.floor(pow + (weapon.getPow() * 2));
 }
  
 return pow;
};

AbilityCalculator.getAvoid = function(unit) {
 var avoid, terrain;
 var cls = unit.getClass();
  
  // 回避は、(速さ + 幸運) ※元々は速さ*2なのでFE紋章に合わせて速さ+幸運に変更
  avoid = RealBonus.getSpd(unit) + RealBonus.getLuk(unit);
  
  // クラスタイプが地形ボーナスを考慮する場合は、「地形効果」の回避率を加算する
  if (cls.getClassType().isTerrainBonusEnabled()) {
   terrain = PosChecker.getTerrainFromPos(unit.getMapX(), unit.getMapY());
   if (terrain !== null) {
    avoid += terrain.getAvoid();
   }
  }
  
  return avoid;
};

AbilityCalculator.getHit = function(unit, weapon) {
 // 武器の命中率 + (技 * 2) ※デフォは技*3なのでFE紋章に合わせて技*2に変更
 return weapon.getHit() + (RealBonus.getSki(unit) * 2);
 
};


SPRG日誌Vol.1 - 名前によみがなを付ける

2022-07-11 | SRPG Studio

 仲間ユニットの名前を和名にしてしまった(だってデフォの顔グラが日本人顔なんだもの)ということで、読み仮名を付けておきたくなった。そもそも読めない、とか、人によって読み方が違う、となると何だかやっぱりもうね、その、ほら、ね、あれだから。

利用:カスタムパラメータ(通称カスパラ)に入力する。
 {kana: "なかのさかうえの だておとこ"}

改変箇所:赤文字


UnitMenuTopWindow._drawUnitName = function(xBase, yBase) {
 var textui = this.getWindowTextUI();
 var color = textui.getColor();
 var font = textui.getFont();
 var length = this._getUnitTextLength();

 var x = xBase + 130;
 var y = yBase - 2;

 var kana;

 if (typeof this._unit.custom.kana === 'string') {
  kana = this._unit.custom.kana;
 }
 else {
  kana = "";
 }
 TextRenderer.drawText(x, y, kana, length, color, font);

 x = xBase + 130;
 y = yBase + 15;
 
 TextRenderer.drawText(x, y, this._unit.getName(), length, color, font);
};


SRPG Studioの覚書

2022-07-10 | SRPG Studio

 遊んでいて(作っていて)気が付いたこと、気を付けねばならないことをFAQ形式で書き留めておく。特にエラーが出ないと、初心者には原因が特定しにくい。まず初めにスクリプトを疑ってしまうが、もしからしたら設定項目に間違いがあるかもしれない。
 ※逐次更新の可能性がある。


2022.07.08-
・特定の攻撃を受けた時、HPゲージが減らない。戦闘後は減った状態になる。
⇒アニメーションの「このフレームを命中判定にする」が抜けている場合に発生する。

・何か変な挙動がある。
⇒ユニットやアイテムをコピーしてから編集した際、カスタムパラメータを消し忘れているかも。

・マウスで操作出来なくなった。
⇒ゲーム中の「環境設定」のマウス操作可否がオフになっているおそれがある。


2022.07.14-

・プレイヤーリストからgetData(自キャラのID)してもNULLになる。
 ⇒リストは仲間に加入済みのキャラで、データベースの設定人数と差異がある。例えば現在の仲間(出撃メンバーではなく加入キャラ)50人の状態で、データベース設定60番のキャラIDで引いてもgetDataはインデックス検索なのでNULLになる。(この場合だと50項目のリストに対して60番目を指定したのでNULLになった。)⇒getDataFromId(自キャラのID)ならIDと一致したキャラを返してくれる。MetaSessionのgetTotalPlayerList()でもデータベース設定値ではなく仲間になったキャラ数。試していないが多分、負傷(死亡)キャラを含めるか否かの違いだと思う。

・フルスクリーンにすると画面が明滅する。※ディスプレイの入力信号が不安定な状態。
 ⇒自分の場合はNVIDIAのコンパネの3D設定から、ゲーム.exe(エディタではなくゲーム起動のほう)に対して垂直同期をオフにしたら一旦解消した。数分しか様子見ていないので確かではない。調べた限りだとFreeSyncモニター利用者はディスプレイのFreeSync設定をオフにしてからNVIDIAコンパネのG-Syncを解除するのが有効らしい。他には実行ファイルのプロパティから全画面表示の最適化を無効にする、と高DPIスケールの動作を上書き、という手もあるが自分の場合は効果無かった。

・コンソールにオブジェクトの中身が表示されないのでスクリプトでスキルを作れない。
 ⇒どうしたらいいんだろ?回答待ってます。

・例えばスクリプト上で作成した大量のスキルオブジェクトをゲームデータ読み込んだタイミングのオブジェクトと結合してあたかもデータベースに設定してあるものと同等に扱えたりしないのか。(空OBJ << 本体OBJ <<自作OBJ)
 ⇒どうなんだろう。回答待ってます。