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

655 lines
14 KiB
JavaScript

var CommandCursor = defineObject(BaseObject,
{
_max: 0,
_col: 0,
_type: 0,
_index: 0,
_counter: null,
_commandCursorSrcIndex: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(20);
this._counter.disableGameAcceleration();
},
setCursorLeftRight: function(max) {
this._max = max;
this._type = 0;
},
setCursorUpDown: function(max) {
this._max = max;
this._type = 1;
},
setCursorCross: function(max, col) {
this._max = max;
this._col = col;
this._type = 2;
},
moveCursor: function() {
var d, inputType;
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
this._commandCursorSrcIndex++;
if (this._commandCursorSrcIndex === 2) {
this._commandCursorSrcIndex = 0;
}
}
inputType = InputControl.getDirectionState();
if (inputType === InputType.NONE) {
return InputType.NONE;
}
if (this._max < 1) {
return InputType.NONE;
}
d = this._getIntervalValue(inputType);
this._changeCursorIndex(d);
return inputType;
},
drawCursor: function(x, y, isActive, pic) {
var xSrc = 0;
var width = UIFormat.SELECTCURSOR_WIDTH / 2;
var height = UIFormat.SELECTCURSOR_HEIGHT / 2;
if (pic === null) {
return;
}
x -= 25;
xSrc = this._commandCursorSrcIndex * width;
if (isActive) {
pic.drawParts(x - 0, y + 0, xSrc, 0, width, height);
}
else {
xSrc = 0;
pic.drawParts(x - 0, y + 0, xSrc, height, width, height);
}
},
getCommandCursorIndex: function() {
return this._index;
},
setCommandCursorIndex: function(index) {
this._index = index;
},
validate: function() {
if (this._index < 0) {
this._index = 0;
}
else if (this._index > this._max - 1) {
this._index = this._max - 1;
}
},
_getIntervalValue: function(key) {
var d = 0;
if (this._type === 0) {
if (key === InputType.LEFT) {
d = -1;
}
else if (key === InputType.RIGHT) {
d = 1;
}
}
else if (this._type === 1) {
if (key === InputType.UP) {
d = -1;
}
else if (key === InputType.DOWN) {
d = 1;
}
}
else if (this._type === 2) {
if (key === InputType.LEFT) {
d = -1;
}
else if (key === InputType.RIGHT) {
d = 1;
}
else if (key === InputType.UP) {
d = this._col * -1;
}
else if (key === InputType.DOWN) {
d = this._col;
}
}
return d;
},
_changeCursorIndex: function(d) {
var prevIndex = this._index;
this._index += d;
if (d < 0) {
if (this._index < 0) {
this._index = this._max - 1;
}
}
else if (d > 0) {
if (this._index > this._max - 1) {
this._index = 0;
}
}
if (prevIndex !== this._index) {
// 位置が変更されたため、音を鳴らす
this._playMoveCursorSound();
}
},
_playMoveCursorSound: function() {
MediaControl.soundDirect('commandcursor');
}
}
);
var PageCursor = defineObject(BaseObject,
{
_counter: null,
_cursorIndex: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(20);
this._counter.disableGameAcceleration();
},
moveCursor: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
if (this._cursorIndex === 0) {
this._cursorIndex = 1;
}
else {
this._cursorIndex = 0;
}
}
return MoveResult.CONTINUE;
},
drawCursor: function(x, y, pic) {
var n = this._cursorIndex;
var width = UIFormat.PAGECURSOR_WIDTH / 2;
var height = UIFormat.PAGECURSOR_HEIGHT;
if (pic !== null) {
pic.drawParts(x, y, width * n, 0, width, height);
}
}
}
);
var PosDoubleCursor = defineObject(BaseObject,
{
_counter: null,
_cursorIndex: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(20);
this._counter.disableGameAcceleration();
},
moveCursor: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
if (this._cursorIndex === 0) {
this._cursorIndex = 1;
}
else {
this._cursorIndex = 0;
}
}
return MoveResult.CONTINUE;
},
drawCursor: function(xSrc, ySrc, xDest, yDest) {
var x = LayoutControl.getPixelX(xSrc);
var y = LayoutControl.getPixelY(ySrc);
this.drawSrcCursor(x, y);
x = LayoutControl.getPixelX(xDest);
y = LayoutControl.getPixelY(yDest);
this.drawDestCursor(x, y);
},
drawSrcCursor: function(x, y) {
var width = UIFormat.SELECTCURSOR_WIDTH / 2;
var height = UIFormat.SELECTCURSOR_HEIGHT / 2;
var xSrc = 0;
var ySrc = height;
var pic = root.queryUI('command_poschangecursor');
pic.drawParts(x - 10, y, xSrc, ySrc, width, height);
},
drawDestCursor: function(x, y) {
var width = UIFormat.SELECTCURSOR_WIDTH / 2;
var height = UIFormat.SELECTCURSOR_HEIGHT / 2;
var xSrc = this._cursorIndex * width;
var ySrc = 0;
var pic = root.queryUI('command_poschangecursor');
pic.drawParts(x - 10, y, xSrc, ySrc, width, height);
}
}
);
var FocusCursor = defineObject(BaseObject,
{
_counter: null,
_mapCursorSrcIndex: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(16);
this._counter.disableGameAcceleration();
},
setPos: function(x, y) {
root.getCurrentSession().setMapCursorX(x);
root.getCurrentSession().setMapCursorY(y);
},
moveCursor: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
if (this._mapCursorSrcIndex === 0) {
this._mapCursorSrcIndex = 1;
}
else {
this._mapCursorSrcIndex = 0;
}
}
return MoveResult.CONTINUE;
},
drawCursor: function() {
var session = root.getCurrentSession();
var width = UIFormat.MAPCURSOR_WIDTH / 2;
var height = UIFormat.MAPCURSOR_HEIGHT;
var x = (session.getMapCursorX() * width) - session.getScrollPixelX();
var y = (session.getMapCursorY() * height) - session.getScrollPixelY();
var pic = root.queryUI('focuscursor');
var pic2 = root.queryUI('lockoncursor');
if (pic !== null) {
pic.drawParts(x, y - 40, this._mapCursorSrcIndex * width, 0, width, height);
}
if (pic2 !== null) {
pic2.drawParts(x, y, this._mapCursorSrcIndex * width, 0, width, height);
}
},
endCursor: function() {
}
}
);
var LockonCursor = defineObject(BaseObject,
{
_counter: null,
_x: 0,
_y: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(30);
},
setPos: function(x, y) {
var indexArray = [];
if (this._isPanel()) {
indexArray.push(CurrentMap.getIndex(x, y));
MapLayer.getMapChipLight().setIndexArray(indexArray);
}
else {
this._x = x;
this._y = y;
}
},
moveCursor: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
this.endCursor();
return MoveResult.END;
}
return MoveResult.CONTINUE;
},
drawCursor: function() {
if (!this._isPanel()) {
this._drawMapCursor();
}
},
endCursor: function() {
if (this._isPanel()) {
MapLayer.getMapChipLight().endLight();
}
},
_drawMapCursor: function() {
var session = root.getCurrentSession();
var width = UIFormat.MAPCURSOR_WIDTH / 2;
var height = UIFormat.MAPCURSOR_HEIGHT;
var x = (this._x * width) - session.getScrollPixelX();
var y = (this._y * height) - session.getScrollPixelY();
var pic = root.queryUI('lockoncursor');
var mapCursorSrcIndex = 0;
if (pic !== null) {
pic.drawParts(x, y, mapCursorSrcIndex * width, 0, width, height);
}
},
_isPanel: function() {
return true;
}
}
);
var MapCursor = defineObject(BaseObject,
{
_counter: null,
_mapCursorSrcIndex: 0,
_isInputEnabled: true,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(22);
this._counter.disableGameAcceleration();
},
setPos: function(x, y) {
root.getCurrentSession().setMapCursorX(x);
root.getCurrentSession().setMapCursorY(y);
},
moveCursor: function() {
var inputType;
this.moveCursorAnimation();
inputType = this._getDirectionInputType();
if (inputType === InputType.NONE) {
MouseControl.moveMapMouse(this);
return inputType;
}
this._changeCursorValue(inputType);
return inputType;
},
moveCursorAnimation: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
if (this._mapCursorSrcIndex === 0) {
this._mapCursorSrcIndex = 1;
}
else {
this._mapCursorSrcIndex = 0;
}
}
return MoveResult.CONTINUE;
},
drawCursor: function() {
var session = root.getCurrentSession();
var width = UIFormat.MAPCURSOR_WIDTH / 2;
var height = UIFormat.MAPCURSOR_HEIGHT;
var x = (session.getMapCursorX() * width) - session.getScrollPixelX();
var y = (session.getMapCursorY() * height) - session.getScrollPixelY();
var pic = root.queryUI('mapcursor');
if (pic !== null) {
pic.drawParts(x, y, this._mapCursorSrcIndex * width, 0, width, height);
}
},
getX: function() {
return root.getCurrentSession().getMapCursorX();
},
getY: function() {
return root.getCurrentSession().getMapCursorY();
},
getUnitFromCursor: function() {
var session = root.getCurrentSession();
return PosChecker.getUnitFromPos(session.getMapCursorX(), session.getMapCursorY());
},
getMapChipFromCursor: function() {
var session = root.getCurrentSession();
return PosChecker.getTerrainFromPos(session.getMapCursorX(), session.getMapCursorY());
},
enableInput: function(enable) {
this._isInputEnabled = enable;
},
_getDirectionInputType: function() {
var inputType;
if (!this._isInputEnabled) {
return InputType.NONE;
}
if (this._isAccelerate()) {
inputType = InputControl.getDirectionStateHigh();
}
else {
inputType = InputControl.getDirectionState();
}
return inputType;
},
_isAccelerate: function() {
// キャンセルキーが押下されている場合は、カーソル移動を高速化する
return InputControl.isCancelState();
},
_changeCursorValue: function(input) {
var session = root.getCurrentSession();
var xCursor = session.getMapCursorX();
var yCursor = session.getMapCursorY();
var n = root.getCurrentSession().getMapBoundaryValue();
if (input === InputType.LEFT) {
xCursor--;
}
else if (input === InputType.UP) {
yCursor--;
}
else if (input === InputType.RIGHT) {
xCursor++;
}
else if (input === InputType.DOWN) {
yCursor++;
}
if (xCursor < n) {
xCursor = n;
}
else if (yCursor < n) {
yCursor = n;
}
else if (xCursor > CurrentMap.getWidth() - 1 - n) {
xCursor = CurrentMap.getWidth() - 1 - n;
}
else if (yCursor > CurrentMap.getHeight() - 1 - n) {
yCursor = CurrentMap.getHeight() - 1 - n;
}
else {
// カーソルが移動できたため、音を鳴らす
this._playMovingSound();
}
MapView.setScroll(xCursor, yCursor);
session.setMapCursorX(xCursor);
session.setMapCursorY(yCursor);
},
_playMovingSound: function() {
MediaControl.soundDirect('mapcursor');
}
}
);
var EdgeCursor = defineObject(BaseObject,
{
_counter: null,
_scrollCursorIndex: 0,
_totalWidth: 0,
_totalHeight: 0,
initialize: function() {
this._counter = createObject(CycleCounter);
this._counter.setCounterInfo(20);
this._counter.disableGameAcceleration();
},
setEdgeRange: function(width, height) {
this._totalWidth = width;
this._totalHeight = height;
},
moveCursor: function() {
if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) {
if (this._scrollCursorIndex === 0) {
this._scrollCursorIndex = 1;
}
else {
this._scrollCursorIndex = 0;
}
}
return MoveResult.CONTINUE;
},
drawHorzCursor: function(xStart, yStart, isLeft, isRight) {
var range;
var srcWidth = 32;
var srcHeight = 32;
var xSrc = this._scrollCursorIndex * srcWidth;
var ySrc = 0;
var pic = this._getCursorUI();
if (pic === null) {
return;
}
if (isLeft) {
ySrc = 0;
range = this.getLeftEdgeRange(xStart, yStart);
pic.drawParts(range.x, range.y, xSrc, ySrc, srcWidth, srcHeight);
}
if (isRight) {
ySrc = 64;
range = this.getRightEdgeRange(xStart, yStart);
pic.drawParts(range.x, range.y, xSrc, ySrc, srcWidth, srcHeight);
}
},
drawVertCursor: function(xStart, yStart, isTop, isBottom) {
var range;
var srcWidth = 32;
var srcHeight = 32;
var xSrc = this._scrollCursorIndex * srcWidth;
var ySrc = 0;
var pic = this._getCursorUI();
if (pic === null) {
return;
}
if (isTop) {
ySrc = 32;
range = this.getTopEdgeRange(xStart, yStart);
pic.drawParts(range.x, range.y, xSrc, ySrc, srcWidth, srcHeight);
}
if (isBottom) {
ySrc = 96;
range = this.getBottomEdgeRange(xStart, yStart);
pic.drawParts(range.x, range.y, xSrc, ySrc, srcWidth, srcHeight);
}
},
getLeftEdgeRange: function(xStart, yStart) {
var xHalf = 16;
var yHalf = 16;
var x = xStart - xHalf - xHalf;
var y = Math.floor(((yStart + this._totalHeight) + yStart) / 2) - yHalf;
return this._createEdgeRange(x, y);
},
getRightEdgeRange: function(xStart, yStart) {
var xHalf = 16;
var yHalf = 16;
var x = xStart + this._totalWidth - xHalf;
var y = Math.floor(((yStart + this._totalHeight) + yStart) / 2) - yHalf;
return this._createEdgeRange(x, y);
},
getTopEdgeRange: function(xStart, yStart) {
var xHalf = 16;
var yHalf = 16;
var x = Math.floor(((xStart + this._totalWidth) + xStart) / 2) - xHalf;
var y = yStart - yHalf - yHalf;
return this._createEdgeRange(x, y);
},
getBottomEdgeRange: function(xStart, yStart) {
var xHalf = 16;
var yHalf = 16;
var x = Math.floor(((xStart + this._totalWidth) + xStart) / 2) - xHalf;
var y = yStart + this._totalHeight - yHalf;
return this._createEdgeRange(x, y);
},
_getCursorUI: function() {
return root.queryUI('scrollcursor');
},
_createEdgeRange: function(x, y) {
return createRangeObject(x, y, 32, 32);
}
}
);
var EdgeMapSideCursor = defineObject(EdgeCursor,
{
_getCursorUI: function() {
return root.queryUI('mapscrollcursor');
}
}
);