【解決済】スキル使用で獲得ゴールド、獲得経験値の上昇

MapleTea

ユーザー
お世話になります。

今回下記のようなスキルを作りたく質問させて頂きます_(._.)_

①経験値増加:スキルを使うと、そのバトルのみ獲得経験値が1.2倍になる様に変更
②獲得ゴールド増加:スキルを使うと、そのバトルのみ獲得ゴールドが1.5倍になる様に変更
③ドロップ率上昇:スキルを使うと、そのバトルのみ敵に設定されているドロップアイテムが1.2倍で出易くなる様に設定

試したこととしては、戦闘終了後に解除されるステートを作り、経験値獲得倍率を120%に設定しましたが、効果がありませんでした...。

プラグインとして、下記の物を使って成功はしていました。
こちらのプラグインにて、スキルのメモ欄に文言を追加する事で効果が発揮されます。

ただバトル終了後の制御が出来ず、どのバトルでもスキルを使わなくても永遠に発動してしまう状態になり、別を探しておりました。

よろしくお願いいたします_(._.)_
 

Attachments

  • drop_gold_ex.js
    2.7 KB · 閲覧: 8

DarkPlasma

ユーザー
経験値増加だけであれば、戦闘終了リザルトの計算後に解除されるステートの仕組みでも作ってそこに特徴を乗せるだけで済みそうですが、他はデフォルトで特徴が用意されていません。
アプローチとしては、以下のようなやり方が考えられます。

1. 戦闘終了リザルトの計算後に解除されるステートの仕組みと、獲得ゴールド倍率、アイテムドロップ倍率変動の特徴を実装する
2. その戦闘のみ効果を発揮する一時状態の仕組みと、その仕組を有効化するスキル効果を実装する

どちらにしても汎用性を考えるほど実装は複雑化するので、簡単のためにご提示頂いている3通りのみをサポートするように考えましょう。
2のアプローチで、変数に各種倍率を代入するコモンイベントを作ってスキル効果で実行、戦闘開始時にそれら変数を初期化してしまうのがシンプルで楽だと思います。

こんなふうに

戦闘開始時の初期化はMNKR_TimingInvokeCommonMZ.jsなどで代用可能です。

戦闘終了後に解除されるステートを作り、経験値獲得倍率を120%に設定しました
戦闘終了時に解除 設定のされたステートは、戦闘リザルトの計算の前に解除されてしまいますので、経験値倍率特徴を載せても戦闘リザルトにおける経験値獲得に効果は出ませんね。

バトル終了後の制御が出来ず、どのバトルでもスキルを使わなくても永遠に発動してしまう
drop_gold_ex.jsはヘルプに スキルは覚えているだけで効果を発揮します。 とある通り、いわゆるパッシブスキル扱いです。
今回の、スキルを使用した戦闘のみに効果を及ぼすという要件にはマッチしません。
 

MapleTea

ユーザー
経験値増加だけであれば、戦闘終了リザルトの計算後に解除されるステートの仕組みでも作ってそこに特徴を乗せるだけで済みそうですが、他はデフォルトで特徴が用意されていません。
アプローチとしては、以下のようなやり方が考えられます。

1. 戦闘終了リザルトの計算後に解除されるステートの仕組みと、獲得ゴールド倍率、アイテムドロップ倍率変動の特徴を実装する
2. その戦闘のみ効果を発揮する一時状態の仕組みと、その仕組を有効化するスキル効果を実装する

どちらにしても汎用性を考えるほど実装は複雑化するので、簡単のためにご提示頂いている3通りのみをサポートするように考えましょう。
2のアプローチで、変数に各種倍率を代入するコモンイベントを作ってスキル効果で実行、戦闘開始時にそれら変数を初期化してしまうのがシンプルで楽だと思います。

こんなふうに

戦闘開始時の初期化はMNKR_TimingInvokeCommonMZ.jsなどで代用可能です。


戦闘終了時に解除 設定のされたステートは、戦闘リザルトの計算の前に解除されてしまいますので、経験値倍率特徴を載せても戦闘リザルトにおける経験値獲得に効果は出ませんね。


drop_gold_ex.jsはヘルプに スキルは覚えているだけで効果を発揮します。 とある通り、いわゆるパッシブスキル扱いです。
今回の、スキルを使用した戦闘のみに効果を及ぼすという要件にはマッチしません。
DarkPlasmaさんいつもお世話になります_(._.)_
なるほどです...パッシブだったんですね...

