【解決済み】メイン職業とは別に、複数の技能の取得

るーさん
記事: 12
登録日時: 2021年6月21日(月) 14:00

【解決済み】メイン職業とは別に、複数の技能の取得

投稿記事by るーさん » 2021年6月21日(月) 14:24

はじめまして。つい先日ツクールMZを購入したばかりの新参で、ツクールシリーズに触れるのも初めてです。
C#はある程度学んでいますが、JavaScriptは初めてです。
早速質問なのですが、以下のようなシステムを実装することは可能でしょうか。

・アクターの職業はメイン職業(例:剣士)
・メイン職業に加えて複数の技能を取得できる(以下に詳細を記述)
 ・例としてこんな状況です
    アクター名:リード 
       職業:剣士(レベル50)
       技能:帝国流剣術(レベル15)
          サバイバル術(レベル2)
          火炎魔法(レベル10)
 ・更にそれぞれの技能において一定のレベル条件を達成するとスキルを獲得できる
  例:火炎魔法 LV1 ファイア
         LV5 エクスプロージョン

失礼や説明不足、既出の質問であったら申し訳ないです。どうか回答の程、お願いいたします。
最後に編集したユーザー るーさん on 2021年6月23日(水) 14:46 [ 編集 1 回目 ]

アバター
WTR
記事: 558
登録日時: 2015年12月22日(火) 19:14

Re: メイン職業とは別に、複数の技能の取得

投稿記事by WTR » 2021年6月21日(月) 17:55

可能でしょうか、という質問はいつも悩みます。
RPGツクールの製品仕様やJavaScriptの言語仕様に関わること以外では
むしろ不可能なことのほうが希少であとは技能とか覚悟のほど次第という…

既存のプラグインで近そうなのは
http://www.yanfly.moe/wiki/Class_Change ... uStella_MZ

購入したことがないので詳細はわかりませんが
クラスチェンジUIも含めてガッツリ作りこまれているようですし
求めているものそのものかどうかはわかりません。
難読化されていて改変しようと思っても無理という話も聞いた気がします。

大手が提供しているからか類似プラグインがあまり作られない土壌がある…のかもしれません。
他には見つけられませんでした。

あとはMVの話ですが最近似たような話を見ました。
viewtopic.php?f=23&t=11469
別のアクターを用意してサブクラスとして扱う…みたいなアプローチのようですが相当大変そう。
JSはともかく他の言語ならある程度…という方なら
仕組みをまるごと作っちゃった方が早いかもしれないしベストな方法かどうかはわかりません。

繰り返しですが
出来るか出来ないかで言えば出来る。
ただその方法は、何が出来るのか、どこまでやりたいか次第なんじゃないでしょうか。
Twitter、はじめました。
https://twitter.com/wtr_in_reverie/
るーさん
記事: 12
登録日時: 2021年6月21日(月) 14:00

Re: メイン職業とは別に、複数の技能の取得

投稿記事by るーさん » 2021年6月21日(月) 21:58

ご回答ありがとうございます!
可能でしょうか、というのは確かに少しおかしかったですね…質問の意図としてはそういったことが可能なプラグイン、または参考になりそうなスクリプトを教えて頂きたかったという感じです。
プラグインについて教えて頂きましたが、ピンポイントなものではなく少し難しいようでしたので、失礼ながらもう少し他の方の回答を待たせて頂こうと思います。

追記:
教えて頂いたプラグインに関して見てみたのですが、やりたいことはできそうでした!
ただ海外のものであるため言語の壁が…というのが大きくて迷っています…
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: メイン職業とは別に、複数の技能の取得

投稿記事by 名無し蛙 » 2021年6月22日(火) 13:30

質問の内容がよく分かりませんでした

・(職業、スキルとは別に)技能という機構を新たに構築したい
-技能にはレベルが存在する
-技能レベルが一定に達するとスキルを習得する

という事ですか?
そして仮定に仮定を重ねる事になりますけど

