言うほどでもない小技

現状「ニューゲーム」を選択した時、初期設定(データベース上)の文字列が表示されます。「初期化」されているようです。

スクリプトによって書き換えた後、タイトルに戻って(ゲームを再起動せずに)ニューゲームを開始した場合にもそうなるようであれば、何かがおかしいですね。
MV/MZ共に、 $dataXXXX の初期化は Scene_Boot(ゲーム起動直後シーン)でのみ行われているはずです。

ゲーム中に動的に説明文を書き換えたいのであれば、トリアコンタンさんの動的データベースなどを利用されると比較的簡単かつ安全に実現できるかと思います。
 
ゲーム中に動的に説明文を書き換えたいのであれば、トリアコンタンさんの動的データベースなどを利用されると比較的簡単かつ安全に実現できるかと思います。
ナイスなご提言感謝いたします

プラグインだから安全だとか、スクリプトだから危険だ、とかいうことはない
なぜなら、やっていることは同じだから
データベースの値を換えることも、決して無謀な処理ではない
ただの参照値だからだ
そして、改変リスクを引き合いに出すと、
記述内容をよく理解できないツクラーが野良プラグインを導入している現状と折り合いがつかなくなる
理想に近づける人が限られてしまう 誰が得をするというのか

「トリアコンタン」さんを出せば正義という風潮に乗るのはよくない
極めて適切であるがゆえに、内容の吟味を省略する「思考のショートカット」に陥ってしまう

もし、私が私に助言するならDMでこれを送るだろう
知識のあるべき使い方はこうだ

//=============================================================================
// CommonEventLoadgame.js
//=============================================================================

/*
* @target MZ
* @plugindesc Run the common event when the game is restarted on load
* @author UM
*
* @param Common_Event_ID
* @type number
* @default 0
* @text A number of the common event ID
* @desc Specify the common event to be executed when the game is continue loaded. The default value of 0 is not executed.
*
* @help
* I don't well English... Sorry
* maybe it's can run on MV
*/


/*:ja
* @target MZ
* @plugindesc ゲームをロードで再開した時、指定したコモンイベントを実行します
* @author 温州みかん
*
* @param Common_Event_ID
* @type number
* @default 0
* @text コモンイベントのID番号 数値を半角で入力
* @desc ゲームロード時に実行するコモンイベントを指定 デフォルト値の 0 は実行しない
*
* @help
* プラグインコマンドはありません
* いつもの一行追加プラグインです 著作権は主張できないはずです
* たぶん、MVでもいける
*/


(function(){
'use strict';

const pluginName = 'CommonEventLoadgame';

//パラメータの反映
const paramaeters = PluginManager.parameters(pluginName);
const COMMON_EVENT_ID = paramaeters['Common_Event_ID'];

//本文
var _DataManager_loadGame = DataManager.loadGame; //なんかしらんけどvarで定義していたから流用
DataManager.loadGame = function(savefileId) {
const saveName = this.makeSavename(savefileId);
return StorageManager.loadObject(saveName).then(contents => {
this.createGameObjects();
this.extractSaveContents(contents);
this.correctDataErrors();
if (COMMON_EVENT_ID > 0) { //追加したところ
$gameTemp.reserveCommonEvent(COMMON_EVENT_ID); //一行だったら{}は省略できるらしい
}
return 0;
});
};

})();
 
プラグインだから安全だとか、スクリプトだから危険だ、とかいうことはない

仰るとおりですが、私の言った安全の基準がご理解いただけていないものと推測します。
プラグインであれスクリプトであれ、十分な理解と検証、そしてメンテナンスの意思なしに書かれたものを使うことが危険なのであって、プラグインであるかイベントコマンドのスクリプトであるかは本質的な問題ではありません。
ゲームから切り離してメンテナンスしやすいのはプラグインですから、そういった意味でプラグインのほうが安全に倒しやすい、という性質はありますが。

データベースの値を換えることも、決して無謀な処理ではない
ただの参照値だからだ

参照値がどこで初期化されるかを理解せずに書き換えてしまうとバグを起こします。危険ですね。

「トリアコンタン」さんを出せば正義という風潮に乗るのはよくない
極めて適切であるがゆえに、内容の吟味を省略する「思考のショートカット」に陥ってしまう

目指すシステムの実現の手段を吟味されるのは良いことだと思います。
今あるプラグインを使って実現できるものを、別の手段で実現しようとする場合、当然ですが動機が必要になります。
別の手段のほうが実現コストやリスクを考慮した場合に優れていると判断できるか、時間に余裕があるならその判断のために試してみることは決して無駄ではありません。

ところで、今回トリアコンタンさんの動的データベースプラグインでなんとかなる、と言ったのは、彼のプラグインに関する以下の性質を考慮した結果であり、決して無思考ではないことを主張します。
  1. githubでバージョン管理されており、かつ可読性にも十分に配慮されていてメンテナンスしやすい状態にある
  2. 初出の2015年から継続的にメンテナンスされている
  3. ゲーム中に動的に値を変えて見せるデータベースを実現する手段として、十分汎用的に作られている
  4. 起動時にロードしたマスターデータをゲーム中に動的に書き換えず、参照時に値を解決している
