投稿記事

プラグイン制作応援プランの記事 (4)

ブラウンチップ☆ 2019/09/22 10:35

プラグイン改変入門~コマンドを追加してみる~

はいどーもこんにちは人生もコマンド制を希望するツミオです。
本日は先日改変したプラグインに「新規のコマンド」を追加してみたいと思います。

  • コマンドの追加ってなに
  • 追加するコマンド
  • メニューにコマンドを追加する
  • コマンド名を変えてみる
  • 残りの実装
  • コードの問題点
  • まとめ

    コマンドの追加ってなに

コマンドとは、メニュー画面を開いたときに出てくる「アイテム」や「スキル」のことです。
具体的に全て列挙すると、現在のコマンド一覧は以下の通りです。

  • アイテム
  • スキル
  • 装備
  • ステータス
  • 並び替え
  • オプション
  • セーブ
  • ゲーム終了

ここに何か別のコマンドを追加してみたいというわけですね。
ちなみにですが、メニュー画面にコマンドを追加するたぐいのプラグインは結構出ています。
自作するのが目的ではなく、メニュー画面にコマンドを追加すること自体が目的の方はそちらの利用を検討してみてもよいかもしれません。

追加するコマンド

今回は「本拠地にワープするコマンド」を作ってみましょう。
想定しているシチュエーションとしては、以下の通りです。

  • プレイヤーは「本拠地」があり、そこを拠点としてマップ上でクエストをこなす
  • プレイヤーはクエストをこなしたあと、本拠地に戻る必要がある
  • いちいち本拠地に手動で歩くのは面倒くさいので、ショートカットコマンドをメニュー画面に追加したい
  • ただし特定の状態時(例えばダンジョン突入時やイベント時)は本拠地に飛ぶのは禁止したい。これはスイッチで管理する(特定のスイッチがONのときだけ本拠地に戻れるようにする)

こんな感じですね。
実装してみましょう。

メニューにコマンドを追加する

メニュー画面のウィンドウをコントロールしているのは、rpg_window.jsファイル内の「Window_MenuCommand」というクラスです。
ファイルを開いて検索してみてください。
ざっと眺めてみると、以下のコードが見つかるかと思います。

Window_MenuCommand.prototype.makeCommandList = function() {
    this.addMainCommands();
    this.addFormationCommand();
    this.addOriginalCommands();
    this.addOptionsCommand();
    this.addSaveCommand();
    this.addGameEndCommand();
};

makeCommandListとなっていて、まさにここでコマンドのリストを作成しているようですね。
書かれているものを一つ一つ見ていくと(単なる英語ですから、プログラミングの知識は不要です。落ち着いて見ていってください)、addOriginalCommandsなるものがあることがわかるかと思います。
オリジナルのコマンドを追加する、とのことなので、ここを変更すればよさそうですね。

具体的なコードはこうなっています。
Window_MenuCommand.prototype.addOriginalCommands = function() { };

中身空じゃん!
ということで、これだけでは参考になるものがないので、どんなコードを書けばいいかわかりませんよね。
他のもの、ここでは試しにaddGameEndCommandも見てみましょう。

Window_MenuCommand.prototype.addGameEndCommand = function() {
    var enabled = this.isGameEndEnabled();
    this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);
};

どうやらaddComandなるものを利用すると、コマンドを追加できそうということがわかりました!
addCommandとそのままの名前なのでわかりやすいですね。
ではまずはそのままコピーしてみましょう。
SimpleMenuLayout.jsに以下のコードを追加してください。

    const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
    Window_MenuCommand.prototype.addOriginalCommands = function() {
        _Window_MenuCommand_addOriginalCommands.call(this);
        
        var enabled = this.isGameEndEnabled();
        this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);
    };

ちょっとややこしいですね。
最初の行の

const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;

_Window_MenuCommand_addOriginalCommands.call(this);

コアスクリプトのコードを上書きする際のお約束のようなものです(が、場合によってはあえて書かない場合もあります)。
ここでは詳しい説明は省きますので、もし詳しく知りたい方がいれば「JavaScript call apply」などで検索してみてください。

さて残りのコードを見ていきましょう。

        var enabled = this.isGameEndEnabled();
        this.addCommand(TextManager.gameEnd, 'gameEnd', enabled);

一行目は「ゲーム終了は利用可能かどうか?」をenabledに保存(代入)しています。
二行目がまさに「コマンドの追加」ですね。こちらを詳しく見ていきます。

addCommandは以下の引数(カンマで区切られているやつのことです)を受け取ります。
注:正確にはextという引数も受け取りますが、ここでは関係ないのと、コアスクリプト内でもほとんど利用されていないのでここでは省略します。

ゲーム画面で表示するコマンドテキスト, プログラム内で使用する識別名(ゲーム画面には表示されない), 利用可能かどうかを示すフラグ

つまり現状は

TextManager.gameEnd(これはツクールのデータベースにある「ゲーム終了」で設定した文字列になります)をゲーム画面に表示して、プログラム内ではそれを「gameEnd」として扱い、isGameEndEnabledで利用可能かどうかを決める(通常は常に「利用可能」)ということになります。

