スキル再取得処理スクリプト
概要
RPGツクールMZでゲーム制作中に、アクターのスキルの調整をすることってあると思います。
例えば、ヒーリングのスキルを習得するレベルを5→3に下げよう。とか
ファイアのスキルをレベル7で取得できるように変更しよう。とか
しかし、データベースをいじってもセーブされたゲームのデータは変更されていません。
ましてや、上記のような設定変更したときにアクターのレベルがすでに7を超えていた場合は、いったんレベルを下げるなどの操作をしてあげないと反映されません。
しかし!下記のようなスクリプトを使うことで解消されます!
このスクリプトは、アクターがすでに習得しているスキルを 再確認して追加する ものであり、既に覚えているスキルを失うことはありません。
スクリプト
// 全アクターに対してスキルの習得を再確認して適用
$dataActors.forEach(function(actorData) {
if (actorData) { // 無効なデータが含まれる可能性があるのでチェック
let actor = $gameActors.actor(actorData.id); // アクターIDに基づいてアクターを取得
if (actor) {
// そのアクターのレベルに応じたスキルを再確認して習得
actor.skills().forEach(function(skill) {
if (!actor.isLearnedSkill(skill.id)) {
actor.learnSkill(skill.id); // まだ習得していないスキルを習得させる
}
});
// データベース上で新しく設定されたスキルを再確認
actor.currentClass().learnings.forEach(function(learning) {
if (learning.level <= actor.level && !actor.isLearnedSkill(learning.skillId)) {
actor.learnSkill(learning.skillId); // レベルに応じて新しいスキルを追加
}
});
}
}
});
解説
このスクリプトは、RPGツクールMVやMZなどで使用されるJavaScriptコードで、ゲーム内のすべてのアクター(プレイヤーキャラクター)に対して、スキルの習得状態を再確認し、必要に応じてスキルを再習得させる処理を行っています。以下にその詳細を説明します。
1. `$dataActors.forEach(function(actorData) { ... })`
この部分では、ゲーム内のすべてのアクター(キャラクター)のデータを順番に処理しています。
`$dataActors` は、ゲームのアクターのデータが格納された配列です。ここにはすべてのキャラクターのデータが含まれており、その中から一つ一つアクター情報を取得して処理します。
2. `if (actorData) { ... }`
アクターのデータが有効かどうかをチェックしています。無効なデータ(例えば、削除されたアクターのデータ)が含まれている可能性があるため、このチェックを行っています。
3. `let actor = $gameActors.actor(actorData.id);`
この行では、`actorData.id`(アクターのID)を使って、実際のアクターオブジェクトを取得しています。 `$gameActors.actor(id)` は、指定したIDのアクターオブジェクトを返します。
4. `if (actor) { ... }`
取得したアクターが有効であるかをチェックします。無効な場合は処理をスキップします。
5. `actor.skills().forEach(function(skill) { ... })`
アクターが現在習得しているスキルを取得し、それぞれのスキルについて処理を行います。
`actor.skills()` は、アクターが現在持っているスキルのリストを返します。
6. `if (!actor.isLearnedSkill(skill.id)) { ... }`
ここでは、アクターがそのスキルをすでに習得しているかどうかを確認しています。`actor.isLearnedSkill(skill.id)` は、そのスキルをすでに習得している場合に `true` を返し、習得していない場合は `false` を返します。
もしまだ習得していないスキルがあれば、次の行で `actor.learnSkill(skill.id)` を呼び出し、スキルを習得させます。
7. `actor.currentClass().learnings.forEach(function(learning) { ... })`
アクターの現在のクラス(職業)に設定されているスキルの習得情報を確認します。`actor.currentClass()` はアクターの現在のクラスを返し、`learnings` はそのクラスのスキル習得データです。
ここでは、クラスで習得可能なスキルとそのレベルが定義されています。
8. `if (learning.level <= actor.level && !actor.isLearnedSkill(learning.skillId)) { ... }`
この部分では、アクターのレベルに達しているかどうかをチェックしています。アクターのレベルがスキルの習得レベル(`learning.level`)以上であり、かつそのスキルをまだ習得していない場合、そのスキルを習得させます。
9. `actor.learnSkill(learning.skillId);`
指定された `skillId` のスキルをアクターに習得させます。
処理のまとめ
このスクリプトは、次のことを行います:
ゲーム内のすべてのアクターに対して、それぞれのアクターが現在習得しているスキルを確認し、まだ習得していないスキルがあればそれを習得させます。
さらに、アクターが現在のクラスで習得可能なスキルに対して、そのレベルに達している場合に新たにスキルを習得させます。
このスクリプトは、ゲーム内でアクターがレベルアップして新しいスキルを習得したり、クラスに応じて新しいスキルを追加する場合に便利です。
また、アクターが再確認しても習得していないスキルを再習得させるため、スキル管理の整合性を保つことができます。