もし、私が私に助言するならDMでこれを送るだろう

解決のための手段はオープンな場所に書かれていなければ、フォーラムとしての意味がありません。(DMでは誰も間違いを指摘してくれませんし、他の誰かの役に立つこともありません)

CommonEventLoadgame.js

実は、ロード完了時にコモンイベントを実行する機能を含むプラグインを、トリアコンタンさんが既に公開されています。

コードを書く際は、CODEブロックで囲み、インデントを揃えると読みやすくなると思います。

以下、あまり意味のあるレビューにはならないかもしれませんが、今後コードを書かれる際の参考になれば幸いです。

DataManager.loadGame の中に処理を組み込むのは、安全ではなさそうです。
ロードに伴う諸々の処理(ゲームをバージョンアップしていた場合のマップリロードなど)が全て終わった後に実行されるよう、 Game_System.prototype.onAfterLoad をフックしてそこに処理を差し込むと良いんじゃないでしょうか。

_DataManager_loadGame は未使用ですので、定義する意味がありません。
 
ステート関連のプラグインで永続効果があるタイプがいくつも見かけることがありますが、この手のプラグインを利用する事で消滅エフェクトを切り替える事が出来るという事を知っているだろうか?
プラグインなしだと、消滅エフェクトの影響は受けませんが永続効果があるステートに消滅エフェクトを追加していると消滅エフェクトが発生します。
検証動画がこちら。

これによって、雑魚敵でも小ボス的扱いにする事ができます。
まぁ、エネミーデータを使い捨てするのでなく、変数によってステータスが変動するタイプのエネミーをよく利用するのなら重宝出来るけどね。
 
最後に編集:
矢印キー、マウス操作を正常にさせない小技。
一見すると使い勝手が悪く、操作性が悪くなりますが一時的に操作を混乱させる事でシンボルと無理やり衝突させたり、落とし穴に誘導させたりとプレイヤーに不安にさせる時に使えるかもしれない・・・。
ぶっちゃけ、モンハンのホロロホルルの鱗粉みたいな効果をどうすればいいかを数分悩んで、試しに組んだら動作した。

ちなみに応用すると、プラグインなしで斜め移動も対応できる様になる。
斜め移動できるプラグインとは相性が悪かったSRPGコンバータMVでもポインターが斜め移動出来るになる。
ただ・・・、プレイヤー以外は斜め移動は出来ない。
 
最後に編集:
条件分岐の「スクリプト」やスキル計算式など「スクリプトを記述可能だが1行しか書けない」箇所でif文など、複数行にまたがる記述をしたいと思ったことはありませんか?
例えば「ゲームスイッチ1番がオンの場合変数1番に1を、オフの場合2を代入する」というコードはスクリプトを使う場合、普通に書くと以下のように5行になるかと思います。
(追記:上二つの例が、RGSS時代の書き方が混在した間違いだらけのものになっていたので修正いたしました)

JavaScript:
if ($gameSwitches.value(1)) {
    $gameVariables.setValue(1, 1);
} else {
    $gameVariables.setValue(1, 2);
}

三項演算子を使えば以下のように1行にまとめられます。

JavaScript:
$gameVariables.setValue(1, $gameSwitches.value(1) ? 1 : 2);

三項演算子は以下の例で言うところの a が真なら b を、偽なら c を返します。

JavaScript:
a ? b : c

これを使えば例えば「敵の防御力と魔法防御の低い方を参照し、防御力の方が低い場合場合自分の攻撃力を、魔法防御の方が低い場合自分の魔法力を参照するスキル」のようなものを1行で記述することができます。

JavaScript:
(b.def < b.mdf ? a.atk : a.mat) * 4 - (b.def < b.mdf ? b.def : b.mdf) * 2

行数制限のない通常のコードでもコードがスッキリして見やすくなるので覚えておいて損はありません。
コアスクリプトにも多用されているのでコード解読にも役立ちます。

1行にまとめる方法としては他にもセミコロンを使えば改行なしで改行と同じ意味にできます。例えば上の例はこのように書くこともできます。

JavaScript:
let attack, defense; if (b.def < b.mdf) { attack = a.atk; defense = b.def; } else { attack = a.mat; defense = b.mdf; } attack * 4 - defense * 2


これは以下のコードと同じ意味ですが、はっきりいって非常に見づらいです。
通常はこのような書き方をすることはまずないでしょうが、1行と言う制約のある環境下では使うこともあるかもしれません。

JavaScript:
let attack, defense;
if (b.def < b.mdf) {
    attack = a.atk;
    defense = b.def;
} else {
    attack = a.mat;
    defense = b.mdf;
}
attack * 4 - defense * 2


今回の例ではそれぞれ三項演算子とセミコロンのどちらか片方だけを使うものでしたが、当然ながら両者を組み合わせることも可能です。
このようなテクニックを用いれば理論上はどのようなスキル計算式でも記述できるでしょう。
ただし長くなればなるほどエディタ上での視認性が低下してしまいますので、テキストエディタ等に書いてからコピペすると良いでしょう。