・操作可能なアクターは何人を想定しているのか?
-一人or複数(固定)or不特定多数
・技能の習得方法は?
-アイテム使用に拠るものか、装備(特徴)に拠るものか、イベント習得に拠るものか
・技能は付け外し可能なのか
-専用の編集画面で着脱するのか、あるいはイベント等で済ませるのか
・技能レベルが上昇する条件は何なのか?
-イベントや確率なので上昇するのか、あるいは累積経験値によって上昇するのか
--経験値は職業経験値と共用なのか、あるいは別に技能経験値を作るのか
---経験値は所持技能に等倍で割り振られるのか、分割で割り振られるのか、または任意割り振りなのか

と色々不明瞭な点が多いのであまり具体的な助言は出来ないと思います。
簡略化を重ねればイベントと変数だけで充分だし
アクターに新しい機構を作りたいならGame_Actorの仕様を理解するしかないのでは。
コアスクリプトをベースに自分でシステム構築するのならまだ今後も質問に答えようはありますけど
他者の、それも有償プラグインをベースにするとなると外野が質問に答えようが有りませんし
メンテナンスも大変だと思うのでご自分でコーディングする前提ならそこはよく考えた方が良いと思います。
るーさん
記事: 12
登録日時: 2021年6月21日(月) 14:00

Re: メイン職業とは別に、複数の技能の取得

投稿記事by るーさん » 2021年6月22日(火) 23:07

>>名無し蛙さん、ご返信ありがとうございます!
・(職業、スキルとは別に)技能という機構を新たに構築したい
-技能にはレベルが存在する
-技能レベルが一定に達するとスキルを習得する
その通りです!職業とは違い、能力値の増減などはないものと考えております。

・操作可能なアクター数は厳密には決めていませんが、制作者(自分)が用意した複数のアクターを想定しています。
例)ゲーム内には10人のアクターが用意されており、そのすべてのキャラクターが操作可能。

・技能の習得方法はイベントです。イベントを経ることで技能の習得タイミングが訪れ、プレイヤーの任意のアクターに技能を習得させたいと考えています。また、特定のアクターにのみ技能が習得できるイベントも作りたいと考えています。
例1)会話イベント「慈愛の女神」をクリア!技能「神聖魔法」を習得できます!誰に習得させますか?
  >リード
   プリシア
   ゲイル
   ミシェル
  (プレイヤーはリードを選択)
  リードは神聖魔法(レベル1)を習得した!
例2)戦闘イベント「不屈の勇者」をクリア!技能「勇者」を習得できます!技能「勇者」を習得できるのはリードのみです。習得させますか?
  >はい
   いいえ
  (プレイヤーは「はい」を選択)
  リードは勇者(レベル1)を習得した!

・技能の付け外しはプレイヤーにはできない想定です。基本的に技能を習得していることで不利な効果はないものと考えているのでプレイヤーは技能を外したいと考えることはないバランスにするつもりです。但し、強制的に技能が外れてしまうようなイベントも用意したいと考えております。

・技能レベルの上昇条件は獲得経験値です。技能の習得時はレベル1で習得し、その後の戦闘などで経験値を獲得するとレベルが上昇していきます。経験値は職業経験値と同じもので良く、獲得経験値がそのまま全ての技能に与えられるよう考えております。
例)スライムを倒した!52の経験値を手に入れた!
  ((職業)剣士に52の経験値)剣士のレベルが20になった!
  (帝国流剣術に52の経験値)
  (サバイバル術に52の経験値)
  (火炎魔法に52の経験値)火炎魔法のレベルが5に上がった!スキル「エクスプロージョン」を獲得した!

といった感じです。
WTRさんに頂いた助言より、他者の有償プラグインを利用することでどうにかできそうだと考えています。が、そのプラグインをベースにすると決めているわけではありません。
そのプラグインが日本語ではなかったため、もし他に方法や別のプラグインがあるのでしたら教えて頂きたいといった状態です。
名無し蛙
記事: 302
登録日時: 2015年11月23日(月) 02:46

Re: メイン職業とは別に、複数の技能の取得

投稿記事by 名無し蛙 » 2021年6月23日(水) 13:39

どこまで教えるべきか判断が難しいですね。
プラグインというと難しく考えがちですが実際、核になるコードは非常に簡単で

コード: 全て選択

