【解決済み】ショップ店員にセールストークされたい

シュガー

ユーザー
誰かへの宣戦布告さんのショップ店員プラグインを使おうと思っています。

アイテムヘルプを非表示にし、商人ごとに違ったアイテムごと別々の説明をしてくれる、所謂セールストークをさせたいなと思っています。
独力では実装できなさそうな為、書き込ませていただきます。
(アイテムヘルプ非表示にすることで、闇市や旅商人から粗悪品を売りつけられたい!と思ってのことです。
 キャラチップが表示できないイベント中でもショップ画面を色づけることができ、
 パーティに商人がいる場合にメニューからショップを開けるようにして、仲間からアイテムを売買している雰囲気を出せたら良いなと思いました。)


image_20200602_221353.png

想定しているものとしては、
イベントの実行内容からスクリプトでショップを開いて、売り物の配列の5番目(例:g1 = [0,1,0,0,'ここにセールストーク'])にセールストークを記載し、
カーソルをあわせたアイテムに設定されているセールストークが表示されるというものです。

カーソル(で名称はあってる?)をあわせているアイテムの情報をどうすればウインドウに表示できるのかがわからず詰んでいます...。
※当方のプログラミング知識は数値はいじれるけど要素をうまく追加できないくらいの理解度です。

解決策や似たようなことができる方法・プラグインなどご存じの方がおられましたらぜひ報告お願いします。
 

タシラカ

ユーザー
どうもこんにちは
プラグインの内容見る限りそんなに難しそうな改造ではないですね
この例文書けるならご自分で出来る気もしますけど。ポイントは二つ
①Window_ShopTextのデフォルトトークの削除
②Window_ShopBuyのヘルプ表示機構の改造
このあたりですかね

①は…確認したら変数を設定しなければ非表示のままなんですね。
なら弄る必要はないかな~。
②は…商品一覧を管理するWindow_ShopBuyには
デフォルトでa.ヘルプウィンドウの関連付け、及びb.ヘルプウィンドウの更新をする処理が存在します。
a.はScene_Shop.prototype.createTextWindowでテキストウィンドウを生成した後にヘルプウィンドウを乗っ取ります。
JavaScript:
    // ヘルプウィンドウの上書き
    var _Scene_Shop_createTextWindow = Scene_Shop.prototype.createTextWindow;
    Scene_Shop.prototype.createTextWindow = function() {
        _Scene_Shop_createTextWindow.call(this);
        this._buyWindow.setHelpWindow(this._textWindow);
    };
b.はWindow_ShopBuy.prototype.updateHelpあたりの書き換えが妥当ですかね。
JavaScript:
    // ヘルプウィンドウの更新処理の上書き
    Window_ShopBuy.prototype.updateHelp = function() {
        if (this._helpWindow && this._index >= 0) {
            var text = this._shopGoods[this._index][4] || "未設定";
            this._helpWindow.contents.clear();
            this._helpWindow.drawTextEx(text, Params.messageStartX, Params.messageStartY);
        }
    };
ついでにキャンセルした後にいつまでもテキストが残ってると見栄えが悪いのでそこも変更。
JavaScript:
    // 購入ウィンドウキャンセル時のテキスト消去追加
    Window_ShopBuy.prototype.processCancel = function() {
        Window_Selectable.prototype.processCancel.call(this);
        if(this._helpWindow) this._helpWindow.contents.clear();
    };
あとはスクリプトからのマニュアル起動でいけるんじゃないですかね。
JavaScript:
g1 = [0,1,0,0,'ここにセールストーク'];
g2 = [1,1,0,0,'高い\|不味い\|遅い'];
g3 = [2,1,0,0];
goods = [g1, g2, g3];
SceneManager.push(Scene_Shop);
SceneManager.prepareNextScene(goods, true);
簡易プラグインにでも切り離そうかと思ったんですけどParams.messageStartXの直接取得がネックになってるので
店員ショップ.jsを弄るのは不可欠ですかね。とりま末尾の})();の直前にでも上の三つの処理を加えれば動くと思います。
リファクタリングの余地はありますが一応要件は満たしたと思うんですけど
疑問点や痒いところに手が届かないようならしばらくはこのフォーラムをチェックしているので対応するかもしれません。
まだテストも甘いのでバグが残ってるかもしれませんし。
 
最後に編集:

シュガー

ユーザー
タシラカさんこんにちは。
丁寧な解説ですごく助かりました。
プラグインの末尾直前に三つの処理を書いたら想定通りの動きができ、
店員さんにセールストークさせることが叶いました。ありがとうございます!
ランダムで出現する詐欺師だったり、パーティメンバーとの売買イベントが作れそうで今からとってもワクワクします:kaohi:


セールストークの実装に関しては解決済みにはなるのですが、
お言葉に甘えさせて頂く形でこうしたいと思ってるところを書かせていただきます。

現在、トリアコンタンさん作のヘルプウィンドウ説明の拡張プラグインを使っているのですが、
上手く噛み合わなかったようで、いい感じに修正したいと思ってます。(まだスクリプトとにらめっこして原因チェック中...)
 

タシラカ

ユーザー
ういうい
自分もエラーを確認しました
TypeError : this._helpWindow.setParentWindow is not a function
どうやらコンタンさんは快適な操作性の為にウィンドウの親子関係を登録する処理を新設しているみたいです。
そして私の改造ではヘルプウィンドウではない物をヘルプウィンドウとして突っ込んでるので擬態し切れずエラーが出るようですね。
抜け道はいくつかあるんですがヘルプウィンドウが持つべき振舞いをテキストウィンドウに持たせる事でクリア出来ます。
自己満全開なそれっぽい擬態を書きたいのは山々なんですけど誰がどう見ても疑念の余地がないダミーで充分でしょう。
JavaScript:
    // AdditionalDescriptionの競合対応処理
    Window_Shop_Text.prototype.setParentWindow = function(){};
これを最初の三つの処理の更に下にでも入れておけば動くと思いますよ?
本来ヘルプウィンドウの拡張説明に使う為の処理なので、購入画面で従来のヘルプを使うつもりがないなら
親からの呼び出しは適当に返事して誤魔化しておけばおっけーです。
 

シュガー

ユーザー
タシラカさん、爆速の返答ありがとうございます!
無事に想定通りの仕様で両方のプラグインを動かせました。
ショップ画面でアイテムヘルプを確認できてしまうと商人の不正がバレちゃうので、現在の仕様で完璧です!
これでメニューに戻って確認した際の粗悪品アイテムの説明を長々と書けます。

これで解決済みとさせていただきます。ありがとうございました。
 
トップ