あまり理解が出来てません・・・
変数に各種倍率を代入するというのは、1.2とか1.5とかを代入って事でしょうか・・・??
添付頂いたプログラムは、初めてすぎて理解できませんでした

変数操作で乗算で1.2などの小数点を使う事が出来ないので、別の方法で増やすって事でしょうか・・・??
獲得ゴールドなどは、ゲームデータとかに選択肢が入ってないのでスクリプトで取得とかですかね・・・
 
最後に編集:

温州みかん

ユーザー
導入のしかたについて動画にまとめました。

1 プラグインを導入します
プラグインを有効にします.png
2 スキルで発動するコモンイベントを作ります
 プラグインは任意の変数を、経験値倍率、獲得ゴールド倍率、ドロップ率倍率に指定できるようにするものです。
 ※100分率なので、1.5倍にしたいときは 変数=150 と設定すれば1.5倍になります。
各コモンイベントに設定.png

3 コモンイベントで処理した各係数にあたる変数を、プラグインに指定します。
※画像修正
プラグインで読み取るゲーム変数を指定.png

4 パーティー効果を発現するスキルにコモンイベントを「特徴」で指定します
スキルにコモンイベントを設定.png

5 お好みでダミーのステートを設定します
 画像なし。

※2023.6.19編集: 引用画像の訂正 誤字修正 100分率の記載を追加
 
最後に編集:

DarkPlasma

ユーザー
百分率については、温州みかんさんにご説明頂いた通りです。

提示したプラグインを使うために必要なことは
1. 経験値倍率、獲得お金倍率、アイテムドロップ確率の倍率を表す変数を用意する
2. スキル効果のコモンイベントでそれらの変数の値を百分率で設定する
の2点のみです。

添付頂いたプログラムは、初めてすぎて理解できませんでした
プラグインやプログラムに限らないことですが、ある程度の規模を持った文書を理解するコツは、まず全体像を大雑把に把握することです。
まともなプラグインであれば、ヘルプを読むことでそのプラグインが何をするものなのか、なんとなく把握できると思います。ここが第一歩です。

もう少し詳しくコードを読むのであればGistやVisual Studio Codeなどのシンタックスハイライトの効く環境で読まれると良いかと思います。
スクショのような感じで、それぞれ色分けされているのには意味があり、理解を助けてくれるはずです。(私はGitHubでダークモードを使う設定をしているのでこの配色ですが、そうでない場合も色分けの意味は変わりません)スクリーンショット 2023-06-20 093606.png
例えば function, const, return はJavaScriptに元々あるキーワードです。
それぞれ以下のような意味を持っていますが、詳しくは MDNJSPrimer を参考にしてください。
function: 関数を定義する
const: 再代入不可能な変数を定義する
return: 関数の呼び出し元に値を返す

他の色分けについても意味はあるのですが、最初のうちはなんとなく同じ色のものは同じ種類のものなんだな、と思っておけば十分です。
まず中括弧の中身を飛ばして読んでみます。

JavaScript:
function Game_Troop_ExpGoldRateVariableMixIn(gameTroop) {
  // 何かコードが書かれているが、最初は見ない
}

Game_Troop_ExpGoldRateVariableMixIn(Game_Troop.prototype);

Game_Troop_ExpGoldRateVariableMixIn という関数を定義して、その後ですぐに呼び出しています。
引数は Game_Troop.prototype ですが、これは rmmz_objects.js で定義された敵グループクラスのプロトタイプです。
(プロトタイプとは何か、まで説明すると長いので省略します)

関数を定義して、コアスクリプトで定義されたものを引数として渡している、というわけですね。
この書き方は必須ではなく、読みやすさ書きやすさのために私個人が実施しているテクニックです。
関数に引数として渡されている gameTroop は、 Game_Troop.prototype と読み替えても構いません。
では、関数の中身を見ていきましょう。

JavaScript:
const _goldRate = gameTroop.goldRate;
gameTroop.goldRate = function () {
  return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;
};

gameTroop は先程関数に渡された引数で、敵グループクラスのプロトタイプです。
すると、そのメンバーである goldRate は敵グループのお金倍率だろうとなんとなく推測できるかと思います。
(少し奇妙かもしれませんが、獲得金額2倍のパーティ能力の処理は、 Game_Troop.prototype.goldRate 関数の処理として書かれています。詳しくは rmmz_objects.js を参照してください)

JavaScript:
const _goldRate = gameTroop.goldRate;

これは単純な代入ですね。元々コアスクリプトで定義されていた Game_Troop.prototype.goldRate を _goldRate という再代入不可の変数に代入しています。

