slave-princess-charlotte/data/Script/item/item-entirecovery.js
2025-10-12 13:17:46 -05:00

219 lines
5.4 KiB
JavaScript

var EntireRecoveryItemSelection = defineObject(BaseItemSelection,
{
setInitialSelection: function() {
// 全体回復アイテムでは、誰かを選択するという概念はないため、
// 最初の時点で選択したものとみなす。
this._isSelection = true;
return EnterResult.NOTENTER;
}
}
);
var EntireRecoveryItemUse = defineObject(BaseItemUse,
{
_itemUseParent: null,
enterMainUseCycle: function(itemUseParent, animeData) {
this._itemUseParent = itemUseParent;
this.mainAction();
return EnterResult.OK;
},
mainAction: function() {
var i, targetUnit;
var info = this._itemUseParent.getItemTargetInfo();
var arr = EntireRecoveryControl.getTargetArray(info.unit, info.item);
var count = arr.length;
for (i = 0; i < count; i++) {
targetUnit = arr[i];
this._recoveryHp(targetUnit);
}
return false;
},
getItemAnimePos: function(itemUseParent, animeData) {
var size = Miscellaneous.getFirstKeySpriteSize(animeData, 0);
var x = LayoutControl.getCenterX(-1, size.width);
var y = LayoutControl.getCenterY(-1, size.height) - 20;
return createPos(x, y);
},
_recoveryHp: function(unit) {
var hp = unit.getHp();
var maxMhp = ParamBonus.getMhp(unit);
hp += this._getValue(unit);
if (hp > maxMhp) {
hp = maxMhp;
}
unit.setHp(hp);
},
_getValue: function(targetUnit) {
var itemTargetInfo = this._itemUseParent.getItemTargetInfo();
var plus = Calculator.calculateRecoveryItemPlus(itemTargetInfo.unit, targetUnit, itemTargetInfo.item);
var recoveryInfo = itemTargetInfo.item.getEntireRecoveryInfo();
return Calculator.calculateRecoveryValue(targetUnit, recoveryInfo.getRecoveryValue(), recoveryInfo.getRecoveryType(), plus);
}
}
);
var EntireRecoveryItemInfo = defineObject(BaseItemInfo,
{
drawItemInfoCycle: function(x, y) {
ItemInfoRenderer.drawKeyword(x, y, this.getItemTypeName(StringTable.ItemInfo_EntireRecovery));
y += ItemInfoRenderer.getSpaceY();
this._drawValue(x, y);
},
getInfoPartsCount: function() {
return 2;
},
_drawValue: function(x, y) {
var recoveryInfo = this._item.getEntireRecoveryInfo();
if (recoveryInfo.getRecoveryType() === RecoveryType.SPECIFY) {
ItemInfoRenderer.drawKeyword(x, y, StringTable.Recovery_Value);
x += ItemInfoRenderer.getSpaceX();
NumberRenderer.drawRightNumber(x, y, recoveryInfo.getRecoveryValue());
}
else {
ItemInfoRenderer.drawKeyword(x, y, StringTable.Recovery_All);
x += ItemInfoRenderer.getSpaceX();
}
}
}
);
var EntireRecoveryItemAvailability = defineObject(BaseItemAvailability,
{
isItemAvailableCondition: function(unit, item) {
var i, targetUnit;
var arr = EntireRecoveryControl.getTargetArray(unit, item);
var count = arr.length;
for (i = 0; i < count; i++) {
targetUnit = arr[i];
if (targetUnit.getHp() !== ParamBonus.getMhp(targetUnit)) {
// 現在HPが最大HPでないということは、HPが減っていることを意味する。
// 一人でもHPが減ったユニットがいれば、アイテムは使用可能とみなす。
return true;
}
}
return false;
}
}
);
var EntireRecoveryItemAI = defineObject(BaseItemAI,
{
getItemScore: function(unit, combination) {
var i, targetUnit;
var score = 0;
var maxScore = this._getMaxScore();
var arr = EntireRecoveryControl.getTargetArray(unit, combination.item);
var count = arr.length;
for (i = 0; i < count; i++) {
targetUnit = arr[i];
score += this._getScore(targetUnit);
// スコアが十分高くなったら、全体回復を行うべきと考えてこれ以上調べるのをやめる
if (score >= maxScore) {
break;
}
}
if (score === 0) {
score = AIValue.MIN_SCORE;
}
return score;
},
getActionTargetType: function(unit, item) {
return ActionTargetType.ENTIRERECOVERY;
},
_isCondition: function(unit, targetUnit, item) {
return item.getTargetAggregation().isCondition(targetUnit);
},
_getScore: function(unit) {
var baseHp;
var maxHp = ParamBonus.getMhp(unit);
var currentHp = unit.getHp();
if (currentHp === maxHp) {
return 0;
}
baseHp = Math.floor(maxHp * 0.25);
if (currentHp < baseHp) {
return 50;
}
baseHp = Math.floor(maxHp * 0.5);
if (currentHp < baseHp) {
return 30;
}
baseHp = Math.floor(maxHp * 0.75);
if (currentHp < baseHp) {
return 10;
}
return 0;
},
_getMaxScore: function() {
return 150;
}
}
);
var EntireRecoveryControl = {
getTargetArray: function(unit, item) {
var i, j, count, list, targetUnit;
var filter = FilterControl.getBestFilter(unit.getUnitType(), item.getFilterFlag());
var listArray = FilterControl.getListArray(filter);
var listCount = listArray.length;
var arr= [];
var aggregation = item.getTargetAggregation();
for (i = 0; i < listCount; i++) {
list = listArray[i];
count = list.getCount();
for (j = 0; j < count; j++) {
targetUnit = list.getData(j);
if (!aggregation.isCondition(targetUnit)) {
continue;
}
if (!this._isTargetAllowed(unit, targetUnit, item)) {
continue;
}
arr.push(targetUnit);
}
}
return arr;
},
_isTargetAllowed: function(unit, targetUnit, item) {
return true;
}
};