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

345 lines
8.4 KiB
JavaScript

var ImageTalkMode = {
AUTOEVENTCHECK: 0,
SELECT: 1,
EVENT: 2
};
var ImageTalkScreen = defineObject(BaseScreen,
{
_eventChecker: null,
_imageTalkWindow: null,
_capsuleEvent: null,
setScreenData: function(screenParam) {
this._prepareScreenMemberData(screenParam);
this._completeScreenMemberData(screenParam);
},
moveScreenCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
if (mode === ImageTalkMode.AUTOEVENTCHECK) {
result = this._moveAutoEventCheck();
}
else if (mode === ImageTalkMode.SELECT) {
result = this._moveSelect();
}
else if (mode === ImageTalkMode.EVENT) {
result = this._moveEvent();
}
return result;
},
drawScreenCycle: function() {
if (root.getRestPreference().isTalkGraphicsEnabled()) {
this._drawTalkImage();
this._drawBottomWindow();
}
else {
this._drawCenterWindow();
}
},
getScreenInteropData: function() {
return root.queryScreen('ImageTalk');
},
_drawCenterWindow: function() {
var x = LayoutControl.getCenterX(-1, this._imageTalkWindow.getWindowWidth());
var y = LayoutControl.getCenterY(-1, this._imageTalkWindow.getWindowHeight());
this._imageTalkWindow.drawWindow(x, y);
},
_drawBottomWindow: function() {
var x = LayoutControl.getCenterX(-1, this._imageTalkWindow.getWindowWidth());
var height = root.getGameAreaHeight();
var dy = Math.floor(height * 0.125);
var y = height - this._imageTalkWindow.getWindowHeight() - dy;
this._imageTalkWindow.drawWindow(x, y);
},
_drawTalkImage: function() {
var info, x, y, pos;
var image = null;
var entry = this._imageTalkWindow.getChildScrollbar().getObject();
if (entry === null) {
return;
}
info = entry.event.getRestEventInfo();
image = info.getTalkImage();
if (image === null) {
return;
}
x = this._getIllustX(image);
pos = info.getPos();
if (pos === MessagePos.TOP) {
y = this._getIllustTopY(image);
}
else if (pos === MessagePos.CENTER) {
y = this._getIllustCenterY(image);
}
else {
y = this._getIllustBottomY(image);
}
image.draw(x, y);
},
_getIllustX: function(image) {
return LayoutControl.getCenterX(-1, image.getWidth());
},
_getIllustTopY: function(image) {
return 60;
},
_getIllustCenterY: function(image) {
return LayoutControl.getCenterY(-1, image.getHeight());
},
_getIllustBottomY: function(image) {
var height = root.getGameAreaHeight();
var y = Math.floor(height * 0.165);
return y;
},
_prepareScreenMemberData: function(screenParam) {
this._eventChecker = createObject(RestAutoEventChecker);
this._imageTalkWindow = createWindowObject(ImageTalkWindow, this);
this._capsuleEvent = createObject(CapsuleEvent);
},
_completeScreenMemberData: function(screenParam) {
this._imageTalkWindow.setWindowData();
this._rebuildTalkEventList();
this._changeEventMode();
},
_rebuildTalkEventList: function() {
var i, count, data, entry;
var list = this._getEventList();
var scrollbar = this._imageTalkWindow.getChildScrollbar();
var indexPrev = scrollbar.getIndex();
var countPrev = scrollbar.getObjectCount();
var xScrollPrev = scrollbar.getScrollXValue();
var yScrollPrev = scrollbar.getScrollYValue();
scrollbar.resetScrollData();
// イベントの実行後に、別イベントが表示/非表示になる可能性があるため再構築する
count = list.getCount();
for (i = 0; i < count; i++) {
data = list.getData(i);
if (this._isEvent(data)) {
entry = {};
entry.event = data;
entry.isLock = false;
scrollbar.objectSet(entry);
}
}
scrollbar.objectSetEnd();
count = scrollbar.getObjectCount();
if (count === countPrev) {
// スクロール位置を戻す
scrollbar.setScrollXValue(xScrollPrev);
scrollbar.setScrollYValue(yScrollPrev);
}
else if (indexPrev >= count) {
scrollbar.setIndex(0);
}
else {
scrollbar.setIndex(indexPrev);
}
},
_moveAutoEventCheck: function() {
if (this._eventChecker.moveEventChecker() !== MoveResult.CONTINUE) {
this.changeCycleMode(ImageTalkMode.SELECT);
}
return MoveResult.CONTINUE;
},
_moveSelect: function() {
var input = this._imageTalkWindow.moveWindow();
if (input === ScrollbarInput.SELECT) {
this._startTalkEvent();
}
else if (input === ScrollbarInput.CANCEL) {
return MoveResult.END;
}
return MoveResult.CONTINUE;
},
_moveEvent: function() {
if (this._capsuleEvent.moveCapsuleEvent() !== MoveResult.CONTINUE) {
this._endTalkEvent();
}
return MoveResult.CONTINUE;
},
_startTalkEvent: function() {
var entry;
var isExecuteMark = true;
entry = this._imageTalkWindow.getChildScrollbar().getObject();
if (entry === null) {
return;
}
// 既にイベントが実行されている場合は続行しない
if (entry.event.getExecutedMark() === EventExecutedType.EXECUTED) {
return;
}
// イベントが終了した後に、イベント名を灰色にする目的
entry.isLock = true;
this._capsuleEvent.enterCapsuleEvent(entry.event, isExecuteMark);
this.changeCycleMode(ImageTalkMode.EVENT);
},
_endTalkEvent: function() {
this._rebuildTalkEventList();
this.changeCycleMode(ImageTalkMode.SELECT);
},
_getEventList: function() {
return root.getCurrentSession().getTalkEventList();
},
_isEvent: function(event) {
return event.isEvent();
},
_changeEventMode: function() {
var result;
result = this._eventChecker.enterEventChecker(root.getCurrentSession().getAutoEventList(), RestAutoType.TALK);
if (result === EnterResult.NOTENTER) {
this.changeCycleMode(ImageTalkMode.SELECT);
}
else {
this.changeCycleMode(ImageTalkMode.AUTOEVENTCHECK);
}
}
}
);
var ImageTalkWindow = defineObject(BaseWindow,
{
_scrollbar: null,
setWindowData: function() {
var count = LayoutControl.getObjectVisibleCount(DefineControl.getTextPartsHeight(), 4);
this._scrollbar = createScrollbarObject(ImageTalkScrollbar, this);
this._scrollbar.setScrollFormation(3, count);
this._scrollbar.setActive(true);
},
setShopLayoutEntryArray: function(objectArray) {
this._scrollbar.setObjectArray(objectArray);
},
moveWindowContent: function() {
return this._scrollbar.moveInput();
},
drawWindowContent: function(x, y) {
this._scrollbar.drawScrollbar(x, y);
},
getWindowWidth: function() {
return this._scrollbar.getScrollbarWidth() + (this.getWindowXPadding() * 2);
},
getWindowHeight: function() {
return this._scrollbar.getScrollbarHeight() + (this.getWindowYPadding() * 2);
},
getListIndex: function() {
return this._scrollbar.getIndex();
},
enableSelectCursor: function(isActive) {
this._scrollbar.enableSelectCursor(isActive);
}
}
);
var ImageTalkScrollbar = defineObject(BaseScrollbar,
{
drawScrollContent: function(x, y, object, isSelect, index) {
this._drawName(x, y, object, isSelect, index);
},
playSelectSound: function() {
var object = this.getObject();
var isSelect = this._isSelectable(object);
if (isSelect) {
MediaControl.soundDirect('commandselect');
}
else {
MediaControl.soundDirect('operationblock');
}
},
getObjectWidth: function() {
return DefineControl.getTextPartsWidth();
},
getObjectHeight: function() {
return DefineControl.getTextPartsHeight();
},
_drawName: function(x, y, object, isSelect, index) {
var textui = this.getParentTextUI();
var color = this._getEventColor(object, textui);
var font = textui.getFont();
var alpha = 255;
var range = createRangeObject(x, y + 0, this.getObjectWidth(), this.getObjectHeight());
TextRenderer.drawRangeAlphaText(range, TextFormat.CENTER, object.event.getName(), this.getObjectWidth(), color, alpha, font);
},
_getEventColor: function(object, textui) {
var color;
if (object.isLock || this._isSelectable(object)) {
color = textui.getColor();
}
else {
color = ColorValue.DISABLE;
}
return color;
},
_isSelectable: function(object) {
if (object === null || object.event === null) {
return false;
}
// イベントが実行されていなければ、選択可能とみなす
return object.event.getExecutedMark() === EventExecutedType.FREE;
}
}
);