なんか長くなって言うほど小技でもなくなっちゃってスミマセン……。
 
最後に編集:
プラグインのヘルプを英語で書くとき、一番悩むのが、用語関連。
この言葉は、英語版ではどのように訳されているんだろう……?
特にイベントコマンドの名前とかいろいろ悩んでいました。

それで知ったのですが、ツクールMZがインストールされているフォルダにある
Locale (拡張子無し)の中の文字を、ja から en に変更して起動すると、英語版が起動します。
プラグインの英訳作るうえで大変役に立っています。
同じお悩みをお持ちの方も、これで助かりましたね。

なお、ツクールMZのフォルダは、Steam版では
C:\Program Files (x86)/Steam/steamapps/common/RPG Maker MZ/
にありますよ。Localeのファイルがない場合、新たに作るといいです。
 
ツクールMZは標準で解像度を変更できますが、2000x2000までしか入力できません。
ですがSystem.jsonを直接編集すればscreenWidth/screenHeight、uiAreaWidth/uiAreaHeightにそれ以上の値を設定できます。
4K解像度(3840x2160)にもできますよ。
 
ステート解除タイミングの「ターン終了時」と「行動終了時」の違いについて。
いわゆる「リジェネ・スリップダメージステート」の場合は、ターン終了時に解除すると解除→値変化の順になるので
直感に反しますが、この他にも「ターン終了時」はデフォルトではマップで20歩動いたときに有効ターンが進むのに対し
「行動終了時」は、マップ上では進まないという特徴があります。
なので、「リジェネ・スリップダメージステート」や料理などの戦闘をまたぐステートを実装したいときなどは
ステート解除タイミングを「行動終了時」にするのがおすすめです。
 
ロマサガのように力などの基礎ステータスのみが表示され、総合的な攻撃力や防御力を別の数値で扱いたい場合は、属性有効度が活用できる。

戦闘計算式で属性有効度を×100すれば整数として擬似的に扱えるので計算もあまり困らない。
 
敵グループでの固定配置が嫌な場合、
敵グループはメイン敵のみを設定、バトルイベントのターン0で敵の出現と強制変身を組み合わせれば
イベント側で敵の配置をコントロールできる。

この際、敵にS・M・L・LLのサイズを設定してそれぞれ変数に1、2、4、6を設定し8まで出現できるとして組み合わせると、LLの場合はお供にSが2体、Mが1体までなどの設定ができる。

最初の設計は面倒だけど、そこさえ超えれば敵グループの組合せで悩んだり、たくさん作ったりしなくてすむ
 
知っている方もいらっしゃると思いますが、RPGツクールMVで、装備すると特技が使えるようになる装備品の作り方です。
私はこれに気付くまで、装備品で特技を使えるようになる方法がわからず、
プラグインを頼るしかないかと思っていたので、同じように悩んでいる方の助けになればと思いました:rwink:

RPGツクールMV_装備すると技を覚える装備品の作り方01.png

まず、装備品を設定する画面で、特技を付与したい装備品(例では防具)を選び、
右の方の「特徴」ウィンドウ内を右クリック(Windowsの場合)して「編集」を選択します。

RPGツクールMV_装備すると技を覚える装備品の作り方02.png


出てきたウインドウの「スキル」タブ内「スキル追加」にチェックを入れ、
覚えさせたい特技を選択して、OKを押します。
これで、選択した装備品を装備したときに、任意の特技が使えるようになります。
特技は複数選択できるので、例えば「赤いはちまき」に「ファイアパワー」「ファイアオール」を「スキル追加」すれば
「赤いはちまき」を装備したときに、「ファイアパワー」「ファイアオール」の特技が使えるようになります。

この小技に気付くまで「特技が使える装備品を作るやり方」に悩んでいましたが、
発見したらプラグインなしでも問題が解決して重宝しました。
悩んでおられる方の助けになれば幸いです:kaopride:
 
最後に編集:
こんばんは、スキルのダメージ計算式を構想している上で一つ、プラグイン無しでも実現出来そうな事を載せさせていただきます。

敵サイドの一匹が混乱ステート(行動制約:誰かに攻撃する)時、通常攻撃を同じ敵サイドの誰かに仕掛ける時にダメージの倍率を変えられるシステムを構想するもの。
○Math.max((a.atk * 2 - b.def * 1) * b.elementRate(65), (a.atk * 1.5 - b.def * 0.5) * b.elementRate(65)) * (a.isEnemy() && b.isEnemy() && a.isConfused() ? 2 : 1)
※b.elementRate(65):防御側がアクターかエネミーかによってダメージを変化させる係数。アクターの場合は0.5、エネミーの場合は1と代入。

状態異常・妨害スキルを用いて折角敵サイドに混乱をばら撒いたのに、同士討ちがあまり期待できないと云ったもどかしい現象を解消に導けるのなら、この上ない幸いとなりそうです……が、如何でしょう。
もし敵サイド間の同士討ちのダメージ倍率に悩まれてる方がおられるならば、助けになります事を切に願います。
他にアイデアがありそうでしたら、私の方も教えを請いたい位です―― ダメージ計算式、奥が深い。
 
最後に編集:
Back
トップ