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

211 lines
5.3 KiB
JavaScript

var ResurrectionItemSelection = defineObject(BaseItemSelection,
{
_resurrectionScreen: null,
setInitialSelection: function() {
var screenParam = this._createScreenParam();
this._resurrectionScreen = createObject(ResurrectionScreen);
SceneManager.addScreen(this._resurrectionScreen, screenParam);
return EnterResult.OK;
},
moveItemSelectionCycle: function() {
var targetUnit;
if (SceneManager.isScreenClosed(this._resurrectionScreen)) {
targetUnit = this._resurrectionScreen.getResurrectionUnit();
if (targetUnit === null) {
this._isSelection = false;
this._targetPos = null;
}
else {
this._isSelection = true;
if (!Miscellaneous.isPrepareScene()) {
this._targetPos = PosChecker.getNearbyPos(this._unit, targetUnit);
}
}
this._targetUnit = targetUnit;
return MoveResult.END;
}
return MoveResult.CONTINUE;
},
_createScreenParam: function() {
var screenParam = ScreenBuilder.buildResurrection();
screenParam.unit = this._unit;
screenParam.item = this._item;
return screenParam;
}
}
);
var ResurrectionItemUse = defineObject(BaseItemUse,
{
_itemUseParent: null,
_item: null,
_targetUnit: null,
_targetPos: null,
enterMainUseCycle: function(itemUseParent) {
var itemTargetInfo = itemUseParent.getItemTargetInfo();
this._itemUseParent = itemUseParent;
this._item = itemTargetInfo.item;
this._targetUnit = itemTargetInfo.targetUnit;
this._targetPos = itemTargetInfo.targetPos;
if (!Miscellaneous.isPrepareScene()) {
// AIによるアイテム使用では、位置が初期化されていないことがある
if (this._targetPos === null) {
this._targetPos = PosChecker.getNearbyPos(itemTargetInfo.unit, itemTargetInfo.targetUnit);
}
if (PosChecker.getUnitFromPos(this._targetPos.x, this._targetPos.y) !== null) {
// ユニットが存在して蘇生できないため、アイテムを減らさない
this._itemUseParent.disableItemDecrement();
return EnterResult.NOTENTER;
}
}
this.mainAction();
return EnterResult.NOTENTER;
},
mainAction: function() {
var type = this._item.getResurrectionInfo().getResurrectionType();
if (Miscellaneous.isPrepareScene()) {
type = ResurrectionType.MAX;
}
else {
this._targetUnit.setMapX(this._targetPos.x);
this._targetUnit.setMapY(this._targetPos.y);
this._targetUnit.setSortieState(SortieType.SORTIE);
}
this._targetUnit.setAliveState(AliveType.ALIVE);
this._targetUnit.setInvisible(false);
this._targetUnit.setWait(false);
// 行動済みを解除することで、敵ターンで動けるようにする
this._targetUnit.setOrderMark(OrderMarkType.FREE);
this._changeHp(type);
},
getItemAnimePos: function(itemUseParent, animeData) {
var x, y;
var itemTargetInfo = itemUseParent.getItemTargetInfo();
var targetPos = itemUseParent.getItemTargetInfo().targetPos;
if (Miscellaneous.isPrepareScene()) {
return this.getUnitBasePos(itemUseParent, animeData);
}
if (targetPos === null) {
targetPos = PosChecker.getNearbyPos(itemTargetInfo.unit, itemTargetInfo.targetUnit);
}
x = LayoutControl.getPixelX(targetPos.x);
y = LayoutControl.getPixelY(targetPos.y);
return LayoutControl.getMapAnimationPos(x, y, animeData);
},
_changeHp: function(type) {
var hp;
var maxHp = ParamBonus.getMhp(this._targetUnit);
if (type === ResurrectionType.MIN) {
hp = 1;
}
else if (type === ResurrectionType.HALF) {
hp = Math.floor(maxHp / 2);
}
else {
hp = maxHp;
}
this._targetUnit.setHp(hp);
}
}
);
var ResurrectionItemInfo = defineObject(BaseItemInfo,
{
drawItemInfoCycle: function(x, y) {
ItemInfoRenderer.drawKeyword(x, y, this.getItemTypeName(StringTable.ItemInfo_Resurrection));
},
getInfoPartsCount: function() {
return 1;
}
}
);
var ResurrectionItemAvailability = defineObject(BaseItemAvailability,
{
isItemAvailableCondition: function(unit, item) {
var arr = ResurrectionControl.getTargetArray(unit, item);
// 死亡しているユニットが一人でもいる場合は、使用可能とみなす
return arr.length > 0;
}
}
);
var ResurrectionItemAI = defineObject(BaseItemAI,
{
getItemScore: function(unit, combination) {
return combination.targetUnit.getLv() * 7;
},
getActionTargetType: function(unit, item) {
return ActionTargetType.RESURRECTION;
}
}
);
var ResurrectionControl = {
getTargetArray: function(unit, item) {
var i, j, count, list, targetUnit;
var filter = FilterControl.getBestFilter(unit.getUnitType(), item.getFilterFlag());
var listArray = FilterControl.getDeathListArray(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;
}
};