(() => {
    "use strict"
    // アクターのセットアップ
    Game_Actor.prototype.setup = function(actorId) {
        const actor = $dataActors[actorId];
        this._actorId = actorId;
        this._name = actor.name;
        this._nickname = actor.nickname;
        this._profile = actor.profile;
        this._classId = actor.classId;
        this._level = actor.initialLevel;
        this.initImages();
        this.initAbilities(); // added
        this.initExp();
        this.initSkills();
        this.initEquips(actor.equips);
        this.clearParamPlus();
        this.recoverAll();
    };
   
    // アビリティの初期化
    Game_Actor.prototype.initAbilities = function() {
        this._abilities = [];
        this._levelAbility = {};
        this._expAbility = {};
    };

    // アビリティの習得
    Game_Actor.prototype.learnAbility = function(abilityId) {
        if( this._abilities.includes(abilityId) ) return;
        this._abilities.push(abilityId);
        if ( !this._levelAbility[abilityId] ) {
            this._levelAbility[abilityId] = 1;
            this._expAbility[abilityId] = 0;
        }
    };

    // アビリティの忘却
    Game_Actor.prototype.forgetAbility = function(abilityId) {
        if( !this._abilities.includes(abilityId) ) return;
        this._abilities.remove(abilityId);
    };

    // アビリティ配列の取得
    Game_Actor.prototype.abilities = function() {
        return this._abilities.map( abilityId => $dataClasses[abilityId] );
    };

    // 特徴オブジェクトの取得
    const _Game_Actor_traitObjects = Game_Actor.prototype.traitObjects;
    Game_Actor.prototype.traitObjects = function() {
        const objects = _Game_Actor_traitObjects.apply(this, arguments);
        return objects.concat(this.abilities());
    };
})();

おそらくこの程度だと思います。内容は短いですがプラグイン書式の基礎や、
拡張性を考慮してメソッドの改造・追加・新規作成判断の取捨選択を詰め込んでいます。
ここからコアスクリプトを参考に経験値の加算、レベルアップ、及びそれに伴うスキル習得。
メニュー/ステータス画面での技能反映等こつこつ拡張していけば目的のプラグインになります。
いきなりツクールMZのコアスクリプト(rmmz_objects.js)直読みは骨が折れますが
OOPの下地があるのなら気長に学習していけばいずれ完成するんじゃないですかね。

余談ですけどツクールのプラグイン作者は皆、コアスクリプトを自力で読み解いて学習します。
VXAceの頃はメソッドに全て日本語コメントが振ってあったりスクリプトチュートリアルがありましたが
MVを機にその辺をばっさりカットしてしまった為取っつき辛さは誰もが認めるところです。
最近だと有志でスクリプトリファレンスを作成/公開している方もいらっしゃいますが
システムの改造をしたいのならこの辺をよく理解しておいた方が良いですね。
具体的な実装上の問題や疑問に行き当たった時にあらためて質問を投げれば誰かが答えるでしょう。

追記で。一応現時点での動作確認方法を記載しておきます。
おまけの仕様として習得中の技能に設定された特徴もアクターに反映されるようにしています。
イベントコマンド>スクリプトから

コード: 全て選択

// パーティの先頭メンバーを取得
const actor = $gameParty.leader();
// (データベース「職業」に設定した)技能の習得(id:6,id:7,id:8)
actor.learnAbility(6);
actor.learnAbility(7);
actor.learnAbility(8);
// 現在の技能一覧の名前をコンソールに表示
actor.abilities().forEach( ability => console.log(`技能:${ability.name}を習得中`) );
// 技能の忘却(累積した技能経験値はそのまま)
actor.forgetAbility(7);
最後に編集したユーザー 名無し蛙 on 2021年6月24日(木) 18:27 [ 編集 1 回目 ]
るーさん
記事: 12
登録日時: 2021年6月21日(月) 14:00

Re: メイン職業とは別に、複数の技能の取得

投稿記事by るーさん » 2021年6月23日(水) 14:46

ありがとうございます!!
C#はできるので何とかなるだろうと高を括って頑張ってみます!

回答をくださったWTRさん、名無し蛙さん、本当にありがとうございました!

“MZ:質問” へ戻る