//============================================================================= // NRP_LevelUpDirection.js //============================================================================= /*: * @target MV MZ * @plugindesc v1.001 Added parameter display and direction at level-up. * @author Takeshi Sunagawa (https://newrpg.seesaa.net/) * @orderAfter NRP_VictoryRewards * @url https://newrpg.seesaa.net/article/499197962.html * * @help The following features will be added at level up. * * - Display of parameters to be raised. * - Specify sound effects and ME. * - Move actors by DynamicAnimation&Motion. * - Consider cooperation with NRP_AdditionalClasses.js. * * ------------------------------------------------------------------- * [Usage] * ------------------------------------------------------------------- * When applied, it will display the parameters * that increase when the level is raised. * You can then set the sound effects, etc. to your liking. * * Note that to work with DynamicAnimation&Motion and AdditionalClasses, * you need to install the corresponding plug-ins. * * ------------------------------------------------------------------- * [About DynamicMotion] * ------------------------------------------------------------------- * If a motion is specified by DynamicMotion, * the normal victory motion will be canceled. * * If necessary, reassign the motion * at the end of the skill's note as follows. * Note that you may specify something other than a victory motion. * * * motion = victory * * * ------------------------------------------------------------------- * [Application] * ------------------------------------------------------------------- * Fine-tuning is also possible by using control characters. * For example, if the display format is "\c[15]%1\c[0] +%2", * you can change the color of only the parameter name. * * You can also insert a wait time between the level-up of terms, * such as "%1 is now %2 %3!\|\|". * This can also make the ME wait for the performance. * * ------------------------------------------------------------------- * [Terms] * ------------------------------------------------------------------- * There are no restrictions. * Modification, redistribution freedom, commercial availability, * and rights indication are also optional. * The author is not responsible, * but will deal with defects to the extent possible. * * @----------------------------------------------------- * @ [Plugin Parameters] * @----------------------------------------------------- * * @param ParameterList * @type struct[] * @default ["{\"ParameterId\":\"0\",\"Memo\":\"Max HP\",\"DisplayName\":\"\"}","{\"ParameterId\":\"1\",\"Memo\":\"Max MP\",\"DisplayName\":\"\"}","{\"ParameterId\":\"2\",\"Memo\":\"Attack\",\"DisplayName\":\"\"}","{\"ParameterId\":\"3\",\"Memo\":\"Defence\",\"DisplayName\":\"\"}","{\"ParameterId\":\"4\",\"Memo\":\"M.Attack\",\"DisplayName\":\"\"}","{\"ParameterId\":\"5\",\"Memo\":\"M.Defense\",\"DisplayName\":\"\"}","{\"ParameterId\":\"6\",\"Memo\":\"Agility\",\"DisplayName\":\"\"}","{\"ParameterId\":\"7\",\"Memo\":\"Luck\",\"DisplayName\":\"\"}"] * @desc List of parameters to be displayed at level-up. * * @param NumberOfColumns * @type number * @default 2 * @desc The number of columns for displaying parameters. * * @param DisplayFormat * @type string * @default %1 +%2 * @desc This format displays the amount of the parameter increase. %1: Parameter Name, %2: Value * * @param LevelUpSe * @type file * @dir audio/se * @desc The sound effect that is played when the level is raised. * * @param LevelUpMe * @type file * @dir audio/me * @desc ME to be played at the time of level up. * * @param DynamicSkill * @type skill * @desc DynamicAnimation&Motion skills to be performed at level up. * * @param * @desc This item is for integration with NRP_AdditionalClasses.js. * * @param AC_LevelUpSe * @parent * @type file * @dir audio/se * @desc The sound effect that is played when an additional class is leveled up. * * @param AC_LevelUpMe * @parent * @type file * @dir audio/me * @desc ME to be played at the level of additional classes. * * @param AC_DynamicSkill * @parent * @type skill * @desc DynamicAnimation&Motion skills to be performed at the level up of additional classes. */ /*~struct~Parameter: * @param ParameterId * @type number * @desc ID of the parameter. * Default: 0,1,2,3,4,5,6,7 0:MHP-7:Luck * * @param Memo * @type string * @desc Discrimination notes. * Not used in the game. * * @param DisplayName * @type string * @desc The name that will appear on the screen. * If left blank, it will be used directly from the term. */ /*:ja * @target MV MZ * @plugindesc v1.001 レベルアップ時にパラメータ表示や演出を追加 * @author 砂川赳(https://newrpg.seesaa.net/) * @orderAfter NRP_VictoryRewards * @url https://newrpg.seesaa.net/article/499197962.html * * @help レベルアップ時に以下のような機能を追加します。 * * ・上昇パラメータの表示。 * ・効果音やMEを指定。 * ・DynamicAnimation&Motionによってアクターを動かす。 * ・多重職業プラグインとの連携も考慮。 * * ------------------------------------------------------------------- * ■使用方法 * ------------------------------------------------------------------- * 適用するとレベルアップ時の上昇パラメータが表示されるようになります。 * あとはお好みで効果音などを設定してください。 * * なお、DynamicAnimation&Motionや多重職業プラグインとの連携には、 * 該当のプラグインを導入する必要があります。 * * ------------------------------------------------------------------- * ■DynamicMotionについて * ------------------------------------------------------------------- * DynamicMotionによって、モーションを指定した場合は、 * 通常の勝利モーションが解除されます。 * * 必要ならスキルのメモ欄の末尾で * 以下のようにモーションを再設定してください。 * なお、勝利モーション以外のものを指定しても構いません。 * * * motion = victory * * * ------------------------------------------------------------------- * ■応用 * ------------------------------------------------------------------- * 制御文字を使用することで細かい調整も可能です。 * 例えば、表示フォーマットを「\c[15]%1\c[0] +%2」とすれば、 * パラメータ名だけ色を変えることができます。 * * 他にも用語のレベルアップに「%1は%2 %3 に上がった!\|\|」というように * ウェイトを挟めば、MEの演奏待ちをさせたりできます。 * * ------------------------------------------------------------------- * ■利用規約 * ------------------------------------------------------------------- * 特に制約はありません。 * 改変、再配布自由、商用可、権利表示も任意です。 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。 * * @----------------------------------------------------- * @ プラグインパラメータ * @----------------------------------------------------- * * @param ParameterList * @text パラメータ一覧 * @type struct[] * @default ["{\"ParameterId\":\"0\",\"Memo\":\"最大HP\",\"DisplayName\":\"\"}","{\"ParameterId\":\"1\",\"Memo\":\"最大MP\",\"DisplayName\":\"\"}","{\"ParameterId\":\"2\",\"Memo\":\"攻撃力\",\"DisplayName\":\"\"}","{\"ParameterId\":\"3\",\"Memo\":\"防御力\",\"DisplayName\":\"\"}","{\"ParameterId\":\"4\",\"Memo\":\"魔法力\",\"DisplayName\":\"\"}","{\"ParameterId\":\"5\",\"Memo\":\"魔法防御\",\"DisplayName\":\"\"}","{\"ParameterId\":\"6\",\"Memo\":\"敏捷性\",\"DisplayName\":\"\"}","{\"ParameterId\":\"7\",\"Memo\":\"運\",\"DisplayName\":\"\"}"] * @desc レベルアップ時に表示するパラメータの一覧です。 * * @param NumberOfColumns * @text 列数 * @type number * @default 2 * @desc パラメータを表示する際の列数です。 * * @param DisplayFormat * @text 表示フォーマット * @type string * @default %1 +%2 * @desc パラメータの上昇量を表示するフォーマットです。 * %1: パラメータ名, %2: 上昇量 * * @param LevelUpSe * @text レベルアップ効果音 * @type file * @dir audio/se * @desc レベルアップ時に鳴らす効果音です。 * * @param LevelUpMe * @text レベルアップME * @type file * @dir audio/me * @desc レベルアップ時に演奏するMEです。 * * @param DynamicSkill * @text Dynamic用スキル * @type skill * @desc レベルアップ時に実行するDynamicAnimation&Motionのスキルです。 * * @param * @text <多重職業連携用> * @desc 多重職業プラグインとの連携用の項目です。 * * @param AC_LevelUpSe * @text レベルアップ効果音 * @parent * @type file * @dir audio/se * @desc 追加職業のレベルアップ時に鳴らす効果音です。 * * @param AC_LevelUpMe * @text レベルアップME * @parent * @type file * @dir audio/me * @desc 追加職業のレベルアップ時に演奏するMEです。 * * @param AC_DynamicSkill * @text Dynamic用スキル * @parent * @type skill * @desc 追加職業のレベルアップ時に実行するDynamicAnimation&Motionのスキルです。 */ /*~struct~Parameter:ja * @param ParameterId * @text パラメータID * @type number * @desc パラメータのIDです。初期値:0,1,2,3,4,5,6,7 * 0:最大HP~7:運となります。 * * @param Memo * @text メモ * @type string * @desc 判別用のメモです。 * ゲーム内では使用されません。 * * @param DisplayName * @text 表示名 * @type string * @desc 画面上に表示される名称です。 * 空欄なら用語からそのまま使用されます。 */ (function() { "use strict"; /** * ●構造体(二重配列)をJSで扱えるように変換 */ function parseStruct2(arg) { const ret = []; if (arg) { for (const str of JSON.parse(arg)) { ret.push(JSON.parse(str)); } } return ret; } function toNumber(str, def) { if (str == undefined || str == "") { return def; } return isNaN(str) ? def : +(str || def); } function toBoolean(str, def) { if (str === true || str === "true") { return true; } else if (str === false || str === "false") { return false; } return def; } function setDefault(str, def) { if (str == undefined || str == "") { return def; } return str; } const PLUGIN_NAME = "NRP_LevelUpDirection"; const parameters = PluginManager.parameters(PLUGIN_NAME); const pParameterList = parseStruct2(parameters["ParameterList"]); const pNumberOfColumns = toNumber(parameters["NumberOfColumns"]); const pDisplayFormat = setDefault(parameters["DisplayFormat"]); const pLevelUpSe = parameters["LevelUpSe"]; const pLevelUpMe = parameters["LevelUpMe"]; const pDynamicSkill = parameters["DynamicSkill"]; // 多重職業用 const pAC_LevelUpSe = parameters["AC_LevelUpSe"]; const pAC_LevelUpMe = parameters["AC_LevelUpMe"]; const pAC_DynamicSkill = parameters["AC_DynamicSkill"]; // レベルアップ検出用の制御文字 const LEVEL_UP_CODE = "LUC"; const AC_LEVEL_UP_CODE = "ACLUC"; //----------------------------------------------------------------------------- // Game_Actor //----------------------------------------------------------------------------- // レベルアップ前のアクター let mOldActor = null; let mIsLevelUpDirection = false; const _Game_Actor_changeExp = Game_Actor.prototype.changeExp; Game_Actor.prototype.changeExp = function(exp, show) { // レベルアップ前のアクターを保持しておく。 mOldActor = JsonEx.makeDeepCopy(this); mIsLevelUpDirection = true; _Game_Actor_changeExp.apply(this, arguments); mOldActor = null; }; /** * ●レベルアップメッセージの表示 */ const _Game_Actor_displayLevelUp = Game_Actor.prototype.displayLevelUp; Game_Actor.prototype.displayLevelUp = function(newSkills) { _Game_Actor_displayLevelUp.apply(this, arguments); // メッセージを生成 const lvupMessages = []; let count = 1; let tempMessage = ""; if (pParameterList) { // 表示パラメータ毎にループ for (const paramData of pParameterList) { const paramId = toNumber(paramData.ParameterId); // パラメータ上昇量を取得 const value = this.param(paramId) - mOldActor.param(paramId); // パラメータ名 const paramName = setDefault(paramData.DisplayName) ?? TextManager.param(paramId); // メッセージを追加 tempMessage += pDisplayFormat.format(paramName, value); // 出力した項目数が列数で割り切れる場合 if (count % pNumberOfColumns == 0) { // 改行を追加 lvupMessages.push(tempMessage); tempMessage = ""; // 最終要素の場合 } else if (paramId == pParameterList[pParameterList.length - 1]) { // 改行を追加 lvupMessages.push(tempMessage); // それ以外 } else { // 半角スペースを追加 tempMessage += " "; } count++; } } // 本来のレベルアップメッセージを取得 const levelUpMessage = TextManager.levelUp.format( this._name, TextManager.level, this._level ); // 出力するメッセージを後ろから検索する。 for (let i = $gameMessage._texts.length - 1; i >= 0; i--) { // レベルアップメッセージを探す。 if ($gameMessage._texts[i] == levelUpMessage) { // レベルアップメッセージの前にレベルアップ検出用の制御文字を埋め込む。 // ※\LUC[アクターID] $gameMessage._texts[i] = "\\" + LEVEL_UP_CODE + "[" + this.actorId() + "]" + $gameMessage._texts[i]; // 一行あとにパラメータ上昇量を出力 for (const lvupMessage of lvupMessages) { $gameMessage._texts.splice(i + 1, 0, lvupMessage); i++; } return; } } }; //----------------------------------------------------------------------------- // Window_Message //----------------------------------------------------------------------------- /** * ●制御文字の処理 */ const _Window_Message_processEscapeCharacter = Window_Message.prototype.processEscapeCharacter; Window_Message.prototype.processEscapeCharacter = function(code, textState) { // レベルアップ検出用の制御文字と一致した場合 if (mIsLevelUpDirection && code == LEVEL_UP_CODE) { // アクターIDを取得 const actorId = this.obtainEscapeParam(textState); // DynamicAnimationの指定がある場合は呼び出し if (pDynamicSkill) { const actor = $gameActors.actor(actorId); callDynamic(actor, pDynamicSkill); } // 効果音 if (pLevelUpSe) { AudioManager.playSe({"name":pLevelUpSe, "volume":90, "pitch":100, "pan":0}) } // ME if (pLevelUpMe) { AudioManager.playMe({"name":pLevelUpMe, "volume":90, "pitch":100, "pan":0}) } return; } _Window_Message_processEscapeCharacter.apply(this, arguments); }; //----------------------------------------------------------------------------- // BattleManager //----------------------------------------------------------------------------- /** * ●戦闘終了 */ const _BattleManager_updateBattleEnd = BattleManager.updateBattleEnd; BattleManager.updateBattleEnd = function() { _BattleManager_updateBattleEnd.apply(this, arguments); // 演出判定終了 mIsLevelUpDirection = false; } // ---------------------------------------------------------------------------- // NRP_AdditionalClasses.jsとの連携 // ---------------------------------------------------------------------------- if (typeof AdditionalClass !== "undefined") { const AC_PLUGIN_NAME = "NRP_AdditionalClasses"; const acParameters = PluginManager.parameters(AC_PLUGIN_NAME); const pLvUpMessage = setDefault(acParameters["LvUpMessage"]); /** * ●レベルアップメッセージの表示 */ const _AdditionalClass_displayLevelUp = AdditionalClass.prototype.displayLevelUp; AdditionalClass.prototype.displayLevelUp = function(newSkills) { _AdditionalClass_displayLevelUp.apply(this, arguments); // レベルアップメッセージがない場合はどうしようもないので終了 if (!pLvUpMessage) { return; } const actor = this.actor(); const levelUpMessage = pLvUpMessage.format( actor.name(), this.name, this._level ); // 出力するメッセージを後ろから検索する。 for (let i = $gameMessage._texts.length - 1; i >= 0; i--) { // レベルアップメッセージを探す。 if ($gameMessage._texts[i] == levelUpMessage) { // レベルアップメッセージの前にレベルアップ検出用の制御文字を埋め込む。 // ※\ACLUC[アクターID] $gameMessage._texts[i] = "\\" + AC_LEVEL_UP_CODE + "[" + actor.actorId() + "]" + $gameMessage._texts[i]; return; } } }; /** * ●制御文字の処理 */ const _Window_Message_processEscapeCharacter2 = Window_Message.prototype.processEscapeCharacter; Window_Message.prototype.processEscapeCharacter = function(code, textState) { // レベルアップ検出用の制御文字と一致した場合 if (code == AC_LEVEL_UP_CODE) { // アクターIDを取得 const actorId = this.obtainEscapeParam(textState); // DynamicAnimationの指定がある場合は呼び出し if (pAC_DynamicSkill) { const actor = $gameActors.actor(actorId); callDynamic(actor, pAC_DynamicSkill); } // 効果音 if (pAC_LevelUpSe) { AudioManager.playSe({"name":pAC_LevelUpSe, "volume":90, "pitch":100, "pan":0}) } // ME if (pAC_LevelUpMe) { AudioManager.playMe({"name":pAC_LevelUpMe, "volume":90, "pitch":100, "pan":0}) } return; } _Window_Message_processEscapeCharacter2.apply(this, arguments); }; } //----------------------------------------------------------------------------- // 共通関数 //----------------------------------------------------------------------------- /** * ●DynamicAnimation&Motionを呼び出し */ function callDynamic(battler, dynamicId) { // 戦闘時以外は処理しない。 if (!$gameParty.inBattle()) { return; } // 実行するDynamicAnimation情報を持ったアクション const dynamicAction = makeAction(dynamicId, battler); // バトラーを対象にする。 const targets = [battler]; // 引き継ぎたい情報をセット const mapAnimation = []; // バトラーを行動主体にする。 // ※これがないと行動主体を取得できない。 mapAnimation.subject = battler; // 空のWindow_BattleLogを作成し、DynamicAnimationを起動 const win = new Window_BattleLog(new Rectangle()); win.showDynamicAnimation(targets, dynamicAction, false, mapAnimation); } /** * ●アクション情報の作成 */ function makeAction(itemId, battleSubject, isItem) { // 適当に先頭のキャラを行動主体にしてアクションを作成 // ※行動主体の情報は基本的に使わないので実際はほぼダミー let subject = $gameParty.members()[0]; if (battleSubject) { subject = battleSubject; } const action = new Game_Action(subject); // アイテムかスキルかで分岐 if (isItem) { action.setItem(itemId); } else { action.setSkill(itemId); } return action; } })();