查看: 12|回复: 0

[有事请教] 关于Hakubox_BreakBar韧性条的显示bug

[复制链接]
梦石
0
星屑
60
在线时间
19 小时
注册时间
2020-7-27
回帖
13
发表于 昨天 19:41 | 显示全部楼层 |阅读模式
悬赏100星屑未解决
本帖最后由 Doolet 于 2026-10-18 19:44 编辑

各位老大好!!

我在使用Hakubox_BreakBar韧性条插件攻击敌人显示韧性条的时候,遇到了韧性条击破归0时,突然重新跳到满韧性的显示问题。
只是显示问题,实际上是已经处于破韧的状态了.
c3472a23-5723-4b09-926c-a2a7d0450503.png

想求助各位老大们,这个韧性条的显示问题到底是出在哪
每回合开始时敌人的韧性条都会从满格突然跳一下回到当前韧性,我不知道是不是和这个有关系.

这里是bug的项目案例链接:(QQ文件闪传)
https://qfile.qq.com/q/YUpMfsRE4I

这里是韧性条的脚本
  1. //=============================================================================
  2. // ** RPG Maker MZ - Hakubox_BreakBar.js
  3. //=============================================================================
  4. // #region 脚本注释
  5. /*:
  6. * @plugindesc 韧性条插件
  7. * @version 1.0.1
  8. * @author hakubox
  9. * @email hakubox226@gmail.com
  10. * @target MV MZ
  11. *
  12. * @help
  13. * 给BOSS添加了一个韧性条,加了之后boss会破防
  14. * 修复:破防后韧性条显示0,破防期间不能增减韧性,不会重复破韧
  15. *
  16. * // 给敌人设置最大破防值,加了这个之后才会显示韧性条
  17. * <haku-ap:900>
  18. * // 在技能的备注里加,给自己涨韧性条
  19. * <haku-ap-add:500>
  20. * // 破防结束后会增加某个状态,破防时则移除状态
  21. * <haku-not-break-state:42>
  22. *
  23. * 调用脚本:
  24. * HakuBreakBarUtils.setAp(enemyId, ap);
  25. *
  26. * → enemyId 敌人Id(在数据库敌人列表中查看)
  27. * → ap Ap值(破防值)
  28. *
  29. *
  30. * @param breakSound
  31. * @text 破防音频
  32. * @desc 破防Break时播放的音频
  33. * @type file
  34. * @dir audio/se/
  35. *
  36. * @param ui
  37. * @text ——————— 界面配置 ———————
  38. * @default ————————————————————————
  39. *
  40. * @param bgImage
  41. * @parent ui
  42. * @text 韧性条背景图
  43. * @desc 韧性条背景图
  44. * @type file
  45. * @dir img/pictures/
  46. *
  47. * @param x
  48. * @parent ui
  49. * @text 韧性条横向X坐标
  50. * @desc 韧性条横向X坐标
  51. * @type number
  52. * @min -1000
  53. *
  54. * @param y
  55. * @parent ui
  56. * @text 韧性条纵向Y坐标
  57. * @desc 韧性条纵向Y坐标
  58. * @type number
  59. * @min -1000
  60. *
  61. * @param bgBarImage
  62. * @parent ui
  63. * @text 破防槽图片
  64. * @desc 破防槽图片
  65. * @type file
  66. * @dir img/pictures/
  67. *
  68. * @param barX
  69. * @parent ui
  70. * @text 破防槽图片横向X坐标
  71. * @desc 破防槽图片横向X坐标
  72. * @type number
  73. * @min -1000
  74. *
  75. * @param barY
  76. * @parent ui
  77. * @text 破防槽图片纵向Y坐标
  78. * @desc 破防槽图片纵向Y坐标
  79. * @type number
  80. * @min -1000
  81. *
  82. *
  83. * @param barLabel
  84. * @parent ui
  85. * @text ——— 韧性标签文本 ———
  86. * @default ——————————
  87. *
  88. * @param labelX
  89. * @parent barLabel
  90. * @text 标签横向X坐标
  91. * @desc 标签横向X坐标
  92. * @type number
  93. * @min -1000
  94. *
  95. * @param labelY
  96. * @parent barLabel
  97. * @text 标签纵向Y坐标
  98. * @desc 标签纵向Y坐标
  99. * @type number
  100. * @min -1000
  101. *
  102. * @param barLabelText
  103. * @parent barLabel
  104. * @text 标签文字
  105. * @desc 标签文字
  106. * @type text
  107. * @default 韧性
  108. *
  109. * @param barLabelFontColor
  110. * @parent barLabel
  111. * @text 标签文字颜色
  112. * @desc 标签文字颜色
  113. * @type text
  114. * @default #FFFFFF
  115. *
  116. * @param barLabelFontSize
  117. * @parent barLabel
  118. * @text 标签文字大小
  119. * @desc 标签文字大小
  120. * @type number
  121. * @default 12
  122. *
  123. * @param barLabelLineHeight
  124. * @parent barLabel
  125. * @text 标签文字行高
  126. * @desc 标签文字行高
  127. * @type number
  128. * @default 30
  129. *
  130. * @param barLabelAlign
  131. * @parent barLabel
  132. * @text 标签文字对齐方式
  133. * @desc 标签文字对齐方式
  134. * @type select
  135. * @option left
  136. * @value left
  137. * @option center
  138. * @value center
  139. * @option right
  140. * @value right
  141. * @default left
  142. *
  143. *
  144. * @param barValue
  145. * @parent ui
  146. * @text ——— 韧性数值文本 ———
  147. * @default ——————————
  148. *
  149. * @param barTextFontColor
  150. * @parent barValue
  151. * @text 数值文字颜色
  152. * @desc 数值文字颜色
  153. * @type string
  154. * @default #FFFFFF
  155. *
  156. * @param barTextFontSize
  157. * @parent barValue
  158. * @text 数值文字大小
  159. * @desc 数值文字大小
  160. * @type number
  161. * @default 12
  162. *
  163. * @param barTextLineHeight
  164. * @parent barValue
  165. * @text 数值文字行高
  166. * @desc 数值文字行高
  167. * @type number
  168. * @default 30
  169. *
  170. * @param barTextAlign
  171. * @parent barValue
  172. * @text 数值文字对齐
  173. * @desc 数值文字对齐方式
  174. * @type select
  175. * @option left
  176. * @value left
  177. * @option center
  178. * @value center
  179. * @option right
  180. * @value right
  181. * @default center
  182. *
  183. *
  184. * @param feature
  185. * @text ——————— 功能配置 ———————
  186. * @default ————————————————————————
  187. *
  188. * @param turnRecovery
  189. * @parent feature
  190. * @text 每回合回复数值
  191. * @desc 每回合回复数值,大于1为具体数值,小于1则为百分比
  192. * @type text
  193. *
  194. * @param breakState
  195. * @parent feature
  196. * @text 破防后附加状态
  197. * @desc 破防后附加状态
  198. * @type state
  199. *
  200. * @param bossTag
  201. * @parent feature
  202. * @text 指定boss的标签
  203. * @desc 指定boss的标签
  204. * @type text
  205. * @default Boss HP
  206. *
  207. * @param basicDamageRate
  208. * @parent feature
  209. * @text 基础AP伤害倍率
  210. * @desc 基础AP伤害倍率
  211. * @type text
  212. * @default 1
  213. *
  214. * @param propConfig
  215. * @parent feature
  216. * @text 属性倍率设置
  217. * @desc 包含属性类型和倍率设置
  218. * @type struct<PropConfig>[]
  219. * @min []
  220. *
  221. * @param weaponConfig
  222. * @parent feature
  223. * @text 武器类型倍率设置
  224. * @desc 包含武器类型和倍率设置
  225. * @type struct<WeaponConfig>[]
  226. * @min []
  227. *
  228. * @param stateConfig
  229. * @parent feature
  230. * @text 己方状态倍率设置
  231. * @desc 包含自身状态和倍率设置
  232. * @type struct<StateConfig>[]
  233. * @min []
  234. *
  235. * @param enemyStateConfig
  236. * @parent feature
  237. * @text 敌方状态倍率设置
  238. * @desc 包含敌方状态和倍率设置
  239. * @type struct<StateConfig>[]
  240. * @min []
  241. *
  242. */
  243. /*~struct~PropConfig:
  244. *
  245. * @param remark
  246. * @text 备注
  247. * @desc 该配置项的备注说明
  248. * @type note
  249. *
  250. * @param propElementId
  251. * @text 属性类型
  252. * @type number
  253. * @min -1
  254. *
  255. * @param rate
  256. * @text 倍率
  257. * @desc 对韧性条的伤害倍率,填写百分比数值
  258. * @type number
  259. * @min 0
  260. * @default 100
  261. *
  262. */
  263. /*~struct~WeaponConfig:
  264. *
  265. * @param remark
  266. * @text 备注
  267. * @desc 该配置项的备注说明
  268. * @type note
  269. *
  270. * @param weaponTypeId
  271. * @text 武器类型
  272. * @type number
  273. * @min -1
  274. *
  275. * @param rate
  276. * @text 倍率
  277. * @desc 对韧性条的伤害倍率,填写百分比数值
  278. * @type number
  279. * @min 0
  280. * @default 100
  281. *
  282. */
  283. /*~struct~StateConfig:
  284. *
  285. * @param remark
  286. * @text 备注
  287. * @desc 该配置项的备注说明
  288. * @type note
  289. *
  290. * @param stateId
  291. * @text 状态类型
  292. * @type state
  293. * @min -1
  294. *
  295. * @param rate
  296. * @text 倍率
  297. * @desc 对韧性条的伤害倍率,填写百分比数值
  298. * @type number
  299. * @min 0
  300. * @default 100
  301. *
  302. */
  303. (() => {
  304.   /** 插件名称 */
  305.   const PluginName = document.currentScript ? decodeURIComponent(document.currentScript.src.match(/^.*\/(.+)\.js$/)[1]) : "Hakubox_BreakBar";
  306.   // #region 插件参数解释器
  307.   class PluginParamsParser {
  308.     constructor(predictEnable = true) {
  309.       this._predictEnable = predictEnable;
  310.     }
  311.     static parse(params, typeData, predictEnable = true) {
  312.       return new PluginParamsParser(predictEnable).parse(params, typeData);
  313.     }
  314.     parse(params, typeData, loopCount = 0) {
  315.       if (++loopCount > 255)
  316.         throw new Error("endless loop error");
  317.       const result = {};
  318.       for (const name in typeData) {
  319.         if (params[name] === "" || params[name] === undefined) {
  320.           result[name] = null;
  321.         }
  322.         else {
  323.           result[name] = this.convertParam(params[name], typeData[name], loopCount);
  324.         }
  325.       }
  326.       if (!this._predictEnable)
  327.         return result;
  328.       if (typeof params === "object" && !(params instanceof Array)) {
  329.         for (const name in params) {
  330.           if (result[name])
  331.             continue;
  332.           const param = params[name];
  333.           const type = this.predict(param);
  334.           result[name] = this.convertParam(param, type, loopCount);
  335.         }
  336.       }
  337.       return result;
  338.     }
  339.     convertParam(param, type, loopCount) {
  340.       if (typeof type === "string") {
  341.         let str = param;
  342.         if (str[0] == '"' && str[str.length - 1] == '"') {
  343.           str = str.substring(1, str.length - 1).replace(/\\n/g, '\n').replace(/\"/g, '"')
  344.         }
  345.         return this.cast(str, type);
  346.       }
  347.       else if (typeof type === "object" && type instanceof Array) {
  348.         const aryParam = JSON.parse(param);
  349.         if (type[0] === "string") {
  350.           return aryParam.map((strParam) => this.cast(strParam, type[0]));
  351.         } else if (type[0] === "number") {
  352.           return aryParam.map((strParam) => this.cast(strParam, type[0]));
  353.         } else {
  354.           if (!aryParam.length) return [];
  355.           else {
  356.             if (typeof aryParam === "string") {
  357.               return JSON.parse(aryParam);
  358.             } else {
  359.               return aryParam.map((strParam) => this.parse(JSON.parse(strParam), type[0]), loopCount);
  360.             }
  361.           }
  362.         }
  363.       }
  364.       else if (typeof type === "object") {
  365.         return this.parse(JSON.parse(param), type, loopCount);
  366.       }
  367.       else {
  368.         throw new Error(`${type} is not string or object`);
  369.       }
  370.     }
  371.     cast(param, type) {
  372.       switch (type) {
  373.         case "any":
  374.           if (!this._predictEnable)
  375.             throw new Error("Predict mode is disable");
  376.           return this.cast(param, this.predict(param));
  377.         case "string":
  378.           return param;
  379.         case "number":
  380.           if (param.match(/^\-?\d+\.\d+$/))
  381.             return parseFloat(param);
  382.           return parseInt(param);
  383.         case "boolean":
  384.           return param === "true";
  385.         default:
  386.           throw new Error(`Unknow type: ${type}`);
  387.       }
  388.     }
  389.     predict(param) {
  390.       if (param.match(/^\-?\d+$/) || param.match(/^\-?\d+\.\d+$/)) {
  391.         return "number";
  392.       }
  393.       else if (param === "true" || param === "false") {
  394.         return "boolean";
  395.       }
  396.       else {
  397.         return "string";
  398.       }
  399.     }
  400.   }
  401.   const typeDefine = {
  402.     propConfig: [],
  403.     weaponConfig: [],
  404.     stateConfig: [],
  405.     enemyStateConfig: [],
  406.   };
  407.   const params = PluginParamsParser.parse(PluginManager.parameters(PluginName), typeDefine);
  408.   // #region 基础配置
  409.   /** 基础配置 */
  410.   const config = {
  411.     /** 每回合自动回复量 */
  412.     addTurnRecovery(maxAp) {
  413.       let value = 0;
  414.       if (params.turnRecovery) {
  415.         if (params.turnRecovery <= 1) {
  416.           value = params.turnRecovery * maxAp;
  417.         } else {
  418.           value = params.turnRecovery;
  419.         }
  420.       }
  421.       return +value;
  422.     },
  423.     /** 是否显示 */
  424.     visible: true,
  425.     container: undefined,
  426.     /** 当前敌人索引 */
  427.     enemyId: 0,
  428.     /** 多个敌人的信息 */
  429.     enemyInfos: {},
  430.     /** 敌人信息 */
  431.     enemyInfo: {
  432.       enemy: undefined,
  433.       ap: 0,
  434.       map: 0,
  435.     },
  436.     /** 获得当前敌人 */
  437.     get enemy() {
  438.       return this.enemyInfos[this.enemyId].enemy;
  439.     },
  440.     /** 赋值敌人 */
  441.     set enemy(value) {
  442.       this.enemyInfos[value._enemyId].enemy = value;
  443.     },
  444.     /** 当前敌人是否有Ap */
  445.     get hasAp() {
  446.       return this.enemyInfos[this.enemyId].hasAp;
  447.     },
  448.     /** 获得当前AP */
  449.     get ap() {
  450.       if (this.enemyInfos[this.enemyId]) {
  451.         return this.enemyInfos[this.enemyId].ap || 0;
  452.       } else {
  453.         return 0;
  454.       }
  455.     },
  456.     /** 赋值AP */
  457.     set ap(value) {
  458.       if (!this.enemyInfos[this.enemyId]) return;
  459.       let _val = value;
  460.       if (_val > this.map) {
  461.         _val = this.map;
  462.       } else if (_val < 0) {
  463.         _val = 0;
  464.       }
  465.       this.enemyInfos[this.enemyId].ap = _val;
  466.     },
  467.     /** 获得当前MaxAP */
  468.     get map() {
  469.       if (this.enemyInfos[this.enemyId]) {
  470.         return this.enemyInfos[this.enemyId].map || 0;
  471.       } else {
  472.         return 0;
  473.       }
  474.     },
  475.     /** 赋值MaxAP */
  476.     set map(value) {
  477.       if (!this.enemyInfos[this.enemyId]) return;
  478.       this.enemyInfos[this.enemyId].map = value;
  479.     },
  480.     /** 上一次的韧性 */
  481.     get prevValue() {
  482.       return this.enemyInfos[this.enemyId].prevValue || 0;
  483.     },
  484.     /** 赋值上一次的韧性 */
  485.     set prevValue(value) {
  486.       this.enemyInfos[this.enemyId].prevValue = value;
  487.     },
  488.     // 是否初始化完成
  489.     isInit: false,
  490.     // 是否初始化了敌人
  491.     isInitEnemy: false,
  492.     // 背景图片
  493.     bgBitmap: ImageManager.reservePicture(params.bgImage),
  494.     // 背景图片精灵(进度条
  495.     bgSprite: undefined,
  496.     // 韧性条的图片
  497.     barBitmap: undefined,
  498.     // 临时的韧性条的图片
  499.     barTempBitmap: ImageManager.reservePicture(params.bgBarImage),
  500.     // 韧性条的精灵
  501.     barSprite: undefined,
  502.     // 文本图层
  503.     textSprite: undefined,
  504.     // 韧性条的宽度
  505.     barWidth: 0,
  506.     // 当前帧
  507.     frameIndex: 0,
  508.     // 最大帧
  509.     maxFrame: 20,
  510.     // 是否开始动画
  511.     isStartAnime: false,
  512.     // 动画的进度
  513.     progress: 0,
  514.   };
  515.   // #endregion
  516.   // #region 韧性条
  517.   class BreakBar {
  518.     static destroy() {
  519.       config.enemyInfos = {};
  520.       config.enemyId = 0;
  521.       config.isInit = false;
  522.       config.isInitEnemy = false;
  523.     }
  524.     static initEnemy() {
  525.       config.enemyInfos = {};
  526.       config.enemyId = 0;
  527.       const _members = $gameTroop.members();
  528.       for (let i = 0; i < _members.length; i++) {
  529.         const _member = _members[i];
  530.         const _enemy = $dataEnemies[_member._enemyId];
  531.         const _note = _enemy.note;
  532.         const _ap = Number(_enemy.meta['haku-ap'] || 0);
  533.         config.enemyInfos[_member._enemyId] = {
  534.           prevValue: _ap,
  535.           enemy: _enemy,
  536.           ap: _ap,
  537.           map: _ap,
  538.           hasAp: _note.includes(params.bossTag) && _ap > 0,
  539.           isBreak: false,
  540.         };
  541.         if (_note.includes(params.bossTag) && _ap > 0) {
  542.           config.enemyId = _member._enemyId;
  543.           config.visible = true;
  544.         }
  545.       }
  546.       if (!config.enemyId) {
  547.         config.enemyId = _members[_members.length - 1]._enemyId;
  548.       }
  549.       config.isInitEnemy = true;
  550.     }
  551.     /** 初始化 */
  552.     static init(parent) {
  553.       config.container = new PIXI.Container();
  554.       config.visible = false;
  555.       // 等待图片加载完成
  556.       config.barTempBitmap.addLoadListener(() => {
  557.         config.bgBitmap.addLoadListener(() => {
  558.           // 获取韧性条的宽度
  559.           config.barWidth = config.barTempBitmap.width;
  560.           // 创建背景图精灵
  561.           config.bgSprite = new Sprite(config.bgBitmap);
  562.           config.bgSprite.x = params.x;
  563.           config.bgSprite.y = params.y;
  564.           // 创建标签的精灵
  565.           config.labelSprite = new Sprite(
  566.             new Bitmap(config.bgBitmap.width, Math.max(config.bgBitmap.height, +params.barLabelLineHeight))
  567.           );
  568.           config.labelSprite.x = params.x + params.labelX;
  569.           config.labelSprite.y = params.y + params.labelY;
  570.           // 创建文本的精灵
  571.           config.textSprite = new Sprite(
  572.             new Bitmap(config.bgBitmap.width, Math.max(config.bgBitmap.height, +params.barTextLineHeight))
  573.           );
  574.           config.textSprite.x = params.x;
  575.           config.textSprite.y = params.y;
  576.           // 创建韧性条的精灵
  577.           config.barBitmap = new Bitmap(config.barWidth, config.barTempBitmap.height);
  578.           config.barSprite = new Sprite(config.barBitmap);
  579.           config.barSprite.x = params.x + params.barX;
  580.           config.barSprite.y = params.y + params.barY;
  581.           // 画出当前韧性条(有可能第一次画的时候韧性就不是满的,所以需要计算)
  582.           const _apProgress = config.ap / config.map;
  583.           config.barBitmap.blt(config.barTempBitmap,
  584.             0, 0, Math.floor(_apProgress * config.barBitmap.width), config.barTempBitmap.height,
  585.             0, 0, Math.floor(_apProgress * config.barBitmap.width), config.barTempBitmap.height
  586.           );
  587.           // 画出韧性的标签
  588.           config.labelSprite.bitmap.textColor = params.barLabelFontColor;
  589.           config.labelSprite.bitmap.fontSize = +params.barLabelFontSize;
  590.           config.labelSprite.bitmap.drawText(
  591.             params.barLabelText,
  592.             0,
  593.             0,
  594.             config.bgBitmap.width, +params.barLabelLineHeight, params.barLabelAlign
  595.           );
  596.           // 画出韧性的文本
  597.           config.textSprite.bitmap.textColor = params.barTextFontColor;
  598.           config.textSprite.bitmap.fontSize = +params.barTextFontSize;
  599.           config.textSprite.bitmap.drawText(
  600.             `${config.ap}/${config.map}`,
  601.             0,
  602.             0,
  603.             config.bgBitmap.width, +params.barTextLineHeight, params.barTextAlign
  604.           );
  605.           // 都加到当前的场景中
  606.           config.container.addChild(config.bgSprite);
  607.           config.container.addChild(config.barSprite);
  608.           config.container.addChild(config.labelSprite);
  609.           config.container.addChild(config.textSprite);
  610.           if (!config.ap) {
  611.             config.container.alpha = 0;
  612.           }
  613.           parent.addChild(config.container);
  614.           // 标记初始化完成
  615.           config.isInit = true;
  616.         });
  617.       });
  618.     }
  619.     /** 切换敌人 */
  620.     static changeEnemy(enemyId) {
  621.       config.enemyId = enemyId;
  622.     }
  623.     /** 下一帧 */
  624.     static nextFrame() {
  625.       config.frameIndex++;
  626.       if (config.frameIndex > config.maxFrame) {
  627.         config.frameIndex = 0;
  628.         config.isStartAnime = false;
  629.       }
  630.       // 计算当前的显示进度
  631.       config.progress = config.frameIndex / config.maxFrame;
  632.     }
  633.     static update() {
  634.       if (config.isInit && config.isStartAnime) {
  635.         // 清空韧性条与韧性文本
  636.         config.barBitmap.clear();
  637.         config.textSprite.bitmap.clear();
  638.         config.labelSprite.bitmap.clear();

  639.         if (config.visible) {
  640.           config.container.alpha = 1;
  641.         } else {
  642.           config.container.alpha = 0;
  643.         }
  644.         if (config.visible) {
  645.           // 读取当前敌人信息,破防强制进度=0
  646.           const curEnemyInfo = config.enemyInfos[config.enemyId];
  647.           let progress;
  648.           if(curEnemyInfo && curEnemyInfo.isBreak){
  649.             progress = 0;
  650.           }else{
  651.             progress = (config.prevValue - (config.prevValue - config.ap) * config.progress) / config.map;
  652.           }

  653.           // 画出当前韧性条
  654.           config.barBitmap.blt(config.barTempBitmap,
  655.             0, 0, Math.floor(progress * config.barBitmap.width), config.barTempBitmap.height,
  656.             0, 0, Math.floor(progress * config.barBitmap.width), config.barTempBitmap.height
  657.           );

  658.           // 画出韧性的标签
  659.           config.labelSprite.bitmap.textColor = params.barLabelFontColor;
  660.           config.labelSprite.bitmap.fontSize = +params.barLabelFontSize;
  661.           config.labelSprite.bitmap.drawText(
  662.             params.barLabelText,
  663.             0,
  664.             0,
  665.             config.bgBitmap.width, +params.barLabelLineHeight, params.barLabelAlign
  666.           );
  667.           // 画出韧性的文本
  668.           config.textSprite.bitmap.textColor = params.barTextFontColor;
  669.           config.textSprite.bitmap.fontSize = +params.barTextFontSize;
  670.           config.textSprite.bitmap.drawText(
  671.             `${config.ap}/${config.map}`,
  672.             0,
  673.             0,
  674.             config.bgBitmap.width, +params.barTextLineHeight, params.barTextAlign
  675.           );
  676.         }
  677.       }
  678.     }
  679.     /** 修改韧性(外部调用) */
  680.     static changeAp(ap, target, item, action) {
  681.       // 如果该敌人已经破防,直接退出,不再修改韧性
  682.       const enemyInfo = config.enemyInfos[target._enemyId];
  683.       if(enemyInfo && enemyInfo.isBreak){
  684.         return;
  685.       }
  686.       if (target._permBarrier && target._permBarrier > 0) {
  687.         return;
  688.       }
  689.       // 把当前韧性做一个历史记录
  690.       let _ap = ap * (+params.basicDamageRate);
  691.       // 添加倍率
  692.       // 属性类型倍率
  693.       if (params.propConfig.length) {
  694.         const prop = params.propConfig.find(i => i.propElementId == item.damage.elementId);
  695.         if (prop) {
  696.           _ap *= prop.rate / 100;
  697.         }
  698.       }
  699.       // 武器类型倍率
  700.       if (params.weaponConfig.length) {
  701.         const _actor = $gameActors.actor(action._subjectActorId);
  702.         if (_actor) {
  703.           const _weapon = _actor.equips().find(i => i && i.wtypeId);
  704.           if (_weapon) {
  705.             const prop = params.weaponConfig.find(i => i && i.weaponTypeId == _weapon.wtypeId);
  706.             if (prop) {
  707.               _ap *= prop.rate / 100;
  708.             }
  709.           }
  710.         }
  711.       }
  712.       // 自身状态倍率
  713.       if (params.stateConfig.length) {
  714.         const _actor = $gameActors.actor(action._subjectActorId);
  715.         if (_actor && _actor._states.length) {
  716.           for (let i = 0; i < params.stateConfig.length; i++) {
  717.             const item = params.stateConfig[i];
  718.             if (_actor._states.includes(item.stateId)) {
  719.               _ap *= item.rate / 100;
  720.             }
  721.           }
  722.         }
  723.       }
  724.       // 敌人状态倍率
  725.       if (params.enemyStateConfig.length) {
  726.         const _states = target.states();
  727.         if (target && _states.length) {
  728.           for (let i = 0; i < params.enemyStateConfig.length; i++) {
  729.             const item = params.enemyStateConfig[i];
  730.             if (_states.find(s => s.id === item.stateId)) {
  731.               _ap *= item.rate / 100;
  732.             }
  733.           }
  734.         }
  735.       }
  736.       if (config.ap + _ap < 0) {
  737.         _ap = -config.ap;
  738.       } else if (config.ap + _ap > config.map) {
  739.         _ap = config.map - config.ap;
  740.       }
  741.       config.prevValue = config.ap;
  742.       // 修改当前韧性
  743.       config.ap += Math.floor(_ap);
  744.       // 重制当前的帧数为0
  745.       config.frameIndex = 0;
  746.       // 开始动画
  747.       config.isStartAnime = true;
  748.       if (config.ap <= 0 && !config.enemyInfos[config.enemyId].isBreak) {
  749.         config.enemyInfos[config.enemyId].isBreak = true;
  750.         AudioManager.playSe({
  751.           name: params.breakSound,
  752.           volume: ConfigManager.seVolume,
  753.           pitch: 100,
  754.           pan: 0
  755.         });
  756.         // 弹出Break图片
  757.         this._result.breaked = true;
  758.       } else if (config.ap > 0 && config.enemyInfos[config.enemyId].isBreak) {
  759.         config.enemyInfos[config.enemyId].isBreak = false;
  760.         this._result.breaked = false;
  761.       }
  762.       // 添加破防状态
  763.       if (config.ap <= 0 && params.breakState && !target._states.includes(params.breakState)) {
  764.         const _notBreakState = $dataEnemies[target._enemyId].meta['haku-not-break-state'];
  765.         if (_notBreakState) {
  766.           target.removeState(+_notBreakState);
  767.         }
  768.         target.addState(params.breakState);
  769.       }
  770.     }
  771.   }
  772.   // #endregion
  773.   // #region 修改系统
  774.   const BattleManager_endTurn = BattleManager.endTurn;
  775.   BattleManager.endTurn = function() {
  776.     BattleManager_endTurn.call(this);
  777.     Object.values(config.enemyInfos).filter(i => i.hasAp).forEach(enemy => {
  778.       // 破防状态下,回合结束不恢复韧性
  779.       if(!enemy.isBreak){
  780.         HakuBreakBarUtils.setAp(enemy.enemy.id, Math.min(enemy.ap + config.addTurnRecovery(enemy.map), enemy.map));
  781.       }
  782.     });
  783.     config.frameIndex = 0;
  784.     config.isStartAnime = true;
  785.   }
  786.   const Scene_Battle_createSpriteset = Scene_Battle.prototype.createSpriteset;
  787.   Scene_Battle.prototype.createSpriteset = function() {
  788.     Scene_Battle_createSpriteset.call(this);
  789.     if (!config.isInit) {
  790.       BreakBar.init(this);
  791.     }
  792.     if (!config.isInitEnemy) {
  793.       BreakBar.initEnemy();
  794.     }
  795.   }
  796.   const Scene_Battle_update = Scene_Battle.prototype.update;
  797.   Scene_Battle.prototype.update = function() {
  798.     Scene_Battle_update.call(this);

  799.     if (config.isInit) {
  800.       BreakBar.nextFrame();
  801.       BreakBar.update();
  802.     }
  803.   };

  804.   const Scene_Battle_terminate = Scene_Battle.prototype.terminate;
  805.   Scene_Battle.prototype.terminate = function() {
  806.     Scene_Battle_terminate.call(this);
  807.     config.isInit = false;
  808.   }

  809.   const BattleManager_endBattle = BattleManager.endBattle;
  810.   BattleManager.endBattle = function(result) {
  811.     BattleManager_endBattle.call(this, result);
  812.     BreakBar.destroy();
  813.   }
  814.   const Game_Action_executeDamage = Game_Action.prototype.executeDamage;
  815.   Game_Action.prototype.executeDamage = function (target, value) {
  816.     let rate = 1;

  817.     if (config.enemyInfos[target._enemyId] && config.enemyInfos[target._enemyId].hasAp) {
  818.       const _item = this.item();
  819.       const _addAp = _item.meta['haku-ap-add'];
  820.       if (_addAp) {
  821.         if (target && !target.isActor()) {
  822.           const tInfo = config.enemyInfos[target._enemyId];
  823.           // 目标破防状态,不能涨韧性条
  824.           if (tInfo && !tInfo.isBreak && !target._states.includes(params.breakState)) {
  825.             BreakBar.changeEnemy(target._enemyId);
  826.             BreakBar.changeAp.call(target, _addAp, target, _item, this);
  827.           }
  828.         }
  829.       } else if (_item.meta['haku-ap-clear']) {
  830.         BreakBar.changeEnemy(target._enemyId);
  831.         BreakBar.changeAp.call(target, -config.ap, target, _item, this);
  832.       } else if (value > 0) {
  833.         if (target && !target.isActor()) {
  834.           if (Object.keys(config.enemyInfos).includes(target._enemyId.toString())) {
  835.             BreakBar.changeEnemy(target._enemyId);
  836.             if (config.hasAp) {
  837.               if (config.container.alpha === 0) {
  838.                 config.container.alpha = 1;
  839.               }
  840.               BreakBar.changeAp.call(target, -value, target, _item, this);
  841.             }
  842.           }
  843.         }
  844.       }
  845.     }
  846.     config.visible = true;
  847.     if (target && !target.isActor() && target.hp - value * rate <= 0) {
  848.       if (config.enemyId === target._enemyId) {
  849.         config.visible = false;
  850.       }
  851.     }
  852.     Game_Action_executeDamage.call(this, target, value * rate);
  853.   };
  854.   const Game_Enemy_transform = Game_Enemy.prototype.transform;
  855.   Game_Enemy.prototype.transform = function(enemyId) {
  856.     const _oldEnemyId = this._enemyId;
  857.     Game_Enemy_transform.call(this, enemyId);
  858.     const _newEnemyId = this._enemyId;
  859.     const _enemy = $dataEnemies[_newEnemyId];
  860.     const _note = _enemy.note;
  861.     if (_note.includes(params.bossTag)) {
  862.       const _ap = Number(_enemy.meta['haku-ap'] || 0);
  863.       const _oldAp = config.ap;
  864.       config.enemyInfos[_newEnemyId] = {
  865.         prevValue: _oldAp,
  866.         enemy: _enemy,
  867.         ap: _oldAp,
  868.         map: _ap,
  869.         hasAp: _ap > 0,
  870.         isBreak: false,
  871.       };
  872.       delete config.enemyInfos[_oldEnemyId];
  873.       BreakBar.changeEnemy(_newEnemyId);
  874.       config.frameIndex = 0;
  875.       config.isStartAnime = true;
  876.     }
  877.   }
  878.   const Sprite_Damage_setup = Sprite_Damage.prototype.setup;
  879.   Sprite_Damage.prototype.setup = function(target) {
  880.     Sprite_Damage_setup.call(this, target);
  881.     var result = target.result();
  882.     if (result.breaked) {
  883.       this.createBreak();
  884.     }
  885.   };
  886.   Sprite_Damage.prototype.createBreak = function() {
  887.     var w = this.digitWidth();
  888.     var h = this.digitHeight();
  889.     var sprite = this.createChildSprite();
  890.     sprite.setFrame(95, 4 * h, 6 * w, h);
  891.     sprite.dy = 0;
  892.   };
  893.   const Game_Battler_removeState = Game_Battler.prototype.removeState;
  894.   Game_Battler.prototype.removeState = function(stateId) {
  895.     Game_Battler_removeState.call(this, stateId);
  896.     if (stateId == params.breakState && !this.isActor()) {
  897.       const enemyInfo = config.enemyInfos[this._enemyId];
  898.       if(enemyInfo){
  899.         // 破防状态解除,韧性恢复满,解除isBreak标记
  900.         enemyInfo.ap = enemyInfo.map;
  901.         enemyInfo.isBreak = false;
  902.         const _notBreakState = enemyInfo.enemy.meta['haku-not-break-state'];
  903.         if (_notBreakState) {
  904.           this.addState(+_notBreakState);
  905.         }
  906.         config.frameIndex = 0;
  907.         config.isStartAnime = true;
  908.       }
  909.     }
  910.   };
  911.   // #endregion

  912.   /** 工具类 */
  913.   class HakuBreakBarUtils {
  914.     /**
  915.      *
  916.      * @param {number} enemyId 敌人Id
  917.      * @param {number} ap Ap值
  918.      */
  919.     static setAp(enemyId, ap) {
  920.       const info = config.enemyInfos[enemyId];
  921.       if (!info) return;
  922.       // 破防状态下不允许外部脚本修改AP
  923.       if(info.isBreak) return;
  924.       info.ap = ap;
  925.     }
  926.   }
  927.   window.HakuBreakBarUtils = HakuBreakBarUtils;
  928. })();
复制代码

所以说MSN到底是什么意思啊?
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部