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

209 lines
5.1 KiB
JavaScript

var cur_map = null;
// 1つのシーンには、複数の画面が存在する可能性がある。
// それらは_screenArrayとして管理され、配列の最後の要素が現在前面に表示されている画面である。
// 具体的な画面処理は、ScreenControllerを通じて行う。
var SceneManager = {
_sceneType: 0,
_screenArray: null,
_activeAcene: null,
_isForceForeground: false,
enterSceneManagerCycle: function(sceneType) {
this._sceneType = sceneType;
this._screenArray = [];
CacheControl.clearCache();
this._activeAcene = this._getSceneObject(sceneType);
this._activeAcene.setSceneData();
return EnterResult.OK;
},
moveSceneManagerCycle: function() {
var i;
var count = this._screenArray.length;
var result = this._activeAcene.moveSceneCycle();
for (i = 0; i < count; i++) {
if (i + 1 === count) {
// this._screenArray[i]は現在前面に表示されているため、moveScreenControllerCycleを呼び出す
result = ScreenController.moveScreenControllerCycle(this._screenArray[i]);
if (result !== MoveResult.CONTINUE) {
// this._screenArray[i]の画面が閉じられたから、前の画面に戻る
this._screenArray.pop();
}
}
else {
// this._screenArray[i]は現在後面に表示されているため、moveScreenControllerBackCycleを呼び出す
ScreenController.moveScreenControllerBackCycle(this._screenArray[i]);
}
}
return result;
},
drawSceneManagerCycle: function(scene) {
var i;
var count = this._screenArray.length;
this._activeAcene.drawSceneCycle();
for (i = 0; i < count; i++) {
if (i + 1 === count) {
ScreenController.drawScreenControllerCycle(this._screenArray[i]);
}
else {
ScreenController.drawScreenControllerBackCycle(this._screenArray[i]);
}
}
},
backSceneManagerCycle: function(scene) {
var i;
var count = this._screenArray.length;
this._activeAcene.moveBackSceneCycle();
for (i = 0; i < count; i++) {
ScreenController.moveScreenControllerBackCycle(this._screenArray[i]);
}
return true;
},
addScreen: function(screen, param) {
var screenContainer = {};
screenContainer.screen = screen;
screenContainer.param = param;
this._screenArray.push(screenContainer);
ScreenController.enterScreenControllerCycle(screenContainer);
},
getChildScreenContainer: function(screenContainer) {
var i;
var count = this._screenArray.length;
for (i = 0; i < count; i++) {
if (this._screenArray[i] === screenContainer) {
if (i < count - 1) {
// 現在の画面の次の画面(子の画面)を返す
return this._screenArray[i + 1];
}
}
}
return null;
},
getParentScreenContainer: function(screenContainer) {
var i;
var count = this._screenArray.length;
for (i = 0; i < count; i++) {
if (this._screenArray[i] === screenContainer) {
if (i - 1 >= 0) {
// 現在の画面の前の画面(親の画面)を返す
return this._screenArray[i - 1];
}
}
}
return null;
},
getActiveScene: function() {
return this._activeAcene;
},
getLastScreen: function() {
return this._screenArray[this._screenArray.length - 1].screen;
},
setEffectAllRange: function(isFilled) {
var effect = root.getScreenEffect();
if (isFilled) {
effect.setAlpha(255);
}
else {
effect.setAlpha(0);
}
effect.setRange(EffectRangeType.ALL);
},
// このメソッドがtrueを返す場合は、effect.getColor()が示す色によって、
// 画面全体が一色で塗りつぶされていることを意味する。
isScreenFilled: function() {
var effect = root.getScreenEffect();
return effect.getAlpha() === 255;
},
resetCurrentMap: function() {
cur_map = root.getCurrentSession().getCurrentMapInfo();
CurrentMap.prepareMap();
},
isScreenClosed: function(screen) {
var i;
var count = this._screenArray.length;
for (i = 0; i < count; i++) {
if (this._screenArray[i].screen === screen) {
return false;
}
}
return true;
},
getScreenCount: function() {
return this._screenArray.length;
},
isForceForeground: function() {
return this._isForceForeground;
},
setForceForeground: function(isForceForeground) {
this._isForceForeground = isForceForeground;
},
_getSceneObject: function(scene) {
var obj = null;
if (scene === SceneType.TITLE) {
obj = TitleScene;
}
else if (scene === SceneType.ENDING) {
obj = EndingScene;
}
else if (scene === SceneType.GAMEOVER) {
obj = GameOverScene;
}
else if (scene === SceneType.FREE) {
obj = FreeAreaScene;
}
else if (scene === SceneType.BATTLESETUP) {
obj = BattleSetupScene;
}
else if (scene === SceneType.BATTLERESULT) {
obj = BattleResultScene;
}
else if (scene === SceneType.REST) {
obj = RestScene;
}
else if (scene === SceneType.EVENTTEST) {
obj = EventTestScene;
}
return createObject(obj);
}
};