実際にゲームを動かしてみてください。
こんな画面になるかと思います。


「ゲーム終了」が変なところにも追加されていますね。

フォロワー以上限定無料

続き

無料

【 プラグイン制作応援プラン 】プラン以上限定 支援額:300円

まとめと完成したプラグインの配布

このバックナンバーを購入すると、このプランの2019/09に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ブラウンチップ☆ 2019/09/15 09:31

プラグイン改変入門~コードいじいじ編~

はいどーもこんにちは、プラグイン制作の有償依頼を受け付けているツミオです。
本日は[前回の記事](https://ci-en.dlsite.com/creator/3765/article/92783)で作成したプラグインを改変していきますよ。

  • ゴールドウィンドウを移動させる
  • ゴールドウィンドウ内の文字列の位置を調整する

以上2つです。
ゴールドウィンドウの幅について前回は書いていたのですが、実際に作ってみたら「あれこれ幅合わせないほうがカッコよくない?」と思ったのと「ゴールドウィンドウ内の文字列の位置を調整する」で実質的にウィンドウの幅を変更するので除けました(笑)

ゴールドウィンドウを移動させる

さっそくですが、現在のゴールドウィンドウの位置を調整しているコードを見てみましょう。

    Scene_Menu.prototype.hideUnnecessaryWindows = function() {
        this._statusWindow.hide();
        this._goldWindow.x = 100;
        this._goldWindow.y = 200;
        this._goldWindow.width = 300;
    };

前回の話では、この「100」とか「200」の値を、コマンドウィンドウの位置にあわせて自動調整させたい、ということでした。

別のメソッドに抜き出す

100や200の値を自動調整できるようする前に、まずメソッド名(hideUnnecessaryWindowsのこと)と、実装内容に乖離があります。
「不必要なウィンドウを隠す」という名前なのに、位置まで調整してはいけませんね。
ということで新しくメソッドを作って一部のコードを抜き出し、抜き出した部分は元のコードでは不要になるので消します。

    Scene_Menu.prototype.hideUnnecessaryWindows = function() {
        this._statusWindow.hide();
        //this._goldWindow.x = 100;
        //this._goldWindow.y = 200;
        this._goldWindow.width = 300;
    };

    Scene_Menu.prototype.resetGoldWindowPos = function() {
        this._goldWindow.x = 100;
        this._goldWindow.y = 200;
    };

こんな感じですね。
わかりやすくコメントアウトしていますが、実際には不要なコードは消しちゃってOKです。
なお「resetGoldWindowPos」という名前は「resetMenuWindowPos」にあわせて名付けましたが、もっといい名前がありそうな気もしますね。
昔のコードなのでこの辺はしょうがない……(本格的にコードを改善していくなら話は別ですが、ここではそれは本題ではないのでスルーしていきます)。

resetGoldWindowPosを呼ぶ

さて「resetGoldWindowPos」は今はどこからも呼ばれていないので、どこかで呼んであげる必要があります。
今回はここです。

    const _Scene_Menu_start = Scene_Menu.prototype.start;
    Scene_Menu.prototype.start = function() {
        _Scene_Menu_start.call(this);
        this.hideUnnecessaryWindows();
        this.resetMenuWindowPos();
    };

hideUnnecessaryWindowsが呼ばれているあたりが怪しかったので、検索してここに決めました。
このへんでよしなにウィンドウの位置を調整してあげればよさそうですね。
こんな感じで。

    const _Scene_Menu_start = Scene_Menu.prototype.start;
    Scene_Menu.prototype.start = function() {
        _Scene_Menu_start.call(this);
        this.hideUnnecessaryWindows();
        this.resetMenuWindowPos();
        this.resetGoldWindowPos();
    };

実行してみる

一度このコードでちゃんと動くか試してみましょう。
100やら200やらの値を変えてみて、きちんとウィンドウの位置が変わっているかを確認してみてください。

自動調整可能にする

さてここからが本題です。
ゴールドウィンドウの位置を自分でチマチマ調整しても綺麗な位置(コマンドウィンドウにいい感じに重なる位置)に持っていけると思うのですが、それは面倒です。
面倒なことは機械的にやれるようにしちゃおうというのが今回のお題です。

具体的にはこんな感じのデザインにしたいわけです。

まずX座標を考えましょう。
コマンドウィンドウと全く同じX座標にした場合、左揃えになります。
左揃えだとイメージの通りにならないので、これを右揃えにしたいわけです。
そうするにはどうすればいいかと言えば、一つには以下の方法があるかと思います。
「コマンドウィンドウのX座標 - (ゴールドウィンドウの幅 - コマンドウィンドウの幅)」
要は「右側にはみ出した部分だけマイナスさせる」ということですね。
実際にコードにすると以下の通りです。

this._goldWindow.x = this._commandWindow.x - (this._goldWindow.width - this._commandWindow.width);

次はY座標です。
これも同じ用に考えてみると、以下のような方法で可能です。
「コマンドウィンドウのY座標 + コマンドウィンドウの高さ」
X座標よりシンプルですね。
実際にコードにすると以下の通りです。

this._goldWindow.y = this._commandWindow.y + this._commandWindow.height;

これで座標の問題はOKです。

フォロワー以上限定無料

説明の続き

無料

【 プラグイン制作応援プラン 】プラン以上限定 支援額:300円

今回作成したプラグインの完成版をDLできます

このバックナンバーを購入すると、このプランの2019/09に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ブラウンチップ☆ 2019/08/31 10:09

プラグイン改変入門~おおまかな流れ編~

はいどーもこんにちは、ツミオです。
本日はプラグイン制作者らしく、プラグイン改変の方法を書いていこうと思いますよ。
目次をドン。

  • 改変するプラグインの選定
  • プラグインの各部解説
  • 改変箇所の選定
  • 改変してみる
  • 改変後の問題点
  • 改造後のプラグインのDL

ちなみに数回にわけて書く予定です。

改変するプラグインの選定

プラグインを改造するには、改造するプラグインを選定しなければなりません。
本当は僕以外が作ったプラグインを改変するのが一番よいと思うのですが、規約とか確認するのが面倒なので自分が作ったものにします。
というわけで今回はコチラ。

SimpleMenuLayout

このプラグインを導入すると、メニュー画面がシンプルになります。
DQ風だったりポケモン風だったり、まあそんな感じです。
作ったのが2017年でかなーり古いので、若干気恥ずかしいですね(笑)

今回の記事はJavaScriptの知識は不要

さてプラグインを改変するにはJavaScriptの知識が必要です。
ですが、英語がちょっとでもできるなら、軽い改変くらいならばJavaScriptの知識なしでもなんとなーく想像がつくようになっています。
というわけで、今回の記事ではJavaScriptの知識云々は無視し、プラグインの各部がどうなっているのかをざっと眺め、それから実際に改変してみたいと思います。

フォロワー以上限定無料

特典はほとんどありませんが、入ってくださる方が増えれば増えるほど僕が喜ぶプランです(笑)

無料

【 プラグイン制作応援プラン 】プラン以上限定 支援額:300円

このバックナンバーを購入すると、このプランの2019/08に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

ブラウンチップ☆ 2019/08/28 17:46

チート対策について考えてみる

はいどーもこんにちは、ツミオです。
本日はチート対策について書いていきたいと思います(RPGツクールMVとUnity)。
目次はこんな感じ。

  • チート対策は必要か
  • セーブデータの改ざん手法
  • セーブデータの改ざん対策
  • メモリ改ざん手法
  • メモリ改ざん対策
  • コード改ざん手法
  • コード改ざん対策
  • まとめ

なお具体的なチートのやり方やツールについては一切触れません(悪用されたら困るので)。
チートの概要を紹介し、それに対して取れる対策方法を考えてみよう、という感じです。

チート対策は必要か

最初からこの記事の存在意義が揺らぐ問いかけですが、そもそもチート対策って必要なのでしょうか?
例えばスマホゲーム(オンラインゲーム)なら必須でしょう。
チートで不正にキャラクターを強くされると、ゲームが崩壊します。
「なんだこいつずっと無敵状態じゃないか」とかですね。
それはユーザーの不満に繋がり、ひいては売上の減少にもつながるでしょう(知らんけど)。

ですがここで僕が対象として考えているのはエロゲです。
僕のスタンスとしてはチートしたいならすればいいんじゃない? というものです。
というのも、オンライン機能を実装しているエロゲはともかくとして)、ふつーのエロゲはチートをされても別に誰も困らないんですよね(笑)
作者として「ちゃんと遊んで欲しい!」というのはあるかもですが、そこまで致命的に困ることはなく、ユーザーが単にゲームを楽にクリアできるくらいです。