JavaScript:
gameTroop.goldRate = function () {
  // 何かコードが書かれているが、最初は見ない
};

こちらも、関数の中身はまず無視して読んでみましょう。
これも代入です。
Game_Troop.prototype.goldRate に関数を代入しています。つまり、コアスクリプトに定義されていた関数を、ここで定義する別の関数に置き換えています。
さっき元々の関数を _goldRate に代入しておいたのは、置き換える前の関数もこのあと使うから、です。

JavaScript:
return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;

関数の中身です。 _goldRate は先程代入した、コアスクリプトに元々定義されている関数です。
.call(this) は、その関数を(thisを束縛して)呼び出す書き方です。

元々の関数を呼び出し、その結果に変数の値をかけて100で割った値を返しています。
$gameVariables はゲーム内変数を管理するオブジェクトで、.value(変数ID) でその変数の値にアクセスできます。
settings.goldRateVariable は29行目付近で読み込んでいるプラグインパラメータの値で、名前の通りお金倍率変数を表します。

つまり、このゲーム内変数の値が120であったなら、 Game_Troop.prototype.goldRate 関数の返す値は
(元々の関数によって計算された数値) * 120 / 100
となります。

元々の関数の計算結果は獲得金額2倍の特徴をパーティの誰かが持っていれば2、誰も持っていなければ1です。
獲得金額2倍特徴を誰も持っていなかったとして、 1 * 120 /100 で最終的な結果は1.2になりますね。

Game_System_ExpGoldDropItemRateVariableMixIn 関数には、コメントにもあるように戦闘開始時に各種倍率を100でリセットするための処理を書いています。
MNKR_TimingInvokeCommonMZ.jsなどで代用可能なので、必ずしも書かなくても良いかなとも思いましたが、以下の理由からこのプラグインに書いています。
- 1プラグインで完結していたほうが説明は容易
- 戦闘開始ごとの初期化を前提とするゲーム仕様かつ戦闘開始時に別の処理を行わないのであれば、処理が分散するよりも管理しやすい
 

MapleTea

ユーザー
導入のしかたについて動画にまとめました。

1 プラグインを導入します
View attachment 15517
2 スキルで発動するコモンイベントを作ります
 プラグインは任意の変数を、経験値倍率、獲得ゴールド倍率、ドロップ率倍率に指定できるようにするものです。
 ※100分率なので、1.5倍にしたいときは 変数=150 と設定すれば1.5倍になります。
View attachment 15519

3 コモンイベントで処理した各係数にあたる変数を、プラグインに指定します。
※画像修正
View attachment 15520

4 パーティー効果を発現するスキルにコモンイベントを「特徴」で指定します
View attachment 15518

5 お好みでダミーのステートを設定します
 画像なし。

※2023.6.19編集: 引用画像の訂正 誤字修正 100分率の記載を追加
温州みかんさん、とても分かり易い動画を有難うございます_(._.)_

初期化のイベントは、下記の画像の様に設定したのですが、あってますか・・・??
テストとしてやってみましたが、多分出来ていると思います_(._.)_

またスキルの説明に色付け出来る事を知らなかったので、勉強になりました_(._.)_


1687258831158.png
 
最後に編集:

MapleTea

ユーザー
百分率については、温州みかんさんにご説明頂いた通りです。

提示したプラグインを使うために必要なことは
1. 経験値倍率、獲得お金倍率、アイテムドロップ確率の倍率を表す変数を用意する
2. スキル効果のコモンイベントでそれらの変数の値を百分率で設定する
の2点のみです。


プラグインやプログラムに限らないことですが、ある程度の規模を持った文書を理解するコツは、まず全体像を大雑把に把握することです。
まともなプラグインであれば、ヘルプを読むことでそのプラグインが何をするものなのか、なんとなく把握できると思います。ここが第一歩です。

もう少し詳しくコードを読むのであればGistやVisual Studio Codeなどのシンタックスハイライトの効く環境で読まれると良いかと思います。
スクショのような感じで、それぞれ色分けされているのには意味があり、理解を助けてくれるはずです。(私はGitHubでダークモードを使う設定をしているのでこの配色ですが、そうでない場合も色分けの意味は変わりません)View attachment 15521
例えば function, const, return はJavaScriptに元々あるキーワードです。
それぞれ以下のような意味を持っていますが、詳しくは MDNJSPrimer を参考にしてください。
function: 関数を定義する
const: 再代入不可能な変数を定義する
return: 関数の呼び出し元に値を返す

