概要
RPGツクールMVのデータベースとセーブデータに関する話
例えばアップデートでキャラクタの名前を「ハロルド」から「アレックス」に変更したい!
となった場合、データベースの名前を「アレックス」に変えても、既にプレイしている人のセーブデータから読み込むと「ハロルド」のままになってしまいます
RPGアツマールなどに投稿して継続してアップデートしていくようなゲームの場合、これだと困る場合があります
なぜか
- データベースに入力したアクターの名前は
Game_Actor
の_name
に入る - セーブデータには
Game_Actor
がまるごと保存される - 続きから遊ぶ場合、
Game_Actor
にはセーブデータの情報が入る
イベントから名前を変更できるようにするためと思いますが、ゲーム中に名前を変える必要がない場合にはセーブデータで持っていない方が都合が良いです
実装を変更する
プラグインとして実装して以下のように挙動を変更します
(function() {
// ===============================================================
// 名前(name)は$dataActorsを参照して自身で持たないように
// ※ゲーム中での書き換えはできないので注意
// ===============================================================
// ---------------------------------------------------------------
// internal定義
// ---------------------------------------------------------------
var internal = {}
// 不要な情報を削除
internal.lightenGameActor_ = function(actor)
{
delete this._name
}
// ---------------------------------------------------------------
// Game_Actor上書き
// ---------------------------------------------------------------
// Game_Actorで持たない情報を削除
var _GameActor_initMembers = Game_Actor.prototype.initMembers
Game_Actor.prototype.initMembers = function() {
_GameActor_initMembers.call(this)
internal.lightenGameActor_(this)
};
var _GameActor_setup = Game_Actor.prototype.setup
Game_Actor.prototype.setup = function(actorId) {
_GameActor_setup.call(this,actorId)
internal.lightenGameActor_(this)
};
// name
Game_Actor.prototype.name = function() {
return $dataActors[this.actorId()].name;
};
Game_Actor.prototype.setName = function(name) {
// 何もしない
};
})();
- 元々メンバで持っていたものを削除する
-
name()
は$dataActors
から取得するようにする- データベースで入力したものが参照されます
-
setName()
では何もしないように変更する
名前_name
以外に下記のメンバに対しても同様の実装を入れておくと、
これらもセーブデータに入ったものでなくデータベースの方を参照するようになります
- プロフィール
_profile
- 2つ名
_nickname
- 歩行キャラ
_characterName
_characterIndex
- 顔
_faceName
_characterIndex
- [SV]戦闘キャラ
_battlerName
注意点
-
Game_Actor.prototype.setName
で何もしなくなるため、イベントから「名前の変更」を行えなくなります- 「名前」以外のメンバに対しても同様の実装を入れると、これらもイベントからの変更ができなくなります
おわりに
継続してアップデートするゲームというのも多くなってきていると思います。その時に、プロフィールにちょっと誤字があった…とかの不具合を治そうとすると、ゲームからはデータベースを参照してもらう形の方が良かったりします
ただしそれらを変更するイベントのコマンドは使えなくなりますので、どちらの形がよいかはゲームの仕様次第になると思います