DQ3:転職をイベントで作成する

DQ3の転職をイベントで作成してみました。

ダーマ神殿で神官に話しかけて転職するやつです。

勇者や死んでるのに転職しようとすると怒られます。

遊び人は悟りの書はいりません。

動画

実装したイベントのテキスト


◆文章:People4(6), ウィンドウ, 下
:  :ここは、転職を司るダーマの神殿。
:  :職業を変えたい者が来るところじゃ。
◆文章:People4(6), ウィンドウ, 下
:  :転職をご希望か?
◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
:はいのとき
◆ラベル:パーティー一覧
◆スクリプト:// パーティーメンバーの名前で選択肢を作成
:     :var choices = [];
:     :$gameParty.members().forEach(function(val, i) {
:     :  choices.push(val._name);
:     :});
:     :$gameMessage.setFaceImage("People4", 6);
:     :$gameMessage.setBackground(0);
:     :$gameMessage.setPositionType(2);
:     :$gameMessage.add("どなたの職業を変えたいのじゃ?");
:     :this.setupChoices([choices,-2,0,1,0]);
:     :this.setWaitMode('message');
◆スクリプト:// 選択結果を変数101に設定
:     :$gameVariables.setValue(101,this._branch[this._indent]+1);
:     :// 選択した場合(キャンセル以外)
:     :if (this._branch[this._indent] >= 0) {
:     :  // 選択したActorを変数102に設定
:     :  $gameVariables.setValue(102,$gameParty.members()[this._branch[this._indent]]);
:     :  // 選択したActor名を変数106に設定
:     :  $gameVariables.setValue(106,$gameParty.members()[this._branch[this._indent]]._name);
:     :}
◆条件分岐:TEMP101 < 0
◆文章:People4(6), ウィンドウ, 下
:  :ふむ・・・やめると申すか?
:  :それもよろしかろう。
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "終了") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆注釈:生死判定
◆スクリプト:// 選択したActorの生死をセルフスイッチAに設定
:     :$gameSelfSwitches.setValue([2, 1, "A"], $gameVariables.value(102).isAlive());
◆条件分岐:セルフスイッチ AがOFF
◆文章:People4(6), ウィンドウ, 下
:  :たわけが!
:  :\v[106]はいま、死んでおるではないか!
◆文章:People4(6), ウィンドウ, 下
:  :いくらわしでも、死んでおる者を
:  :転職させることはできんぞ。
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "他にも") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆注釈:勇者判定
◆スクリプト:// 選択したActorが勇者(ID:9)かをセルフスイッチAに設定
:     :$gameSelfSwitches.setValue([2, 1, "A"], $gameVariables.value(102).isClass($dataClasses[9]));
◆条件分岐:セルフスイッチ AがON
◆文章:People4(6), ウィンドウ, 下
:  :おろか者め!
:  :勇者をやめたいというのか?
:  :それだけはならんっ!
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) { :     : if (this._list[i].code === 118 && this._list[i].parameters[0] === "他にも") { :     : this.jumpTo(i); :     : break; :     : } :     :} ◆ :分岐終了 ◆注釈:レベル判定 ◆スクリプト:// レベル20以上かをセルフスイッチAに設定 :     :$gameSelfSwitches.setValue([2, 1, "A"], $gameVariables.value(102)._level >= 20);
:     :// 職業名を変数103に設定
:     :$gameVariables.setValue(103,$dataClasses[$gameVariables.value(102)._classId].name);
◆条件分岐:セルフスイッチ AがOFF
◆文章:People4(6), ウィンドウ, 下
:  :なんと、\v[106]は、まだ一人前の\v[103]に
:  :なっていないというに……。
:  :未熟者の分際で、
:  :もう職を替えたいとはなにごとじゃ!
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) { :     : if (this._list[i].code === 118 && this._list[i].parameters[0] === "他にも") { :     : this.jumpTo(i); :     : break; :     : } :     :} ◆ :分岐終了 ◆ラベル:職業選択 ◆注釈:職業選択肢作成 :  :勇者は除外 :  :賢者は遊び人か悟りの書所持のみ ◆スクリプト:var choices = []; :     :var idList = []; :     :$dataClasses.forEach(function(val, i) { :     : if (val === null || val.id === 9) return; :     : if (val.id === 8 && (!$gameVariables.value(102).isClass($dataClasses[6]) && !$gameParty.hasItem($dataItems[25]))) return; :     : :     : choices.push(val.name); :     : idList.push(val.id); :     :}); :     :// 職業IDリストを変数104に設定 :     :$gameVariables.setValue(104, idList); :     :this.setupChoices([choices,-2,0,1,0]); ◆スクリプト:$gameMessage.setFaceImage("People4", 6); :     :$gameMessage.setBackground(0); :     :$gameMessage.setPositionType(2); :     :$gameMessage.add($gameVariables.value(106) + "がなりたいのは、どの職業じゃな?"); :     :this.setWaitMode('message'); ◆スクリプト:// 選択結果を変数101に設定 :     :$gameVariables.setValue(101, this._branch[this._indent]); :     :// 選択した場合(キャンセル以外) :     :if (this._branch[this._indent] >= 0) {
:     :  // 選択した職業名を変数103に設定
:     :  var id = $gameVariables.value(104)[this._branch[this._indent]];
:     :  $gameVariables.setValue(103, $dataClasses[id].name);
:     :  // 選択した職業を変数105に設定
:     :  $gameVariables.setValue(105, $dataClasses[id]);
:     :}
◆条件分岐:TEMP101 < 0
◆文章:People4(6), ウィンドウ, 下
:  :ふむ・・・やめると申すか?
:  :それもよろしかろう。
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "他にも") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆文章:People4(6), ウィンドウ, 下
:  :\v[106]は、\v[103]になりたいと申すか?
◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
:はいのとき
◆スクリプト:// 選択した職業が今と同じかをセルフスイッチAに設定
:     :$gameSelfSwitches.setValue([2, 1, "A"], $gameVariables.value(102).isClass($gameVariables.value(105)));
◆条件分岐:セルフスイッチ AがON
◆文章:People4(6), ウィンドウ, 下
:  :うん?
:  :しかし、\v[106]はもうそれになっているぞ。
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "職業選択") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆文章:People4(6), ウィンドウ, 下
:  :一度レベル1に戻り、
:  :修行をし直す覚悟もおありじゃな?
◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
:はいのとき
◆文章:People4(6), ウィンドウ, 下
:  :おお神よ。
:  :\v[106]が新たな職に就くことを
:  :なにとぞお許しください!
◆スクリプト:AudioManager.playMe({"name":"Organ","volume":90,"pitch":100,"pan":0});
:     :this.wait(360);
◆スクリプト:// 賢者への転職かつ現職が遊び人以外の場合
:     :if ($gameVariables.value(105).id === 8 && !$gameVariables.value(102).isClass($dataClasses[6])) {
:     :  // 悟りの書を減らす
:     :  $gameParty.consumeItem($dataItems[25]);
:     :}
◆スクリプト:var param = [];
:     :param[0] = Math.floor($gameVariables.value(102).mhp / 2);
:     :param[1] = Math.floor($gameVariables.value(102).mmp / 2);
:     :param[2] = Math.floor($gameVariables.value(102).atk / 2);
:     :param[3] = Math.floor($gameVariables.value(102).def / 2);
:     :param[4] = Math.floor($gameVariables.value(102).mat / 2);
:     :param[5] = Math.floor($gameVariables.value(102).mdf / 2);
:     :param[6] = Math.floor($gameVariables.value(102).agi / 2);
:     :param[7] = Math.floor($gameVariables.value(102).luk / 2);
:     :param[8] = Math.floor($gameVariables.value(102).hp / 2);
:     :param[9] = Math.floor($gameVariables.value(102).mp / 2);
:     :$gameVariables.setValue(107, param);
◆スクリプト:// 職業変更
:     :var classId = $gameVariables.value(105).id;
:     :$gameVariables.value(102).changeClass(classId, false);
:     :$gameVariables.value(102).clearParamPlus();
◆スクリプト:// パラメータ変更
:     :$gameVariables.value(102).addParam(0, $gameVariables.value(107)[0] - $gameVariables.value(102).hp);
:     :$gameVariables.value(102).addParam(1, $gameVariables.value(107)[1] - $gameVariables.value(102).mp);
:     :$gameVariables.value(102).addParam(2, $gameVariables.value(107)[2] - $gameVariables.value(102).atk);
:     :$gameVariables.value(102).addParam(3, $gameVariables.value(107)[3] - $gameVariables.value(102).def);
:     :$gameVariables.value(102).addParam(4, $gameVariables.value(107)[4] - $gameVariables.value(102).mat);
:     :$gameVariables.value(102).addParam(5, $gameVariables.value(107)[5] - $gameVariables.value(102).mdf);
:     :$gameVariables.value(102).addParam(6, $gameVariables.value(107)[6] - $gameVariables.value(102).agi);
:     :$gameVariables.value(102).addParam(7, $gameVariables.value(107)[7] - $gameVariables.value(102).luk);
:     :$gameVariables.value(102).setHp(Math.min($gameVariables.value(107)[8], $gameVariables.value(107)[0]));
:     :$gameVariables.value(102).setMp(Math.min($gameVariables.value(107)[9], $gameVariables.value(107)[1]));
◆スクリプト:// 画像変更
:     :var actor = $gameVariables.value(102);
:     :var classNum = $gameVariables.value(105).id - 1;
:     :
:     :actor.setCharacterImage(actor._characterName, classNum);
:     :actor.setFaceImage(actor._faceName, classNum);
:     :actor.setBattlerImage(actor._battlerName.substr(0, actor._battlerName.length - 1) + classNum);
:     :// 最強装備
:     :actor.optimizeEquipments();
:     :
:     :$gamePlayer.refresh()
◆文章:People4(6), ウィンドウ, 下
:  :よろしい。
:  :では今から\v[106]は、\v[103]じゃ!
:  :\v[106]の装備は、
:  :新しい職業の物に替えておいたからな。
◆
:いいえのとき
◆文章:People4(6), ウィンドウ, 下
:  :ふむ・・・やめると申すか?
:  :それもよろしかろう。
◆
:分岐終了
◆
:いいえのとき
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "職業選択") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆
:いいえのとき
◆文章:People4(6), ウィンドウ, 下
:  :そうか。転職せぬのじゃな?
:  :まあ、それもよかろう。
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "終了") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:分岐終了
◆ラベル:他にも
◆文章:People4(6), ウィンドウ, 下
:  :他にも転職したい者はおるかな?
◆選択肢の表示:はい, いいえ (ウィンドウ, 右, #1, #2)
:はいのとき
◆スクリプト:// ラベルジャンプ
:     :for (var i = 0; i < this._list.length; i++) {
:     :  if (this._list[i].code === 118 && this._list[i].parameters[0] === "パーティー一覧") {
:     :    this.jumpTo(i);
:     :    break;
:     :  }
:     :}
◆
:いいえのとき
◆
:分岐終了
◆ラベル:終了
◆文章:People4(6), ウィンドウ, 下
:  :では、ゆくがよい。

大半がスクリプトになりました。

職業やアイテムはIDを固定で書いてます。

ラベルジャンプがスクリプトなのは、イベントのラベルジャンプを使うとメッセージウィンドウが閉じてしまうためです。

閉じずに処理を繰り返したかったのでこのような実装になりました。

ただ、スクリプトばかりなので、プラグインの方がいいようなきはしますね。

今回はイベントで実装しているので転職にはプラグインは使っていないのですが、移動部分にトリアコンタンさんの半歩移動プラグインを使用しています。

次は何をしようかな~、もうちょっとテクニカルなことをしたいような。

 

%d人のブロガーが「いいね」をつけました。