他の色分けについても意味はあるのですが、最初のうちはなんとなく同じ色のものは同じ種類のものなんだな、と思っておけば十分です。
まず中括弧の中身を飛ばして読んでみます。

JavaScript:
function Game_Troop_ExpGoldRateVariableMixIn(gameTroop) {
  // 何かコードが書かれているが、最初は見ない
}

Game_Troop_ExpGoldRateVariableMixIn(Game_Troop.prototype);

Game_Troop_ExpGoldRateVariableMixIn という関数を定義して、その後ですぐに呼び出しています。
引数は Game_Troop.prototype ですが、これは rmmz_objects.js で定義された敵グループクラスのプロトタイプです。
(プロトタイプとは何か、まで説明すると長いので省略します)

関数を定義して、コアスクリプトで定義されたものを引数として渡している、というわけですね。
この書き方は必須ではなく、読みやすさ書きやすさのために私個人が実施しているテクニックです。
関数に引数として渡されている gameTroop は、 Game_Troop.prototype と読み替えても構いません。
では、関数の中身を見ていきましょう。

JavaScript:
const _goldRate = gameTroop.goldRate;
gameTroop.goldRate = function () {
  return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;
};

gameTroop は先程関数に渡された引数で、敵グループクラスのプロトタイプです。
すると、そのメンバーである goldRate は敵グループのお金倍率だろうとなんとなく推測できるかと思います。
(少し奇妙かもしれませんが、獲得金額2倍のパーティ能力の処理は、 Game_Troop.prototype.goldRate 関数の処理として書かれています。詳しくは rmmz_objects.js を参照してください)

JavaScript:
const _goldRate = gameTroop.goldRate;

これは単純な代入ですね。元々コアスクリプトで定義されていた Game_Troop.prototype.goldRate を _goldRate という再代入不可の変数に代入しています。

JavaScript:
gameTroop.goldRate = function () {
  // 何かコードが書かれているが、最初は見ない
};

こちらも、関数の中身はまず無視して読んでみましょう。
これも代入です。
Game_Troop.prototype.goldRate に関数を代入しています。つまり、コアスクリプトに定義されていた関数を、ここで定義する別の関数に置き換えています。
さっき元々の関数を _goldRate に代入しておいたのは、置き換える前の関数もこのあと使うから、です。

JavaScript:
return _goldRate.call(this) * $gameVariables.value(settings.goldRateVariable)/100;

関数の中身です。 _goldRate は先程代入した、コアスクリプトに元々定義されている関数です。
.call(this) は、その関数を(thisを束縛して)呼び出す書き方です。

元々の関数を呼び出し、その結果に変数の値をかけて100で割った値を返しています。
$gameVariables はゲーム内変数を管理するオブジェクトで、.value(変数ID) でその変数の値にアクセスできます。
settings.goldRateVariable は29行目付近で読み込んでいるプラグインパラメータの値で、名前の通りお金倍率変数を表します。

つまり、このゲーム内変数の値が120であったなら、 Game_Troop.prototype.goldRate 関数の返す値は
(元々の関数によって計算された数値) * 120 / 100
となります。

元々の関数の計算結果は獲得金額2倍の特徴をパーティの誰かが持っていれば2、誰も持っていなければ1です。
獲得金額2倍特徴を誰も持っていなかったとして、 1 * 120 /100 で最終的な結果は1.2になりますね。

Game_System_ExpGoldDropItemRateVariableMixIn 関数には、コメントにもあるように戦闘開始時に各種倍率を100でリセットするための処理を書いています。
MNKR_TimingInvokeCommonMZ.jsなどで代用可能なので、必ずしも書かなくても良いかなとも思いましたが、以下の理由からこのプラグインに書いています。
- 1プラグインで完結していたほうが説明は容易
- 戦闘開始ごとの初期化を前提とするゲーム仕様かつ戦闘開始時に別の処理を行わないのであれば、処理が分散するよりも管理しやすい
DarkPlasmaさん、詳しい説明有難うございます_(._.)_
新しいプラグインを作って頂いたって事になりますね...お手数おかけしました_(._.)_

最初の内は理解も難しいと思いますが、とても勉強になりました_(._.)_

定義する → 再代入不可変数を定義 → 元の値へ戻す

色々な流れや動きが有ると思いますが、最初は意味を知って辿っていく事から必要なのかなと感じました_(._.)_
引数も調べてみたところ、関数やメソッドを呼び出す時の渡す値で、これを渡された側はそれに従って処理を行い、そのまま返す・・・
みたいな感じに受け取れました_(._.)_

確かに百分率なら120÷100で1.2になりますね...
 
トップ