/*: * @plugindesc Allows players to distribute points to different stats of the Actors at his or her discretion. * @author SumRndmDde * * @param Default Stats * @desc A list of stats Actors can distribute to by default. * All of the available stats can be found in HELP. * @default mhp, mmp, atk, def, mat, mdf, agi, luk * * @param Default Formula * @desc The default formula used for determining how many "stat points" an Actor gains by leveling up. * @default Math.ceil(level / 10) * * @param Show on Menu * @desc If 'true', this plugin will place the command in the menu. * @default true * * @param == Stat Reset == * @default * * @param Allow Stat Resets * @desc If 'true', then players will have the option to reset the distributed stats and return the used stat points. * @default true * * @param Reset Gold Cost * @desc The formula determining the amount of gold for resetting. * Use "points" to reference the amount of points used. * @default points * 100 * * @param == Custom Texts == * @default * * @param Level Up Message * @desc This message is displayed when an actor levels up to show how many points were gained. %1 is the number of points. * @default Got %1 stat points! * * @param Command Name * @desc The is the name of the command for stat distribution in the menu. * @default Stat Boost * * @param Points Text * @desc The text used to display how much points an Actor has. * @default Stat Points: * * @param Upgrade Text * @desc The text used to display how much points an upgrade is worth. * @default Upgrade Cost: * * @param Spend Text * @desc The text used in the command window to begin spending. * @default Spend * * @param Reset Text * @desc The text used in the command window to reset stat points. * @default Reset * * @param Finish Text * @desc The text used in the command window to leave the scene. * @default Finish * * @param == Gauge Options == * @default * * @param Use Gauges * @desc If 'true', the stat distribution will have gauges representing how close the distributed stat is to reaching its max. * @default true * * @param Gauge Height * @desc The height of the gauges used in the stat distribution. * @default 14 * * @param == Points Label == * @default * * @param Point Icon * @desc Input the icon index of the icon for stat points. * Set to 0 to use text instead. * @default 87 * * @param Point Text * @desc If "Point Icon" is set to 0, this will be used as the label for stat points. * @default Points * * @param Point Color * @desc If using text, this will be the color of the text. * @default #66ff66 * * @help * * Stat Distribution * Version 1.07 * SumRndmDde * * * This plugin allows players to distribute points to different stats of the * Actors at his or her discretion. A command is added to the menu which allows * access to a new menu for stat distribution! * * * ============================================================================== * Plugin Commands * ============================================================================== * * Use the following plugin commands to preform various actions. * * * * OpenStatDistribution Actor [actorId] * * This opens the Stat Distribution Menu for the specified Actor ID. * * * * OpenStatDistribution Party [memberIndex] * * This opens the Stat Distribution Menu for the specified Actor based on the * index in which they are in the party. For example, setting "memberIndex" * to 0 will open the menu for the party's leader. * * * * AddStatPoints Actor [actorId] [points] * AddStatPoints Party [memberIndex] [points] * * This adds a specific amount points to a specific Actor. * * * ============================================================================== * Upgradeable Stats * ============================================================================== * * In order to determine what stats can be upgraded, use the "Default Stats" * Parameter. Otherwise, notetags can be used to customize the stats * per each individual Actor: * * * * * Sets the Actor's stats to this list. * * * * * * Adds stats to the Actor's already existing upgradeable stats. * * * ============================================================================== * How to Customize Stats * ============================================================================== * * In order to customize the properties of stats, you must use the Database EX. * Simply go to the customizable editors, and select "Stat Distribution Editor". * * Within here, a list of stats will be available and their variables can * be changed to fit with your needs. Be sure to reload to see the changes! * * * ============================================================================== * List of Upgradeable Stats * ============================================================================== * * Here is a list of all the available stats and their three-letter codes. * * * == Base Stats == * mhp - Max HP * mmp - Max MP * atk - Attack * def - Defense * mat - Magical Attack * mdf - Magical Defense * agi - Agility * luk - Luck * * == Ex Stats == * hit - Hit Rate * eva - Evasion Rate * cri - Critical Rate * cev - Critical Evasion Rate * mev - Magic Evasion Rate * mrf - Magic Reflection Rate * cnt - Counter Attack Rate * hrg - Hp Regeneration * mrg - Mp Regeneration * trg - Tp Regeneration * * == Sp Stats == * tgr - Target Rate * grd - Guard Effect Rate * rec - Recovery Effect Rate * pha - Pharmacology * mcr - Mp Cost Rate * tcr - Tp Charge Rate * pdr - Physical Damage Rate * mdr - Magical Damage Rate * fdr - Floor Damage Rate * exr - Experience Rate * * * ============================================================================== * Stat Points * ============================================================================== * * Stat points can be gained by leveling up the Actors. * The "Default Formula" Parameter can be used to set up a formula for how many * stat points an Actor will gain upon level. Alternatively, the following * notetags can be used to give Actors their own formulas: * * * * For example: * * * * * ============================================================================== * End of Help File * ============================================================================== * * Welcome to the bottom of the Help file. * * * Thanks for reading! * If you have questions, or if you enjoyed this Plugin, please check * out my YouTube channel! * * https://www.youtube.com/c/SumRndmDde * * * Until next time, * ~ SumRndmDde * */ /*:ja * @plugindesc アクターの能力値にプレイヤーの裁量でポイントを分配できるシステムです。 * @author SumRndmDde * * @param Default Stats * @text デフォルト能力値 * @desc デフォルトでアクターが割当可能な能力値のリスト * 利用可能な能力値はヘルプ参照 * @default mhp, mmp, atk, def, mat, mdf, agi, luk * * @param Default Formula * @text デフォルト式 * @desc アクターがレベルアップすることで得られる能力値ポイントの値を決定するデフォルトの計算式 * @default Math.ceil(level / 10) * * @param Show on Menu * @text メニュー表示 * @type boolean * @on 表示 * @off 非表示 * @desc メニューにコマンドを表示 * 表示:true / 非表示:false * @default true * * @param == Stat Reset == * @text -- 能力値リセット * @default * * @param Allow Stat Resets * @text 能力値リセット許可 * @type boolean * @on 許可 * @off 禁止 * @desc プレイヤーは割当された能力値をリセットして使用済みの能力値ポイントを戻せます * @default true * * @param Reset Gold Cost * @text リセット所持金コスト * @desc リセットのための所持金の量を決定する式 * points:使用ポイント量 * @default points * 100 * * @param == Custom Texts == * @text -- カスタムテキスト * @default * * @param Level Up Message * @text レベルアップメッセージ * @desc アクターがレベルアップした時の表示メッセージ * 獲得したポイント数:%1 * @default %1能力値ポイントを得た! * * @param Command Name * @text コマンド名 * @desc メニュー中の能力値割当のコマンド名 * @default 能力値割当 * * @param Points Text * @text ポイントのラベル * @desc アクターが持っているポイントのラベル * @default 能力値ポイント: * * @param Upgrade Text * @text アップグレードのラベル * @desc アップグレードのポイント数のラベル * @default アップグレードコスト: * * @param Spend Text * @text 割当テキスト * @desc 割当を開始するコマンドの表示テキスト * @default 割当 * * @param Reset Text * @text リセットラベル * @desc 能力値ポイントをリセットするコマンドの表示テキスト * @default リセット * * @param Finish Text * @text 完了テキスト * @desc シーンを完了するコマンドの表示テキスト * @default 完了 * * @param == Gauge Options == * @text -- ゲージオプション * @default * * @param Use Gauges * @text ゲージの使用 * @desc trueの場合、能力値量の分布には、分布している能力値量が最大値にどれだけ近づいているかを表すゲージが表示されます * @default true * * @param Gauge Height * @text ゲージの高さ * @desc 能力値分布で使用されるゲージの高さ * @default 14 * * @param == Points Label == * @text -- ポイントラベル * @default * * @param Point Icon * @text ポイントアイコン * @desc 能力値ポイント用のアイコンのアイコンインデックスを入力します * 0に設定して、代わりにテキストを使用します。 * @default 87 * * @param Point Text * @text ポイントテキスト * @desc PointIcon"が0に設定されている場合、これが能力値ポイントのラベルとして使用されます * @default テキスト * * @param Point Color * @text ポイントカラー * @desc テキストを使用する場合は、テキストの色になります * @default #66ff66 * * @help * 翻訳:ムノクラ * https://fungamemake.com/ * https://twitter.com/munokura/ * * 元プラグイン: http://sumrndm.site/stat-distribution/ * * * Stat Distribution * Version 1.07 * SumRndmDde * * * アクターの能力値にプレイヤーの裁量でポイントを分配できるシステムです。 * メニューにコマンドが追加され、 * 能力値割当の新しいメニューにアクセスできるようになります。 * * このプラグインを使用するには、SRD_SuperToolsEngineが必要です。 * プラグイン管理でこのプラグインを * SRD_SuperToolsEngineの下側に配置してください。 * * * ========================================================================== * プラグインコマンド * ========================================================================== * * 以下のプラグインコマンドを使用して、アクションを実行します。 * * * OpenStatDistribution Actor [actorId] * 指定したアクターIDの能力値割当メニューを開きます。 * * * OpenStatDistribution Party [memberIndex] * パーティ内のインデックスに基づいて、 * 指定されたアクターの能力値割当メニューを開きます。 * 例えば、'memberIndex'を0に設定すると、 * パーティのリーダーのメニューが開きます。 * * * AddStatPoints Actor [actorId] [points] * AddStatPoints Party [memberIndex] [points] * これにより、特定のアクターに指定値のポイントが追加されます。 * * * ========================================================================== * アップグレード可能な能力値 * ========================================================================== * * アップグレード可能な能力値を決定するには、 * 'DefaultStats'パラメータを使用します。 * それ以外の場合、 * メモタグを使って、 * 個々のアクター毎に能力値をカスタマイズすることができます。 * * * * アクターの能力値をこのリストに設定します。 * * * * アクターの既存のアップグレード可能な能力値に能力値を追加します。 * * * ========================================================================== * 能力値をカスタマイズする方法 * ========================================================================== * * 能力値情報のプロパティをカスタマイズするには、 * データベースEXを利用する必要があります。 * カスタマイズ可能なエディタに移動し、 * 'Stat Distribution Editor'を選択するだけです。 * ここでは、 * 能力値情報の一覧が表示され、 * 必要に応じて変数を変更することができます。 * 変更内容を確認するには、 * 必ずリロードしてください。 * * * ========================================================================== * アップグレード可能なステータス一覧 * ========================================================================== * * ここでは、利用可能な全ての能力値とその3文字コードのリストを紹介します。 * * * -- 通常能力値 -- * mhp - 最大HP * mmp - 最大MP * atk - 攻撃力 * def - 防御力 * mat - 魔法力 * mdf - 魔法防御 * agi - 敏捷性 * luk - 運 * * -- 追加能力値 -- * hit - 命中率 * eva - 回避率 * cri - 会心率 * cev - 会心回避率 * mev - 魔法回避率 * mrf - 魔法反射率 * cnt - 反撃率 * hrg - HP再生率 * mrg - MP再生率 * trp - TP再生率 * * -- 特殊能力値 -- * tgr - 狙われ率 * grd - 防御効果率 * rec - 回復効果率 * pha - 薬の知識 * mcr - MP消費率 * tcr - TPチャージ率 * pdr - 物理ダメージ率 * mdr - 魔法ダメージ率 * fdr - 床ダメージ率 * exr - 経験獲得率 * * * ========================================================================== * 能力値ポイント * ========================================================================== * * 能力値ポイントはアクターをレベルアップさせることで獲得できます。 * 'Default Formula'パラメータを使用して、アクターがレベルアップした時、 * 何点の能力値ポイントを獲得するかを設定することができます。 * また、以下のメモタグを使用して、アクターに独自の式を与えることもできます。 * * * * * 例: * * * * ========================================================================== * ヘルプファイルの終わり * ========================================================================== * * ヘルプファイルの終わりへようこそ。 * * 読んでくれてありがとう! * 質問があったり、このプラグインを楽しめたら、 * 私のYouTubeチャンネルを登録してください!! * * https://www.youtube.com/c/SumRndmDde * * * 次の機会まで * ~ SumRndmDde * */ var SRD = SRD || {}; SRD.StatDistribution = SRD.StatDistribution || {}; SRD.PluginCommands = SRD.PluginCommands || {}; SRD.NotetagGetters = SRD.NotetagGetters || []; var Imported = Imported || {}; Imported["SumRndmDde Stat Distribution"] = 1.07; var $dataDistributeStats = {}; function Scene_Distribute() { this.initialize.apply(this, arguments); } function Window_DistributePoints() { this.initialize.apply(this, arguments); } function Window_DistributeStatus() { this.initialize.apply(this, arguments); } function Window_Distribute() { this.initialize.apply(this, arguments); } function Window_DistributeCommand() { this.initialize.apply(this, arguments) } (function (_) { "use strict"; //----------------------------------------------------------------------------- // SRD.StatDistribution //----------------------------------------------------------------------------- const params = PluginManager.parameters('SRD_StatDistribution'); _.stats = String(params['Default Stats']).split(/\s*,\s*/); _.formula = String(params['Default Formula']); _.show = String(params['Show on Menu']).trim().toLowerCase() === 'true'; _.reset = String(params['Allow Stat Resets']).trim().toLowerCase() === 'true'; _.cost = String(params['Reset Gold Cost']); _.name = String(params['Command Name']); _.messsage = String(params['Level Up Message']); _.points = String(params['Points Text']); _.upgrade = String(params['Upgrade Text']); _.spendText = String(params['Spend Text']); _.resetText = String(params['Reset Text']); _.finishText = String(params['Finish Text']); _.drawGauges = String(params['Use Gauges']).trim().toLowerCase() === 'true'; _.gaugeHeight = parseInt(params['Gauge Height']); _.iconIndex = parseInt(params['Point Icon']); _.pointText = String(params['Point Text']); _.pointColor = String(params['Point Color']); _.checkFileExists = function () { FileManager.checkDataExists("DistributionStats.json", JsonEx.stringify({ "mhp": { "name": "Max HP", "description": "The maximum amount of HP for the actor.", "cost": "1", "gain": "5", "max": "500", "min_col": "#ffa655", "max_col": "#ea7000" }, "mmp": { "name": "Max MP", "description": "The maximum amount of MP for the actor.", "cost": "1", "gain": "2", "max": "200", "min_col": "#6666ff", "max_col": "#0000ff" }, "atk": { "name": "Attack", "description": "Strengthens the damage of physical skills used by \nthe actor.", "cost": "1", "gain": "1", "max": "100", "min_col": "#ff7777", "max_col": "#f90000" }, "def": { "name": "Defense", "description": "Reduces the damage of physical skills the actor is \ntargeted with.", "cost": "1", "gain": "1", "max": "100", "min_col": "#52ff33", "max_col": "#12b700" }, "mat": { "name": "Magic Attack", "description": "Strengthens the damage of magical skills used by \nthe actor.", "cost": "1", "gain": "1", "max": "100", "min_col": "#b355ff", "max_col": "#a300d9" }, "mdf": { "name": "Magic Defense", "description": "Reduces the damage of magical skills the actor is \ntargeted with.", "cost": "1", "gain": "1", "max": "100", "min_col": "#55ffe6", "max_col": "#00d7b7" }, "agi": { "name": "Agility", "description": "Determines how soon the actor will be able to \npreform a turn in battle.", "cost": "1", "gain": "1", "max": "100", "min_col": "#fbff55", "max_col": "#d9d300" }, "luk": { "name": "Luck", "description": "Influences various luck factors for the actor in \ntheir favor.", "cost": "1", "gain": "1", "max": "100", "min_col": "#ff55e6", "max_col": "#cc00ad" }, "hit": { "name": "Hit Rate", "description": "Increases the chance of skills hitting their \ntarget.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "eva": { "name": "Evasion Rate", "description": "Increases the likely-hood of an actor evading\na physical skill.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "cri": { "name": "Critical Rate", "description": "Determines how likely an actor will preform \na critical hit.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "cev": { "name": "Critical Evasion Rate", "description": "Decreases the likely-hood of skills targeting \nthe actor being critical.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "mev": { "name": "Magic Evasion Rate", "description": "Increases the likely-hood of an actor evading \na magical skill.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "mrf": { "name": "Magic Reflection Rate", "description": "The higher the value, the more likely magical \nreflection will occur.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "cnt": { "name": "Counter Attack Rate", "description": "The higher the value, the more likely physical \nreflection will occur.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "hrg": { "name": "Hp Regeneration", "description": "The rate in which the actor gains HP each turn.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "mrg": { "name": "Mp Regeneration", "description": "The rate in which the actor gains MP each turn.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "trg": { "name": "Tp Regeneration", "description": "The rate in which the actor gains TP each turn.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "tgr": { "name": "Target Rate", "description": "Increases the chance of the actor being attacked.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "grd": { "name": "Guard Effect Rate", "description": "Increases the effectiveness of the actor's guard", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "rec": { "name": "Recovery Effect Rate", "description": "Determines the effectiveness of recovery skills.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "pha": { "name": "Pharmacology", "description": "Determines the effectiveness of recovery items.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "mcr": { "name": "Mp Cost Rate", "description": "The rate in which MP skills cost.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "tcr": { "name": "Tp Charge Rate", "description": "The rate in which TP skills cost.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "pdr": { "name": "Physical Damage Rate", "description": "The rate in which physical damage occurs.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "mdr": { "name": "Magical Damage Rate", "description": "The rate in which magical damage occurs.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "fdr": { "name": "Floor Damage Rate", "description": "The rate in which floor damage occurs.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" }, "exr": { "name": "Experience Rate", "description": "The rate in which the actor gains experience.", "cost": "2", "gain": "0.005", "max": "0.5", "min_col": "#aaaaaa", "max_col": "#ffffff" } })); }; _.loadNotetags = function () { const data = $dataActors; const regex1 = //im; const regex2 = //im; const regex3 = //im; for (let i = 1; i < data.length; i++) { const note = data[i].note; if (note.match(regex1)) { const stats = String(RegExp.$1).split(/\s*,\s*/); data[i]._sd_stats = stats; } if (note.match(regex2)) { const stats = String(RegExp.$1).split(/\s*,\s*/); if (data[i]._sd_stats === undefined) data[i]._sd_stats = _.stats.clone(); data[i]._sd_stats = data[i]._sd_stats.concat(stats); } if (note.match(regex3)) { data[i]._sd_formula = String(RegExp.$1); } } }; SRD.NotetagGetters.push(_.loadNotetags); _.alertNeedSuperToolsEngine = function () { alert("The 'SRD_SuperToolsEngine' plugin is required for using the 'SRD_StatDistribution' plugin."); if (confirm("Do you want to open the download page to 'SRD_SuperToolsEngine'?")) { window.open('http://sumrndm.site/super-tools-engine/'); } }; if (!Imported["SumRndmDde Super Tools Engine"]) { _.alertNeedSuperToolsEngine(); return; } _.checkFileExists(); //----------------------------------------------------------------------------- // SRD.PluginCommands //----------------------------------------------------------------------------- SRD.PluginCommands._sd_getActorType = function (args) { const type = String(args[0]).toLowerCase(); const id = parseInt(args[1]); let actor; if (type === 'actor') { actor = $gameActors.actor(id); } else { actor = $gameParty.members()[id]; } return actor; }; SRD.PluginCommands['openstatdistribution'] = function (args) { const actor = SRD.PluginCommands._sd_getActorType(args); if (actor) { $gameParty.setMenuActor(actor); SceneManager.push(Scene_Distribute); } }; SRD.PluginCommands['addstatpoints'] = function (args) { const actor = SRD.PluginCommands._sd_getActorType(args); if (actor) { const points = parseInt(args[2]); actor.addDistributePoints(points); } }; //----------------------------------------------------------------------------- // DataManager //----------------------------------------------------------------------------- DataManager._testExceptions.push("DistributionStats.json"); DataManager._databaseFiles.push({ name: '$dataDistributeStats', src: "DistributionStats.json" }); if (!SRD.DataManager_isDatabaseLoaded) { SRD.notetagsLoaded = false; SRD.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded; DataManager.isDatabaseLoaded = function () { if (!SRD.DataManager_isDatabaseLoaded.apply(this, arguments)) return false; if (!SRD.notetagsLoaded) { SRD.NotetagGetters.forEach(function (func) { func.call(this); }, this); SRD.notetagsLoaded = true; } return true; }; } //----------------------------------------------------------------------------- // DataManagerEX //----------------------------------------------------------------------------- DataManagerEX._distributeStat = 'mhp'; _.DataManagerEX_getCustomInfo = DataManagerEX.getCustomInfo; DataManagerEX.getCustomInfo = function () { const result = _.DataManagerEX_getCustomInfo.apply(this, arguments); result.push(['Stat Distribution Editor', 'DataManagerEX.getStatDistributionHtml']); return result; }; DataManagerEX.getStatDistributionHtml = function () { const data = $dataDistributeStats['mhp']; return `


Stat:

Parameter Input
Name
Description
Cost
Gain
Max
Min Color
Max Color

`; }; DataManagerEX.getStatDistributionHtmlOptions = function () { return ` `; }; DataManagerEX.updateStatDistribution = function () { const doc = MakerManager.document; this._distributeStat = doc.getElementById('StatSelect').value; const data = $dataDistributeStats[this._distributeStat]; if (data) { doc.getElementById('name').value = data.name; doc.getElementById('description').value = data.description; doc.getElementById('cost').value = data.cost; doc.getElementById('gain').value = data.gain; doc.getElementById('max').value = data.max; doc.getElementById('min_col').value = data.min_col; doc.getElementById('max_col').value = data.max_col; } else { doc.getElementById('name').value = ''; doc.getElementById('description').value = ''; doc.getElementById('cost').value = ''; doc.getElementById('gain').value = ''; doc.getElementById('max').value = ''; doc.getElementById('min_col').value = ''; doc.getElementById('max_col').value = ''; } }; DataManagerEX.saveCurrentStatDistribution = function () { const doc = MakerManager.document; const data = $dataDistributeStats[this._distributeStat]; if (data) { data.name = doc.getElementById('name').value; data.description = doc.getElementById('description').value; data.cost = doc.getElementById('cost').value; data.gain = doc.getElementById('gain').value; data.max = doc.getElementById('max').value; data.min_col = doc.getElementById('min_col').value; data.max_col = doc.getElementById('max_col').value; FileManager.saveData($dataDistributeStats, "DistributionStats.json"); } }; _.DataManagerEX_initOldDatas = DataManagerEX.initOldDatas; DataManagerEX.initOldDatas = function () { _.DataManagerEX_initOldDatas.apply(this, arguments); this._oldStatDistribution = JsonEx.stringify($dataDistributeStats); }; _.DataManagerEX_requestRestartCondition = DataManagerEX.requestRestartCondition; DataManagerEX.requestRestartCondition = function () { return _.DataManagerEX_requestRestartCondition.apply(this, arguments) || this._oldStatDistribution !== JsonEx.stringify($dataDistributeStats); }; //----------------------------------------------------------------------------- // Game_Actor //----------------------------------------------------------------------------- Game_Actor.bParams = ['mhp', 'mmp', 'atk', 'def', 'mat', 'mdf', 'agi', 'luk']; Game_Actor.xParams = ['hit', 'eva', 'cri', 'cev', 'mev', 'mrf', 'cnt', 'hrg', 'mrg', 'trg']; Game_Actor.sParams = ['tgr', 'grd', 'rec', 'pha', 'mcr', 'tcr', 'pdr', 'mdr', 'fdr', 'exr']; _.Game_Actor_initMembers = Game_Actor.prototype.initMembers; Game_Actor.prototype.initMembers = function () { _.Game_Actor_initMembers.apply(this, arguments); this._distributePoints = 0; this._pointsGained = 0; this._pointsGainedTemp = 0; this.clearDistributePointsSpent(); this.clearDistributeStats(); }; _.Game_Actor_paramRate = Game_Actor.prototype.paramBase; Game_Actor.prototype.paramBase = function (paramId) { return _.Game_Actor_paramRate.apply(this, arguments) + this._distributeParams[paramId]; }; _.Game_Actor_xparam = Game_Actor.prototype.xparam; Game_Actor.prototype.xparam = function (xparamId) { return _.Game_Actor_xparam.apply(this, arguments) + this._distributeXParams[xparamId]; }; _.Game_Actor_sparam = Game_Actor.prototype.sparam; Game_Actor.prototype.sparam = function (sparamId) { return _.Game_Actor_sparam.apply(this, arguments) + this._distributeSParams[sparamId]; }; _.Game_Actor_levelUp = Game_Actor.prototype.levelUp; Game_Actor.prototype.levelUp = function () { _.Game_Actor_levelUp.apply(this, arguments); this.gainDistributePoints(); }; _.Game_Actor_displayLevelUp = Game_Actor.prototype.displayLevelUp; Game_Actor.prototype.displayLevelUp = function (newSkills) { _.Game_Actor_displayLevelUp.apply(this, arguments); if (_.messsage && this._pointsGainedTemp) { $gameMessage.add(_.messsage.format(this._pointsGainedTemp)); this._pointsGainedTemp = 0; } }; Game_Actor.prototype.distributePoints = function () { return this._distributePoints; }; Game_Actor.prototype.setDistributePoints = function (value) { this._distributePoints = value; }; Game_Actor.prototype.addDistributePointsTemp = function (value) { this.setDistributePoints(this._distributePoints + value); }; Game_Actor.prototype.addDistributePoints = function (value) { this._pointsGained += value; this._pointsGainedTemp += value; this.addDistributePointsTemp(value); }; Game_Actor.prototype.gainDistributePoints = function () { const formula = this.actor()._sd_formula || _.formula; const level = this._level; const actor = this; const points = eval(formula); this.addDistributePoints(points); }; Game_Actor.prototype.pointsUsed = function () { return this._pointsGained - this._distributePoints; }; Game_Actor.prototype.setBaseDistribute = function (paramId, value) { if (Imported.YEP_BaseParamControl) this._baseParamCache = []; this._distributeParams[paramId] = value; }; Game_Actor.prototype.addDistributePointsSpent = function (value) { this._distributePointsSpent += value; }; Game_Actor.prototype.clearDistributePointsSpent = function () { this._distributePointsSpent = 0; }; Game_Actor.prototype.clearDistributeStats = function () { this._distributeParams = [0, 0, 0, 0, 0, 0, 0, 0]; this._distributeXParams = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; this._distributeSParams = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; }; Game_Actor.prototype.resetDistributeStats = function () { this.addDistributePointsTemp(this._distributePointsSpent); this.clearDistributePointsSpent(); this.clearDistributeStats(); } Game_Actor.prototype.addBaseDistribute = function (paramId, value) { this.setBaseDistribute(paramId, this._distributeParams[paramId] + value); }; Game_Actor.prototype.setXDistribute = function (xparamId, value) { this._distributeXParams[xparamId] = value; }; Game_Actor.prototype.addXDistribute = function (xparamId, value) { this.setXDistribute(xparamId, this._distributeXParams[xparamId] + value); }; Game_Actor.prototype.setSDistribute = function (sparamId, value) { this._distributeSParams[sparamId] = value; }; Game_Actor.prototype.addSDistribute = function (sparamId, value) { this.setSDistribute(sparamId, this._distributeSParams[sparamId] + value); }; Game_Actor.prototype.getAbnormalParam = function (param) { }; Game_Actor.prototype.addAbnormalParam = function (param, value) { }; Game_Actor.prototype.getDistribute = function (param) { const type = this.getParamType(param); switch (type) { case 1: return this._distributeParams[Game_Actor.bParams.indexOf(param)]; break; case 2: return this._distributeXParams[Game_Actor.xParams.indexOf(param)]; break; case 3: return this._distributeSParams[Game_Actor.sParams.indexOf(param)]; break; default: return this.getAbnormalParam(param); break; } }; Game_Actor.prototype.addDistribute = function (param, value) { const type = this.getParamType(param); switch (type) { case 1: this.addBaseDistribute(Game_Actor.bParams.indexOf(param), value); break; case 2: this.addXDistribute(Game_Actor.xParams.indexOf(param), value); break; case 3: this.addSDistribute(Game_Actor.sParams.indexOf(param), value); break; default: this.addAbnormalParam(param, value); break; } }; Game_Actor.prototype.getParamType = function (param) { if (Game_Actor.bParams.contains(param)) { return 1; } else if (Game_Actor.xParams.contains(param)) { return 2; } else if (Game_Actor.sParams.contains(param)) { return 3; } return 0; }; //----------------------------------------------------------------------------- // Game_Interpreter //----------------------------------------------------------------------------- if (!SRD.Game_Interpreter_pluginCommand) { SRD.Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function (command, args) { const com = command.trim().toLowerCase(); if (SRD.PluginCommands[com]) { SRD.PluginCommands[com].call(this, args); return; } SRD.Game_Interpreter_pluginCommand.apply(this, arguments); }; } //----------------------------------------------------------------------------- // Scene_Menu //----------------------------------------------------------------------------- _.Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow; Scene_Menu.prototype.createCommandWindow = function () { _.Scene_Menu_createCommandWindow.apply(this, arguments); if (_.show) { this._commandWindow.setHandler('distribute', this.commandPersonal.bind(this)); } }; _.Scene_Menu_onPersonalOk = Scene_Menu.prototype.onPersonalOk; Scene_Menu.prototype.onPersonalOk = function () { if (this._commandWindow.currentSymbol() === 'distribute') { this.openStatDistribution(); return; } _.Scene_Menu_onPersonalOk.apply(this, arguments); }; Scene_Menu.prototype.openStatDistribution = function () { SceneManager.push(Scene_Distribute); }; //----------------------------------------------------------------------------- // Scene_Distribute //----------------------------------------------------------------------------- Scene_Distribute.prototype = Object.create(Scene_MenuBase.prototype); Scene_Distribute.prototype.constructor = Scene_Distribute; Scene_Distribute.prototype.initialize = function () { Scene_MenuBase.prototype.initialize.call(this); ImageManager.loadFace($gameParty.menuActor().faceName()); }; Scene_Distribute.prototype.create = function () { Scene_MenuBase.prototype.create.call(this); this.createHelpWindow(); this.createCommandWindow(); this.createStatusWindow(); this.createPointsWindow(); this.createDistributeWindow(); this.refreshActor(); }; Scene_Distribute.prototype.createCommandWindow = function () { const wy = this._helpWindow.height; this._commandWindow = new Window_DistributeCommand(0, wy); this._commandWindow.setHelpWindow(this._helpWindow); this._commandWindow.setHandler('spend', this.commandSpend.bind(this)); this._commandWindow.setHandler('clear', this.commandClear.bind(this)); this._commandWindow.setHandler('cancel', this.popScene.bind(this)); this._commandWindow.setHandler('pagedown', this.nextActor.bind(this)); this._commandWindow.setHandler('pageup', this.previousActor.bind(this)); this.addWindow(this._commandWindow); }; Scene_Distribute.prototype.createStatusWindow = function () { const wy = this._commandWindow.y + this._commandWindow.height; this._statusWindow = new Window_DistributeStatus(0, wy); this.addWindow(this._statusWindow); }; Scene_Distribute.prototype.createPointsWindow = function () { const wy = this._statusWindow.y + this._statusWindow.height; this._pointsWindow = new Window_DistributePoints(0, wy); this.addWindow(this._pointsWindow); this._commandWindow.setPointsWindow(this._pointsWindow); }; Scene_Distribute.prototype.createDistributeWindow = function () { const wx = this._statusWindow.width; const wy = this._commandWindow.y + this._commandWindow.height; const ww = Graphics.boxWidth - wx; this._distributeWindow = new Window_Distribute(wx, wy, ww); this._distributeWindow.setHelpWindow(this._helpWindow); this._distributeWindow.setStatusWindow(this._statusWindow); this._distributeWindow.setPointsWindow(this._pointsWindow); this._distributeWindow.setHandler('finish', this.distributeFinish.bind(this)); this._distributeWindow.setHandler('cancel', this.distributeCancel.bind(this)); this.addWindow(this._distributeWindow); }; Scene_Distribute.prototype.refreshActor = function () { const actor = this.actor(); this._commandWindow.setActor(actor); this._statusWindow.setActor(actor); this._distributeWindow.setActor(actor); }; Scene_Distribute.prototype.commandSpend = function () { this._distributeWindow.activate(); this._distributeWindow.select(0); }; Scene_Distribute.prototype.commandClear = function () { this.actor().resetDistributeStats(); $gameParty.loseGold(this._commandWindow.getCost()); this._distributeWindow.refresh(); this._statusWindow.refresh(); this._commandWindow.refresh(); this._commandWindow.refreshCost(); this._commandWindow.activate(); }; Scene_Distribute.prototype.distributeFinish = function () { this._distributeWindow.applyBonuses(); this._distributeWindow.clearInfo(); this._statusWindow.refresh(); this.distributeEnd(); }; Scene_Distribute.prototype.distributeCancel = function () { this._distributeWindow.restartInfo(); this.distributeEnd(); }; Scene_Distribute.prototype.distributeEnd = function () { this._pointsWindow.clear(); this._distributeWindow.refresh(); this._distributeWindow.deselect(); this._commandWindow.activate(); this._commandWindow.refreshCost(); this._commandWindow.refresh(); }; Scene_Distribute.prototype.onActorChange = function () { this.refreshActor(); this._commandWindow.activate(); }; //----------------------------------------------------------------------------- // Window_MenuCommand //----------------------------------------------------------------------------- _.Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands; Window_MenuCommand.prototype.addOriginalCommands = function () { _.Window_MenuCommand_addOriginalCommands.apply(this, arguments); if (_.show) { this.addCommand(_.name, 'distribute', this.isDistributeEnabled()); } }; Window_MenuCommand.prototype.isDistributeEnabled = function () { return true; }; //----------------------------------------------------------------------------- // Window_DistributeCommand //----------------------------------------------------------------------------- Window_DistributeCommand.prototype = Object.create(Window_HorzCommand.prototype); Window_DistributeCommand.prototype.constructor = Window_DistributeCommand; Window_DistributeCommand.prototype.initialize = function (x, y) { Window_HorzCommand.prototype.initialize.call(this, x, y); this._cost = 0; this._actor = null; this._pointsWindow = null; }; Window_DistributeCommand.prototype.playOkSound = function () { const symbol = this.commandSymbol(this.index()); if (symbol === 'clear') { SoundManager.playUseItem(); } else { Window_HorzCommand.prototype.playOkSound.apply(this, arguments); } }; Window_DistributeCommand.prototype.windowWidth = function () { return Graphics.boxWidth; }; Window_DistributeCommand.prototype.maxCols = function () { return this._list.length; }; Window_DistributeCommand.prototype.makeCommandList = function () { this.addCommand(_.spendText, 'spend'); if (_.reset) { const actorReady = this._actor && this._actor.pointsUsed() > 0; this.addCommand(_.resetText, 'clear', actorReady && this._cost <= $gameParty.gold()); } this.addCommand(_.finishText, 'cancel'); }; Window_DistributeCommand.prototype.setPointsWindow = function (window) { this._pointsWindow = window; }; Window_DistributeCommand.prototype.setActor = function (actor) { if (this._actor !== actor) { this._actor = actor; this.refreshCost(); this.refresh(); } }; Window_DistributeCommand.prototype.getCost = function () { return this._cost; }; Window_DistributeCommand.prototype.refreshCost = function () { const actor = this._actor; const level = this._actor.level; const points = this._actor.pointsUsed(); this._cost = eval(_.cost); }; Window_DistributeCommand.prototype.select = function (index) { Window_HorzCommand.prototype.select.apply(this, arguments); if (!this._pointsWindow) return; const symbol = this.commandSymbol(index); this._pointsWindow.clear(); if (symbol === 'clear') { this._pointsWindow.setGoldCost(this._cost); } }; //----------------------------------------------------------------------------- // Window_DistributePoints //----------------------------------------------------------------------------- Window_DistributePoints.prototype = Object.create(Window_Base.prototype); Window_DistributePoints.prototype.constructor = Window_DistributePoints; Window_DistributePoints.prototype.initialize = function (x, y) { const width = this.windowWidth(); const height = this.windowHeight(); Window_Base.prototype.initialize.call(this, x, y, width, height); this._actor = null; this._points = 0; }; Window_DistributePoints.prototype.windowWidth = function () { return 408; }; Window_DistributePoints.prototype.windowHeight = function () { return this.fittingHeight(1); }; Window_DistributePoints.prototype.refresh = function () { const x = this.textPadding(); const width = this.contentsWidth() - this.textPadding() * 2; const unitWidth = _.iconIndex ? Window_Base._iconWidth : this.textWidth(_.pointText); this.clear(); this.resetTextColor(); this.drawText(this.points(), x, 0, width - unitWidth - 12, 'right'); if (_.iconIndex) { this.drawIcon(_.iconIndex, this.windowWidth() - this.standardPadding() - Window_Base._iconWidth - 24, 2); } else { this.changeTextColor(_.labelColor); this.drawText(_.pointText, x, 0, width - 6, 'right'); } this.changeTextColor(this.systemColor()); this.contents.fontSize = 24; this.drawText(this.label(), 0, 0, width, 'left'); this.resetFontSettings(); }; Window_DistributePoints.prototype.clear = function () { this.contents.clear(); }; Window_DistributePoints.prototype.points = function () { return this._points; }; Window_DistributePoints.prototype.setValue = function (value) { this._points = value; this.refresh(); }; Window_DistributePoints.prototype.label = function () { return _.upgrade; }; if (Imported.YEP_X_MoreCurrencies) alert("Please place YEP_X_MoreCurrencies below SRD_StatDistribution!"); _.Window_Gold_refresh = Window_Gold.prototype.refresh; Window_DistributePoints.prototype.setGoldCost = function (gold) { this._value = gold; _.Window_Gold_refresh.apply(this, arguments); this.drawResetCost(); }; Window_DistributePoints.prototype.drawResetCost = function () { const width = this.contentsWidth() - this.textPadding() * 2; this.changeTextColor(this.systemColor()); this.contents.fontSize = 24; this.drawText("Reset Cost:", 0, 0, width, 'left'); this.resetFontSettings(); }; Window_DistributePoints.prototype.currencyUnit = Window_Gold.prototype.currencyUnit; Window_DistributePoints.prototype.value = function () { return this._value; }; //----------------------------------------------------------------------------- // Window_DistributeStatus //----------------------------------------------------------------------------- Window_DistributeStatus.prototype = Object.create(Window_Selectable.prototype); Window_DistributeStatus.prototype.constructor = Window_DistributeStatus; Window_DistributeStatus.prototype.initialize = function (x, y) { Window_Selectable.prototype.initialize.call(this, x, y, 408, this.fittingHeight(8)); this._actor = null; this.refresh(); this.activate(); }; Window_DistributeStatus.prototype.setActor = function (actor) { if (this._actor !== actor) { this._actor = actor; this.refresh(); } }; Window_DistributeStatus.prototype.refresh = function () { this.contents.clear(); if (this._actor) { const lineHeight = this.lineHeight(); //Line 1 this.drawActorName(this._actor, 6, 0); this.drawActorClass(this._actor, 192, 0); //Line 2 this.drawHorzLine(lineHeight); //Line 3 this.drawActorFace(this._actor, 12, lineHeight * 2); this.drawBasicInfo(180, lineHeight * 2, this.contentsWidth() - 180); //Line 7 this.drawHorzLine(lineHeight * 6); //Line 8 this.drawActorPoints(lineHeight * 7, this.contentsWidth() - this.textPadding() * 2); } }; Window_DistributeStatus.prototype.drawBasicInfo = function (x, y, width) { const lineHeight = this.lineHeight(); this.drawActorLevel(this._actor, x, y + lineHeight * 0); this.drawActorIcons(this._actor, x, y + lineHeight * 1); this.drawActorHp(this._actor, x, y + lineHeight * 2, width); this.drawActorMp(this._actor, x, y + lineHeight * 3, width); }; Window_DistributeStatus.prototype.drawHorzLine = function (y) { const lineY = y + this.lineHeight() / 2 - 1; this.contents.paintOpacity = 48; this.contents.fillRect(0, lineY, this.contentsWidth(), 2, this.normalColor()); this.contents.paintOpacity = 255; }; Window_DistributeStatus.prototype.drawActorPoints = function (y, width) { const x = this.textPadding(); const unitWidth = _.iconIndex ? Window_Base._iconWidth : this.textWidth(_.pointText); this.resetTextColor(); this.drawText(this._actor.distributePoints(), x, y, width - unitWidth - 12, 'right'); if (_.iconIndex) { this.drawIcon(_.iconIndex, this.width - this.standardPadding() - Window_Base._iconWidth - 24, y + 2); } else { this.changeTextColor(_.labelColor); this.drawText(_.pointText, x, y, width - 6, 'right'); } this.contents.fontSize = 24; this.drawText(_.points, 0, y, width, 'left'); this.resetFontSettings(); }; Window_DistributeStatus.prototype.refreshPoints = function () { const lineHeight = this.lineHeight(); const width = this.contentsWidth(); this.contents.clearRect(0, lineHeight * 7, width, lineHeight); this.drawActorPoints(lineHeight * 7, width - this.textPadding() * 2); }; //----------------------------------------------------------------------------- // Window_Distribute //----------------------------------------------------------------------------- Window_Distribute.prototype = Object.create(Window_Command.prototype); Window_Distribute.prototype.constructor = Window_Distribute; Window_Distribute.prototype.initialize = function (x, y, width) { this._windowWidth = width; this._maxHeight = Graphics.boxHeight - y; this._statusWindow = null; this._pointsWindow = null; this.clearInfo(); Window_Command.prototype.initialize.call(this, x, y); this.deselect(); this.deactivate(); }; Window_Distribute.prototype.drawGauge = function (x, y, width, rate, color1, color2) { const fillW = Math.floor(width * rate); const gaugeY = y + this.lineHeight() - 2 - _.gaugeHeight; this.contents.fillRect(x - 1, gaugeY - 1, width + 2, _.gaugeHeight + 2, "#000"); this.contents.fillRect(x, gaugeY, width, _.gaugeHeight, this.gaugeBackColor()); this.contents.gradientFillRect(x, gaugeY, fillW, _.gaugeHeight, color1, color2); }; Window_Distribute.prototype.playOkSound = function () { const symbol = this.commandSymbol(this.index()); if (symbol === 'finish') { SoundManager.playSave(); } else { Window_Command.prototype.playOkSound.apply(this, arguments); } }; Window_Distribute.prototype.windowWidth = function () { return this._windowWidth; }; Window_Distribute.prototype.windowHeight = function () { return Math.min(this.fittingHeight(this.numVisibleRows()), this._maxHeight); }; Window_Distribute.prototype.setActor = function (actor) { if (this._actor !== actor) { this._actor = actor; this.clearInfo(); this.refresh(); } }; Window_Distribute.prototype.setStatusWindow = function (window) { this._statusWindow = window; }; Window_Distribute.prototype.setPointsWindow = function (window) { this._pointsWindow = window; }; Window_Distribute.prototype.restartInfo = function () { this._actor.addDistributePointsTemp(this._pointsSpent); this.refreshEverything(); this.clearInfo(); }; Window_Distribute.prototype.clearInfo = function () { this._pointsSpent = 0; this._maxPoints = this._actor ? this._actor.distributePoints() : 0; this._bonuses = {}; }; Window_Distribute.prototype.applyBonuses = function () { if (this._actor) { Object.keys(this._bonuses).forEach(function (key) { this._actor.addDistribute(key, this._bonuses[key]); }, this); } this._actor.addDistributePointsSpent(this._pointsSpent); this._pointsSpent = 0; }; Window_Distribute.prototype.updateHelp = function () { const index = this.index(); if (!this._list[index]) return; const symbol = this.commandSymbol(index); this._pointsWindow.clear(); this._helpWindow.clear(); if (symbol !== 'finish') { const data = $dataDistributeStats[symbol]; const actor = this._actor; this._pointsWindow.setValue(eval(data.cost)); this._helpWindow.setText(data.description); } }; Window_Distribute.prototype.makeCommandList = function () { if (this._actor) { const stats = this._actor.actor()._sd_stats || _.stats; stats.forEach(function (stat) { if ($dataDistributeStats[stat]) { this.addCommand($dataDistributeStats[stat].name, stat); } }, this); } this.addCommand("Finish", 'finish'); }; Window_Distribute.prototype.drawItem = function (index) { const symbol = this.commandSymbol(index); if (symbol === 'finish') { this.drawFinishItem(index); } else { this.drawNormalItem(index, symbol); } }; Window_Distribute.prototype.drawNormalItem = function (index, symbol) { const rect = this.itemRectForText(index); const name = this.commandName(index); const nameWidth = this.textWidth(name); const statWidth = rect.width - nameWidth; let stat = this._actor[symbol]; this.changeTextColor(this.systemColor()); const actor = this._actor; const data = $dataDistributeStats[symbol]; const cost = eval(data.cost); let add = 0; if (this._bonuses[symbol] && this._bonuses[symbol] > 0) add = this._bonuses[symbol]; const current = (actor.getDistribute(symbol) + add); const max = eval(data.max); this.changePaintOpacity((current < max && this.hasPoints(cost)) || (this._bonuses[symbol] && this._bonuses[symbol] > 0)); if (_.drawGauges) { let rate = 0; rate = current / max; this.drawGauge(rect.x, rect.y, rect.width, rate, data.min_col, data.max_col); } this.drawText(name, rect.x, rect.y, nameWidth, 'left'); this.drawNormalItemNumbers(stat, symbol, nameWidth, statWidth, rect); }; Window_Distribute.prototype.drawNormalItemNumbers = function (stat, symbol, nameWidth, statWidth, rect) { if (stat !== undefined) { const percent = Game_Actor.xParams.contains(symbol) || Game_Actor.sParams.contains(symbol); let bonusWidth = -12; this.contents.fontSize = 22; if (this._bonuses[symbol]) { const bonusText = percent ? `(+${Math.round(this._bonuses[symbol] * 1000) / 10}%)` : `(+${this._bonuses[symbol]})`; bonusWidth = this.textWidth(bonusText); this.changeTextColor("#66ff66"); this.drawText(bonusText, nameWidth, rect.y, statWidth, 'right'); } this.resetTextColor(); if (percent) stat = `${Math.round(stat * 1000) / 10}%`; this.drawText(stat, nameWidth, rect.y, statWidth - bonusWidth - 12, 'right'); this.resetFontSettings(); } }; Window_Distribute.prototype.drawFinishItem = function (index) { const rect = this.itemRectForText(index); const isEnabled = this._pointsSpent > 0; this.changePaintOpacity(isEnabled); this._list[this._list.length - 1].enabled = isEnabled; this.contents.fontSize = 24; this.drawText(this.commandName(index), rect.x, rect.y, rect.width, 'center'); this.resetFontSettings(); }; Window_Distribute.prototype.hasPoints = function (amount) { return this._actor.distributePoints() >= amount; }; Window_Distribute.prototype.canReturnPoints = function (amount) { return this._pointsSpent >= amount; }; Window_Distribute.prototype.removePoint = function (amount) { this._actor.addDistributePointsTemp(-amount); this._pointsSpent += amount; this.refreshEverything(); }; Window_Distribute.prototype.addPoint = function (amount) { this._actor.addDistributePointsTemp(amount); this._pointsSpent -= amount; this.refreshEverything(); }; Window_Distribute.prototype.refreshEverything = function () { this._pointsWindow.refresh(); this._statusWindow.refreshPoints(); this.refresh(); }; Window_Distribute.prototype.processOk = function () { const index = this.index(); const symbol = this.commandSymbol(index); if (symbol === 'finish') { Window_Command.prototype.processOk.apply(this, arguments); } else { this.cursorRight(); } }; Window_Distribute.prototype.cursorRight = function (wrap) { const index = this.index(); const symbol = this.commandSymbol(index); if (symbol === 'finish') return; const actor = this._actor; const current = actor.getDistribute(symbol); const data = $dataDistributeStats[symbol]; const cost = eval(data.cost); if (!this.hasPoints(cost)) { return; } if (this._bonuses[symbol] === undefined) this._bonuses[symbol] = 0; const prev = this._bonuses[symbol]; this._bonuses[symbol] += eval(data.gain); this._bonuses[symbol] = this._bonuses[symbol].clamp(0, eval(data.max) - current); if (this._bonuses[symbol] !== prev) { this.removePoint(cost); this.refreshEverything(); SoundManager.playCursor(); } }; Window_Distribute.prototype.cursorLeft = function (wrap) { const index = this.index(); const symbol = this.commandSymbol(index); if (symbol === 'finish') return; const actor = this._actor; const current = actor.getDistribute(symbol); const data = $dataDistributeStats[symbol]; const cost = eval(data.cost); if (!this.canReturnPoints(cost)) { return; } if (this._bonuses[symbol] === undefined) this._bonuses[symbol] = 0; const prev = this._bonuses[symbol]; this._bonuses[symbol] -= eval(data.gain); this._bonuses[symbol] = this._bonuses[symbol].clamp(0, eval(data.max) - current); if (this._bonuses[symbol] !== prev) { this.addPoint(cost); this.refreshEverything(); SoundManager.playCursor(); } }; Window_Distribute.prototype.refresh = function () { this.clearCommandList(); this.makeCommandList(); this.height = this.windowHeight(); this.createContents(); Window_Selectable.prototype.refresh.call(this); }; })(SRD.StatDistribution);