/*:
 * @target MZ
 * @plugindesc [MZ] そうび画面の運の下にHP/MPを追加（特徴補正対応・位置完全維持）
 * @author you
 *
 * @help
 * 標準のそうび画面に「最大HP」「最大MP」を運パラメータの下に追加します。
 * 攻撃～運までの標準の位置はそのまま動かさず、
 * その下に2行分HPとMPを自然に追加します。
 *
 * 装備による特徴倍率（例：最大HP×105%）を反映して右側に比較値を表示します。
 */

(() => {
"use strict";

/** ▼ Traitsから該当パラメータ倍率を合計 */
function paramRateFromTraits(traits, paramId) {
  const TRAIT_PARAM = Game_BattlerBase.TRAIT_PARAM;
  return traits.reduce((r, t) => {
    if (t.code === TRAIT_PARAM && t.dataId === paramId) r *= t.value;
    return r;
  }, 1);
}

/** ▼ 装備配列から固定値と倍率を算出 */
function equipParamComponents(equips, paramId) {
  let add = 0;
  let rate = 1;
  for (const item of equips) {
    if (!item) continue;
    add += (item.params?.[paramId] || 0);
    rate *= paramRateFromTraits(item.traits || [], paramId);
  }
  return { add, rate };
}

/** ▼ 装備以外の補正を抽出 */
function nonEquipComponents(actor, paramId) {
  const equips = actor.equips();
  const equipAdd = equips.reduce((s, e) => s + (e?.params[paramId] || 0), 0);
  const equipRate = equipParamComponents(equips, paramId).rate;
  const allAdd = actor.paramPlus(paramId);
  const allRate = actor.paramRate(paramId);
  const nonEquipAdd = allAdd - equipAdd;
  const nonEquipRate = allRate / equipRate;
  return { nonEquipAdd, nonEquipRate };
}

/** ▼ 仮想装備構成 */
function virtualEquips(actor, newItem, slotId) {
  const equips = actor.equips().slice();
  equips[slotId] = newItem;
  return equips;
}

/** ▼ 装備差し替え後の最終値を計算（％補正を含む） */
function calcEquipParam(actor, paramId, newItem, slotId) {
  const { nonEquipAdd, nonEquipRate } = nonEquipComponents(actor, paramId);
  const equips = virtualEquips(actor, newItem, slotId);
  const equipAdd = equips.reduce((s, e) => s + (e?.params[paramId] || 0), 0);
  const equipRate = equipParamComponents(equips, paramId).rate;
  const base = actor.paramBase(paramId);
  let value = (base) * (nonEquipRate * equipRate) + (nonEquipAdd + equipAdd);
  value = Math.floor(value * actor.paramBuffRate(paramId));
  value = value.clamp(actor.paramMin(paramId), actor.paramMax(paramId));
  return value;
}

/** ▼ 共通1行描画関数 */
function drawEquipParamLine(win, x, y, actor, paramId, newItem, slotId) {
  const paramNameWidth = 160;
  const rightArrowWidth = 32;
  const paramValueWidth = 60;

  win.changeTextColor(ColorManager.systemColor());
  win.drawText(TextManager.param(paramId), x, y, paramNameWidth);

  const currentValue = actor.param(paramId);
  const newValue = newItem ? calcEquipParam(actor, paramId, newItem, slotId) : currentValue;
  const diff = newValue - currentValue;

  win.resetTextColor();
  win.drawText(currentValue, x + paramNameWidth, y, paramValueWidth, "right");

  win.changeTextColor(ColorManager.systemColor());
  win.drawText("→", x + paramNameWidth + paramValueWidth, y, rightArrowWidth, "center");

  win.changeTextColor(ColorManager.paramchangeTextColor(diff));
  win.drawText(newValue, x + paramNameWidth + paramValueWidth + rightArrowWidth, y, paramValueWidth, "right");
}

/** ▼ 元のrefreshを保持し、下にHP/MPを追加 */
const _EquipStatus_refresh = Window_EquipStatus.prototype.refresh;
Window_EquipStatus.prototype.refresh = function() {
  // 標準（攻撃〜運）の描画はそのまま
  _EquipStatus_refresh.call(this);

  if (!this._actor) return;

  const x = this.itemPadding();
  const lineH = this.lineHeight();
  const newItem = this._tempActor ? this._tempActor.equips()[this._slotId] : null;
  const slotId = this._slotId;

  // 運パラメータ（最後の行）の下に追加
  const baseY = lineH * 6; // 標準は0〜5が攻撃〜運なのでその下から

  drawEquipParamLine(this, x, baseY + lineH, this._actor, 0, newItem, slotId); // HP
  drawEquipParamLine(this, x, baseY + lineH * 2, this._actor, 1, newItem, slotId); // MP
};

})();
