ねつし
ユーザー
ツクールMZにおける対象がランダムな技って途中で敵が倒れると全弾当たらないのがもどかしく感じません?…なので #ChatGPT に相談して作成しましたが、どうも4発に設定しても5発も当たるという、たまに+1発されるみたいで完成にはまだ及びません。
上記のリンク先に実際の挙動を、下記にプラグイン本文を載せてますのでどなたか分かる方が居たらご教授お願いします。
/*:
* @target MZ
* @plugindesc RandomHits 完全固定型(+1防止・TPB安全)
*/
(() => {
const _startAction = BattleManager.startAction;
BattleManager.startAction = function() {
_startAction.call(this);
const action = this._subject?.currentAction();
const hits = Number(action?.item()?.meta?.RandomHits);
if (!hits) return;
this._randomHitsData = {
subject: this._subject,
action,
remaining: hits,
processing: false
};
};
const _updateAction = BattleManager.updateAction;
BattleManager.updateAction = function() {
const data = this._randomHitsData;
// 通常処理
if (!data) {
_updateAction.call(this);
return;
}
// ★ 同一フレーム多重実行防止
if (data.processing) return;
data.processing = true;
if (data.remaining <= 0) {
this._randomHitsData = null;
data.processing = false;
return;
}
const alive = data.action.opponentsUnit().aliveMembers();
if (!alive.length) {
this._randomHitsData = null;
data.processing = false;
return;
}
const target = alive[Math.randomInt(alive.length)];
const action = data.action;
const subject = data.subject;
// アニメ
if (action.item().animationId > 0) {
this._logWindow.showAnimation(subject, [target], action.item().animationId);
}
// ダメージ
action.apply(target);
this._logWindow.displayActionResults(subject, target);
data.remaining--;
// ★ 次フレームで次HITを許可
setTimeout(() => {
if (this._randomHitsData === data) {
data.processing = false;
}
}, 0);
};
})();
上記のリンク先に実際の挙動を、下記にプラグイン本文を載せてますのでどなたか分かる方が居たらご教授お願いします。
/*:
* @target MZ
* @plugindesc RandomHits 完全固定型(+1防止・TPB安全)
*/
(() => {
const _startAction = BattleManager.startAction;
BattleManager.startAction = function() {
_startAction.call(this);
const action = this._subject?.currentAction();
const hits = Number(action?.item()?.meta?.RandomHits);
if (!hits) return;
this._randomHitsData = {
subject: this._subject,
action,
remaining: hits,
processing: false
};
};
const _updateAction = BattleManager.updateAction;
BattleManager.updateAction = function() {
const data = this._randomHitsData;
// 通常処理
if (!data) {
_updateAction.call(this);
return;
}
// ★ 同一フレーム多重実行防止
if (data.processing) return;
data.processing = true;
if (data.remaining <= 0) {
this._randomHitsData = null;
data.processing = false;
return;
}
const alive = data.action.opponentsUnit().aliveMembers();
if (!alive.length) {
this._randomHitsData = null;
data.processing = false;
return;
}
const target = alive[Math.randomInt(alive.length)];
const action = data.action;
const subject = data.subject;
// アニメ
if (action.item().animationId > 0) {
this._logWindow.showAnimation(subject, [target], action.item().animationId);
}
// ダメージ
action.apply(target);
this._logWindow.displayActionResults(subject, target);
data.remaining--;
// ★ 次フレームで次HITを許可
setTimeout(() => {
if (this._randomHitsData === data) {
data.processing = false;
}
}, 0);
};
})();