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

244 lines
6.1 KiB
JavaScript

var ItemRescueSelectMode = {
TARGETSELECT: 0
};
var RescueItemSelection = defineObject(BaseItemSelection,
{
setInitialSelection: function() {
this.setUnitSelection();
this.changeCycleMode(ItemTeleportationSelectMode.TARGETSELECT);
return EnterResult.OK;
},
moveItemSelectionCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
if (mode === ItemTeleportationSelectMode.TARGETSELECT) {
result = this._moveTargetSelect();
}
return result;
},
drawItemSelectionCycle: function() {
this._posSelector.drawPosSelector();
},
isPosSelectable: function() {
var mode = this.getCycleMode();
if (mode === ItemRescueSelectMode.TARGETSELECT) {
return this._posSelector.getSelectorTarget(true) !== null;
}
return true;
},
_moveTargetSelect: function() {
var result = this._posSelector.movePosSelector();
if (result === PosSelectorResult.SELECT) {
if (this.isPosSelectable()) {
this._targetUnit = this._posSelector.getSelectorTarget(false);
this._targetPos = PosChecker.getNearbyPos(this._unit, this._targetUnit);
if (this._targetPos === null) {
this._isSelection = false;
}
else {
this._isSelection = true;
}
this._posSelector.endPosSelector();
return MoveResult.END;
}
}
else if (result === PosSelectorResult.CANCEL) {
this._isSelection = false;
this._posSelector.endPosSelector();
return MoveResult.END;
}
return MoveResult.CONTINUE;
}
}
);
var ItemRescueUseMode = {
SRC: 0,
FOCUS: 1,
DEST: 2,
END: 3,
SRCANIME: 4,
DESTANIME: 5
};
var RescueItemUse = defineObject(BaseItemUse,
{
_itemUseParent: null,
_targetUnit: null,
_targetPos: null,
_dynamicAnime: null,
enterMainUseCycle: function(itemUseParent) {
var itemTargetInfo = itemUseParent.getItemTargetInfo();
this._itemUseParent = itemUseParent;
this._targetUnit = itemTargetInfo.targetUnit;
this._targetPos = itemTargetInfo.targetPos;
// 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;
}
if (itemUseParent.isItemSkipMode()) {
this.mainAction();
return EnterResult.NOTENTER;
}
this.changeCycleMode(ItemRescueUseMode.SRC);
return EnterResult.OK;
},
moveMainUseCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
if (mode === ItemRescueUseMode.SRC) {
result = this._moveSrc();
}
else if (mode === ItemRescueUseMode.SRCANIME) {
result = this._moveSrcAnime();
}
else if (mode === ItemRescueUseMode.FOCUS) {
result = this._moveFocus();
}
else if (mode === ItemRescueUseMode.DEST) {
result = this._moveDest();
}
else if (mode === ItemRescueUseMode.DESTANIME) {
result = this._moveDestAnime();
}
else if (mode === ItemRescueUseMode.END) {
result = this._moveEnd();
}
return result;
},
drawMainUseCycle: function() {
var mode = this.getCycleMode();
if (mode === ItemRescueUseMode.SRCANIME || mode === ItemRescueUseMode.DESTANIME) {
this._dynamicAnime.drawDynamicAnime();
}
},
mainAction: function() {
this._targetUnit.setMapX(this._targetPos.x);
this._targetUnit.setMapY(this._targetPos.y);
this._targetUnit.setInvisible(false);
},
_moveSrc: function() {
var unit = PosChecker.getUnitFromPos(this._targetPos.x, this._targetPos.y);
// 移動位置にユニットがいる場合は続行できない
if (unit !== null) {
// 移動できなかったからアイテムを減らさない
this._itemUseParent.disableItemDecrement();
return MoveResult.END;
}
this._showAnime(this._targetUnit.getMapX(), this._targetUnit.getMapY());
this.changeCycleMode(ItemRescueUseMode.SRCANIME);
return MoveResult.CONTINUE;
},
_moveSrcAnime: function() {
if (this._dynamicAnime.moveDynamicAnime() !== MoveResult.CONTINUE) {
this.changeCycleMode(ItemRescueUseMode.FOCUS);
}
return MoveResult.CONTINUE;
},
_moveFocus: function() {
var generator;
this._targetUnit.setInvisible(true);
generator = root.getEventGenerator();
generator.locationFocus(this._targetPos.x, this._targetPos.y, true);
generator.execute();
this.changeCycleMode(ItemRescueUseMode.DEST);
return MoveResult.CONTINUE;
},
_moveDest: function() {
this._showAnime(this._targetPos.x, this._targetPos.y);
this.changeCycleMode(ItemRescueUseMode.DESTANIME);
return MoveResult.CONTINUE;
},
_moveDestAnime: function() {
if (this._dynamicAnime.moveDynamicAnime() !== MoveResult.CONTINUE) {
this.changeCycleMode(ItemRescueUseMode.END);
}
return MoveResult.CONTINUE;
},
_moveEnd: function() {
this.mainAction();
return MoveResult.END;
},
_showAnime: function(xTarget, yTarget) {
var x = LayoutControl.getPixelX(xTarget);
var y = LayoutControl.getPixelY(yTarget);
var anime = this._itemUseParent.getItemTargetInfo().item.getItemAnime();
var pos = LayoutControl.getMapAnimationPos(x, y, anime);
this._dynamicAnime = createObject(DynamicAnime);
this._dynamicAnime.startDynamicAnime(anime, pos.x, pos.y);
}
}
);
var RescueItemInfo = defineObject(BaseItemInfo,
{
drawItemInfoCycle: function(x, y) {
ItemInfoRenderer.drawKeyword(x, y, this.getItemTypeName(StringTable.ItemInfo_Rescue));
y += ItemInfoRenderer.getSpaceY();
this.drawRange(x, y, this._item.getRangeValue(), this._item.getRangeType());
},
getInfoPartsCount: function() {
return 2;
}
}
);
var RescueItemAvailability = defineObject(BaseItemAvailability,
{
}
);
var RescueItemAI = defineObject(BaseItemAI,
{
}
);