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

259 lines
7.6 KiB
JavaScript

var BaseScreenMode = {
SRC_OUT: 0,
DEST_IN: 1,
CONTENT: 2,
DEST_OUT: 3,
SRC_IN: 4
};
// 画面切り替え時には、背景表示や音楽再生、暗転処理などが必要になる。
// 全ての画面にそうしたコードを含めないように、共通処理をScreenControllerで管理する。
var ScreenController = {
_scrollBackground: null,
enterScreenControllerCycle: function(screenContainer) {
var obj;
var mode = -1;
if (this._scrollBackground === null) {
this._scrollBackground = createObject(ScrollBackground);
}
screenContainer.mode = 0;
screenContainer.transition = null;
screenContainer.isMusicPlay = false;
if (SceneManager.isScreenFilled()) {
screenContainer.transition = createObject(SystemTransition);
mode = BaseScreenMode.DEST_IN;
}
else {
obj = this._getTransitionObject(screenContainer);
if (obj !== null) {
screenContainer.transition = createObject(obj);
mode = BaseScreenMode.SRC_OUT;
}
}
if (mode !== -1) {
screenContainer.transition.setFadeSpeed(this._getFadeSpeed());
this._changeBaseMode(mode, screenContainer);
}
else {
this._playScreenMusic(screenContainer);
this._setScrollBackground(screenContainer);
this._changeBaseMode(BaseScreenMode.CONTENT, screenContainer);
}
screenContainer.screen.setScreenData(screenContainer.param);
},
moveScreenControllerCycle: function(screenContainer) {
var parentScreenContainer;
var mode = screenContainer.mode;
var transition = screenContainer.transition;
if (mode === BaseScreenMode.SRC_OUT) {
if (transition.moveTransition() !== MoveResult.CONTINUE) {
this._changeBaseMode(BaseScreenMode.DEST_IN, screenContainer);
}
}
else if (mode === BaseScreenMode.DEST_IN) {
if (transition.moveTransition() !== MoveResult.CONTINUE) {
this._changeBaseMode(BaseScreenMode.CONTENT, screenContainer);
}
}
else if (mode === BaseScreenMode.CONTENT) {
if (screenContainer.screen.moveScreenCycle() !== MoveResult.CONTINUE) {
// ここが実行されるということは、画面が閉じられたことを意味する
if (transition === null) {
this._stopScreenMusic(screenContainer);
this._resetScrollBackground(screenContainer);
parentScreenContainer = SceneManager.getParentScreenContainer(screenContainer);
if (parentScreenContainer !== null) {
parentScreenContainer.screen.notifyChildScreenClosed();
}
return MoveResult.END;
}
else {
this._changeBaseMode(BaseScreenMode.DEST_OUT, screenContainer);
}
}
}
else if (mode === BaseScreenMode.DEST_OUT) {
if (transition.moveTransition() !== MoveResult.CONTINUE) {
this._changeBaseMode(BaseScreenMode.SRC_IN, screenContainer);
}
}
else if (mode === BaseScreenMode.SRC_IN) {
if (transition.moveTransition() !== MoveResult.CONTINUE) {
return MoveResult.END;
}
}
this._scrollBackground.moveScrollBackground();
return MoveResult.CONTINUE;
},
moveScreenControllerBackCycle: function(screenContainer) {
return screenContainer.screen.moveBackScreenCycle();
},
drawScreenControllerCycle: function(screenContainer) {
var mode = screenContainer.mode;
if (mode === BaseScreenMode.DEST_IN || mode === BaseScreenMode.CONTENT || mode === BaseScreenMode.DEST_OUT) {
this._drawScreenMain(screenContainer);
}
if (mode !== BaseScreenMode.CONTENT) {
screenContainer.transition.drawTransition();
}
},
drawScreenControllerBackCycle: function(screenContainer) {
var mode, childScreenContainer;
// 子の画面が存在しない場合は、続行しない
childScreenContainer = SceneManager.getChildScreenContainer(screenContainer);
if (childScreenContainer === null) {
return;
}
mode = childScreenContainer.mode;
// 子の画面を表示するにあたり、暗転中は親の画面を表示するべきだから、
// _drawScreenMainを呼び出す。
if (mode === BaseScreenMode.SRC_OUT || mode === BaseScreenMode.SRC_IN) {
this._drawScreenMain(screenContainer);
}
},
_drawScreenMain: function(screenContainer) {
var interopData, textui;
var screen = screenContainer.screen;
this._scrollBackground.drawScrollBackground();
interopData = screen.getScreenInteropData();
if (interopData !== null) {
textui = interopData.getTopFrameTextUI();
}
else {
textui = null;
}
// 上フレームを描画
screen.drawScreenTopText(textui);
if (interopData !== null) {
textui = interopData.getBottomFrameTextUI();
}
else {
textui = null;
}
// 下フレームを描画
screen.drawScreenBottomText(textui);
// 画面の内容を描画
screen.drawScreenCycle();
},
_playScreenMusic: function(screenContainer) {
var handle = screenContainer.screen.getScreenMusicHandle();
var handleActive = root.getMediaManager().getActiveMusicHandle();
// 画面に音楽が設定されていない場合は、再生する必要がない
if (handle.isNullHandle()) {
return;
}
// 画面に音楽は設定されているが、現在再生されている曲と同じであるため、再生する必要がない
if (handle.isEqualHandle(handleActive)) {
return;
}
MediaControl.musicPlayNew(handle);
screenContainer.isMusicPlay = true;
},
_stopScreenMusic: function(screenContainer) {
// 画面の音楽を再生していた場合は戻す
if (screenContainer.isMusicPlay) {
MediaControl.musicStop(MusicStopType.BACK);
}
},
_setScrollBackground: function(screenContainer) {
this._scrollBackground.startScrollBackground(screenContainer.screen.getScreenBackgroundImage());
},
_resetScrollBackground: function(screenContainer) {
var parentScreenContainer = SceneManager.getParentScreenContainer(screenContainer);
if (parentScreenContainer === null) {
this._scrollBackground.startScrollBackground(null);
return;
}
this._scrollBackground.startScrollBackground(parentScreenContainer.screen.getScreenBackgroundImage());
},
_getTransitionObject: function(screenContainer) {
var obj, picScreen, parentScreenContainer;
var picScreenParent = null;
// 切り替わる画面に背景が設定されていない場合は、暗転しない
picScreen = screenContainer.screen.getScreenBackgroundImage();
if (picScreen === null) {
return null;
}
parentScreenContainer = SceneManager.getParentScreenContainer(screenContainer);
if (parentScreenContainer !== null) {
picScreenParent = parentScreenContainer.screen.getScreenBackgroundImage();
}
// 切り替え対象の画面の背景が、現在の画面の背景と異なる場合は暗転する
if (picScreen !== picScreenParent) {
obj = SystemTransition;
}
else {
obj = null;
}
return obj;
},
_getFadeSpeed: function() {
return 14;
},
_changeBaseMode: function(mode, screenContainer) {
var transition = screenContainer.transition;
if (mode === BaseScreenMode.SRC_OUT) {
transition.setDestOut();
}
else if (mode === BaseScreenMode.DEST_IN) {
this._playScreenMusic(screenContainer);
this._setScrollBackground(screenContainer);
transition.setDestIn();
}
else if (mode === BaseScreenMode.DEST_OUT) {
transition.setDestOut();
}
else if (mode === BaseScreenMode.SRC_IN) {
this._stopScreenMusic(screenContainer);
this._resetScrollBackground(screenContainer);
transition.setDestIn();
}
screenContainer.mode = mode;
}
};