そこを踏まえた上で、どのようなチートがあり、対策として取れることは何があるのかを考えていきたいと思います。

セーブデータの改ざん

真っ先に思いつくのはセーブデータの改ざんでしょう。
RPGツクールMVとUnityそれぞれの改ざん手法を見ていきます。

RPGツクールMVでのセーブデータ改ざん

RPGツクールMVではセーブに使うスクリプトはほぼほぼ固定でしょう。
セーブデータはJSON形式で保存されているため、ユーザーはそのデータを簡単に書き換えることができます。
ただし後述するように、若干の対策が取られてはいます(セーブデータの圧縮が目的なのだとは思いますが……)。

Unityでのセーブデータ改ざん

Unityでセーブデータを保存する際に使われる手法の一つはPlayerPrefsでしょう。
入門記事とかでデータの保存によく使われているかと思います。
こちらはWindowsの場合だとレジストリにデータを保存するため、ユーザーが簡単に値を改変することができます。

他の方法としては例えばJSON形式でセーブデータを保存する方法があります(RPGツクールMVと同じですね)。
こちらも生のデータを保存してしまっていると、ユーザーはそのデータを簡単に書き換えることができます。

フォロワー以上限定無料

続きが読めます

無料

【 プラグイン制作応援プラン 】プラン以上限定 支援額:300円

続きが読めます

このバックナンバーを購入すると、このプランの2019/08に投稿された限定特典を閲覧できます。 バックナンバーとは?

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

記事のタグから探す

月別アーカイブ

記事を検索