slave-princess-charlotte/data/Script/screen/screen-quest.js
2025-10-22 17:22:34 -05:00

724 lines
18 KiB
JavaScript

var QuestScreenMode = {
AUTOEVENTCHECK: 0,
SELECT: 1,
EVENT: 2,
QUESTION: 3
};
var QuestScreen = defineObject(BaseScreen,
{
_eventChecker: null,
_questListWindow: null,
_questDetailWindow: null,
_questionWindow: null,
_questEntryArray: null,
_capsuleEvent: null,
setScreenData: function(screenParam) {
this._prepareScreenMemberData(screenParam);
this._completeScreenMemberData(screenParam);
},
moveScreenCycle: function() {
var mode = this.getCycleMode();
var result = MoveResult.CONTINUE;
if (mode === QuestScreenMode.AUTOEVENTCHECK) {
result = this._moveAutoEventCheck();
}
else if (mode === QuestScreenMode.SELECT) {
result = this._moveSelect();
}
else if (mode === QuestScreenMode.EVENT) {
result = this._moveEvent();
}
else if (mode === QuestScreenMode.QUESTION) {
result = this._moveQuestion();
}
return result;
},
drawScreenCycle: function() {
var width = this._questListWindow.getWindowWidth() + this._questDetailWindow.getWindowWidth();
var x = LayoutControl.getCenterX(-1, width);
var y = LayoutControl.getCenterY(-1, this._questListWindow.getWindowHeight());
this._questListWindow.drawWindow(x, y);
this._questDetailWindow.drawWindow(x + this._questListWindow.getWindowWidth(), y);
if (this.getCycleMode() === QuestScreenMode.QUESTION) {
this._drawQuestionWindow();
}
},
drawScreenBottomText: function(textui) {
var text;
var entry = this.getCurrentQuestEntry();
if (entry.isVisible) {
text = entry.data.getDescription();
}
else {
text = '';
}
TextRenderer.drawScreenBottomText(text, textui);
},
getScreenInteropData: function() {
return root.queryScreen('Quest');
},
getCurrentQuestEntry: function() {
return this._questEntryArray[this._questListWindow.getQuestListIndex()];
},
_prepareScreenMemberData: function(screenParam) {
this._eventChecker = createObject(RestAutoEventChecker);
this._questListWindow = createWindowObject(QuestListWindow, this);
this._questDetailWindow = createWindowObject(QuestDetailWindow, this);
this._questionWindow = createWindowObject(QuestionWindow, this);
this._capsuleEvent = createObject(CapsuleEvent);
},
_completeScreenMemberData: function(screenParam) {
this._questEntryArray = this._getQuestArray();
this._questListWindow.setWindowData();
this._questListWindow.setQuestEntryArray(this._questEntryArray);
this._questionWindow.setQuestionMessage(StringTable.Quest_Select);
this._questDetailWindow.setQuestData(this._questEntryArray[0].data);
this._questDetailWindow.setSize(Math.floor(this._questListWindow.getWindowHeight() * 1.2), this._questListWindow.getWindowHeight());
this._changeEventMode();
},
_getQuestArray: function() {
var i, quest, entry;
var arr = [];
var list = root.getBaseData().getRestQuestList();
var count = list.getCount();
for (i = 0; i < count; i++) {
quest = list.getData(i);
if (!quest.isQuestDisplayable()) {
continue;
}
entry = StructureBuilder.buildListEntry();
entry.isAvailable = quest.isQuestAvailable();
entry.isVisible = entry.isAvailable || !quest.isPrivateQuest();
if (entry.isVisible) {
entry.name = quest.getName();
}
else {
entry.name = StringTable.HideData_Question;
}
entry.data = quest;
arr.push(entry);
}
return arr;
},
_moveAutoEventCheck: function() {
if (this._eventChecker.moveEventChecker() !== MoveResult.CONTINUE) {
this.changeCycleMode(QuestScreenMode.SELECT);
}
return MoveResult.CONTINUE;
},
_moveSelect: function() {
var input = this._questListWindow.moveWindow();
if (input === ScrollbarInput.SELECT) {
this._startQuestEvent();
}
else if (input === ScrollbarInput.CANCEL) {
return MoveResult.END;
}
else {
if (this._questListWindow.isIndexChanged()) {
this._questDetailWindow.setQuestData(this._questEntryArray[this._questListWindow.getQuestListIndex()].data);
}
}
return MoveResult.CONTINUE;
},
_moveEvent: function() {
var result = MoveResult.CONTINUE;
if (this._capsuleEvent.moveCapsuleEvent() !== MoveResult.CONTINUE) {
this._startQuestion();
return MoveResult.CONTINUE;
}
return result;
},
_moveQuestion: function() {
if (this._questionWindow.moveWindow() !== MoveResult.CONTINUE) {
if (this._questionWindow.getQuestionAnswer() === QuestionAnswer.YES) {
this._startQuestMap();
return MoveResult.CONTIUNE;
}
else {
this._questListWindow.enableSelectCursor(true);
this._changeSelectMode();
}
}
return MoveResult.CONTINUE;
},
_drawQuestionWindow: function() {
var width = this._questionWindow.getWindowWidth();
var height = this._questionWindow.getWindowHeight();
var x = LayoutControl.getCenterX(-1, width);
var y = LayoutControl.getCenterY(-1, height);
this._questionWindow.drawWindow(x, y);
},
_startQuestEvent: function() {
var event = this._getPlaceEvent();
var isExecuteMark = false;
this._capsuleEvent.enterCapsuleEvent(event, isExecuteMark);
this._questListWindow.enableSelectCursor(false);
this.changeCycleMode(QuestScreenMode.EVENT);
},
_startQuestion: function() {
if (this.getCurrentQuestEntry().isAvailable) {
this.changeCycleMode(QuestScreenMode.QUESTION);
this._questionWindow.setQuestionActive(true);
}
else {
this._questListWindow.enableSelectCursor(true);
this._changeSelectMode();
}
},
_startQuestMap: function() {
var quest = this.getCurrentQuestEntry().data;
var map = quest.getFreeMap();
root.getSceneController().startNewMap(map.getId());
root.changeScene(SceneType.BATTLESETUP);
},
_getPlaceEvent: function() {
var event;
var entry = this.getCurrentQuestEntry();
var quest = entry.data;
if (entry.isAvailable) {
event = quest.getEnabledEvent();
}
else {
event = quest.getDisabledEvent();
}
return event;
},
_changeSelectMode: function() {
this.changeCycleMode(QuestScreenMode.SELECT);
},
_changeEventMode: function() {
var result;
result = this._eventChecker.enterEventChecker(root.getCurrentSession().getAutoEventList(), RestAutoType.QUEST);
if (result === EnterResult.NOTENTER) {
this.changeCycleMode(QuestScreenMode.SELECT);
}
else {
this.changeCycleMode(QuestScreenMode.AUTOEVENTCHECK);
}
}
}
);
var QuestListWindow = defineObject(BaseWindow,
{
_scrollbar: null,
setWindowData: function() {
var count = LayoutControl.getObjectVisibleCount(DefineControl.getTextPartsHeight(), 12);
this._scrollbar = createScrollbarObject(QuestListScrollbar, this);
this._scrollbar.setScrollFormation(1, count);
this._scrollbar.setActive(true);
},
setQuestEntryArray: 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);
},
getQuestListIndex: function() {
return this._scrollbar.getIndex();
},
isIndexChanged: function() {
return this._scrollbar.checkAndUpdateIndex();
},
enableSelectCursor: function(isActive) {
this._scrollbar.enableSelectCursor(isActive);
}
}
);
var QuestListScrollbar = defineObject(BaseScrollbar,
{
drawScrollContent: function(x, y, object, isSelect, index) {
var dx = 0;
var length = this._getTextLength();
var textui = this.getParentTextUI();
var font = textui.getFont();
var color = object.isAvailable ? textui.getColor() : ColorValue.DISABLE;
var handle = object.data.getIconResourceHandle();
if (object.isVisible) {
if (!handle.isNullHandle()) {
dx = GraphicsFormat.ICON_WIDTH + 6;
GraphicsRenderer.drawImage(x, y, handle, GraphicsType.ICON);
}
}
TextRenderer.drawKeywordText(x + dx, y, object.name, length, color, font);
},
playSelectSound: function() {
var object = this.getObject();
var isSelect = true;
if (!object.isVisible) {
isSelect = false;
}
if (isSelect) {
MediaControl.soundDirect('commandselect');
}
else {
MediaControl.soundDirect('operationblock');
}
},
getObjectWidth: function() {
// Increase width to allow longer quest names to render without truncation.
// Previously this relied on DefineControl.getTextPartsWidth() (135px) which is too small for translated text.
// Bump the effective width to ~1.8x of the default text parts width plus the icon width.
return Math.floor(DefineControl.getTextPartsWidth() * 1.8) + GraphicsFormat.ICON_WIDTH;
},
getObjectHeight: function() {
return DefineControl.getTextPartsHeight();
},
_getTextLength: function() {
return this.getObjectWidth();
}
}
);
var QuestDetailWindow = defineObject(BaseWindow,
{
_picCache: null,
_quest: null,
_groupArray: null,
_width: null,
_height: null,
setSize: function(width, height) {
this._width = width;
this._height = height;
},
setQuestData: function(quest) {
var i, count;
this._quest = quest;
this._picCache = null;
this._groupArray = [];
this._configureSentence(this._groupArray);
count = this._groupArray.length;
for (i = 0; i < count; i++) {
this._groupArray[i].setParentWindow(this);
this._groupArray[i].setCalculatorValue(this._quest);
}
},
moveWindowContent: function() {
var i, count;
count = this._groupArray.length;
for (i = 0; i < count; i++) {
this._groupArray[i].moveQuestSentence();
}
return MoveResult.CONTINUE;
},
drawWindowContent: function(x, y) {
var isPrivate = false;
if (this._quest === null) {
isPrivate = true;
}
else if (!this._quest.isQuestAvailable()) {
isPrivate = this._quest.isPrivateQuest();
}
if (isPrivate) {
this._drawEmptyMap(x, y);
this._drawEmptySentence(x, y);
}
else {
this._drawThumbnailMap(x, y);
this._drawSentenceZone(x, y);
}
},
getQuestSentenceSpaceY: function() {
return 38;
},
getTitlePartsCount: function() {
return 6;
},
_drawThumbnailMap: function(x, y) {
var mapData = this._quest.getFreeMap();
var cacheWidth = mapData.getMapWidth() * GraphicsFormat.MAPCHIP_WIDTH;
var cacheHeight = mapData.getMapHeight() * GraphicsFormat.MAPCHIP_HEIGHT;
var width = this.getWindowWidth() - (DefineControl.getWindowXPadding() * 2);
var height = this.getWindowHeight() - (DefineControl.getWindowYPadding() * 2);
var graphicsManager = root.getGraphicsManager();
var alpha = this._getMapAlpha();
if (this._picCache !== null) {
if (this._picCache.isCacheAvailable()) {
this._picCache.setAlpha(alpha);
this._picCache.drawStretchParts(x, y, width, height, 0, 0, cacheWidth, cacheHeight);
return;
}
}
else {
this._picCache = graphicsManager.createCacheGraphics(cacheWidth, cacheHeight);
}
graphicsManager.setRenderCache(this._picCache);
root.drawMapAll(mapData);
graphicsManager.resetRenderCache();
this._picCache.setAlpha(alpha);
this._picCache.drawStretchParts(x, y, width, height, 0, 0, cacheWidth, cacheHeight);
},
_drawSentenceZone: function(x, y) {
var i;
var count = this._groupArray.length;
x = (x + this._width) - ((this.getTitlePartsCount() + 2) * TitleRenderer.getTitlePartsWidth());
y += 5;
for (i = 0; i < count; i++) {
this._groupArray[i].drawQuestSentence(x, y);
y += this._groupArray[i].getQuestSentenceCount() * this.getQuestSentenceSpaceY();
}
},
_drawEmptyMap: function(x, y) {
var textui = root.queryTextUI('default_window');
var color = ColorValue.KEYWORD;
var font = textui.getFont();
var width = this.getWindowWidth() - (DefineControl.getWindowXPadding() * 2);
var height = this.getWindowHeight() - (DefineControl.getWindowYPadding() * 2);
var range = createRangeObject(x, y, width, height);
TextRenderer.drawRangeText(range, TextFormat.CENTER, StringTable.HideData_Unknown, -1, color, font);
},
_drawEmptySentence: function(x, y) {
},
getWindowWidth: function() {
return this._width;
},
getWindowHeight: function() {
return this._height;
},
getWindowTextUI: function() {
return root.queryTextUI('face_window');
},
_getMapAlpha: function() {
return 200;
},
_configureSentence: function(groupArray) {
if (root.getRestPreference().isEnemyTotalEnabled()) {
groupArray.appendObject(QuestSentence.EnemyTotal);
}
if (root.getRestPreference().isEnemyAverageLevelEnabled()) {
groupArray.appendObject(QuestSentence.EnemyAverageLevel);
}
groupArray.appendObject(QuestSentence.Reward);
}
}
);
var BaseQuestSentence = defineObject(BaseObject,
{
_detailWindow: null,
setParentWindow: function(detailWindow) {
this._detailWindow = detailWindow;
},
setCalculatorValue: function(quest) {
},
moveQuestSentence: function() {
return MoveResult.CONTINUE;
},
drawQuestSentence: function(x, y) {
},
getQuestSentenceCount: function() {
return 1;
},
_drawNumberAndText: function(x, y, text, number, colorIndex) {
var textui = this._getSentenceTextUI();
var color = textui.getColor();
var font = textui.getFont();
y += 19;
TextRenderer.drawKeywordText(x + 8, y + 0, text, -1, color, font);
NumberRenderer.drawNumberColor(x + 186, y + 0, number, colorIndex, 255);
},
_drawTitle: function(x, y) {
var textui = this._getSentenceTextUI();
var width = TitleRenderer.getTitlePartsWidth();
var height = TitleRenderer.getTitlePartsHeight();
var pic = textui.getUIImage();
if (pic !== null) {
this._drawTitleInternal(pic, x, y, width, height, this._detailWindow.getTitlePartsCount());
}
},
_drawTitleInternal: function(pic, x, y, width, height, count) {
var i;
if (pic === null) {
return;
}
// 左端の描画
// pic.drawParts(x, y, 0, 0, width, height);
// x += width;
for (i = 0; i < count; i++) {
pic.drawParts(x, y, width, 0, width, height);
x += width;
}
// 右端の描画
pic.drawParts(x, y, width * 2, 0, width, height);
},
_getSentenceTextUI: function() {
return root.queryTextUI('questreward_title');
},
_getNumberColorIndex: function() {
return 3;
}
}
);
var QuestSentence = {};
QuestSentence.EnemyTotal = defineObject(BaseQuestSentence,
{
_value: 0,
setCalculatorValue: function(quest) {
var list = quest.getFreeMap().getListFromUnitGroup(UnitGroup.ENEMY);
this._value = list.getCount();
},
drawQuestSentence: function(x, y) {
this._drawTitle(x, y);
this._drawNumberAndText(x, y, StringTable.Quest_EnemyTotal, this._value, this._getNumberColorInex());
},
_getNumberColorInex: function() {
return 3;
}
}
);
QuestSentence.EnemyAverageLevel = defineObject(BaseQuestSentence,
{
_value: 0,
setCalculatorValue: function(quest) {
var i, unit;
var list = quest.getFreeMap().getListFromUnitGroup(UnitGroup.ENEMY);
var count = list.getCount();
var totalLevel = 0;
for (i = 0; i < count; i++) {
unit = list.getData(i);
totalLevel += unit.getLv();
}
this._value = Math.floor(totalLevel / count);
},
drawQuestSentence: function(x, y) {
this._drawTitle(x, y);
this._drawNumberAndText(x, y, StringTable.Quest_AverageLevel, this._value, this._getNumberColorInex());
},
_getNumberColorInex: function() {
return 3;
}
}
);
var QuestRewardType = {
ITEM: 0,
GOLD: 1,
BONUS: 2,
TEXT: 3
};
QuestSentence.Reward = defineObject(BaseQuestSentence,
{
_arr: null,
setCalculatorValue: function(quest) {
var i, reward;
var list = quest.getRewardList();
var count = list.getCount();
this._arr = [];
for (i = 0; i < count; i++) {
reward = list.getData(i);
if (this._isRewardEnabled(reward)) {
this._arr.push(reward);
}
}
},
drawQuestSentence: function(x, y) {
var i;
var count = this._arr.length;
for (i = 0; i < count; i++) {
this._drawReward(x, y, this._arr[i]);
y += this._detailWindow.getQuestSentenceSpaceY();
}
},
getQuestSentenceCount: function() {
return this._arr.length;
},
_drawReward: function(x, y, reward) {
var type = reward.getType();
if (type === QuestRewardType.ITEM) {
this._drawItem(x, y, reward);
}
else if (type === QuestRewardType.GOLD) {
this._drawGold(x, y, reward);
}
else if (type === QuestRewardType.BONUS) {
this._drawBonus(x, y, reward);
}
else if (type === QuestRewardType.TEXT) {
this._drawText(x, y, reward);
}
},
_drawItem: function(x, y, reward) {
var textui = this._getSentenceTextUI();
var color = textui.getColor();
var font = textui.getFont();
this._drawTitle(x, y);
y += 10;
ItemRenderer.drawItem(x + 8, y + 8, reward.getItem(), color, font, false);
TextRenderer.drawKeywordText(x + 168, y - 3, StringTable.Quest_GetItem, -1, ColorValue.KEYWORD, font);
},
_drawGold: function(x, y, reward) {
this._drawTitle(x, y);
this._drawNumberAndText(x, y, StringTable.Quest_GetGold, reward.getGold(), this._getNumberColorInex());
},
_drawBonus: function(x, y, reward) {
this._drawTitle(x, y);
this._drawNumberAndText(x, y, StringTable.Quest_GetBonus, reward.getBonus(), this._getNumberColorInex());
},
_drawText: function(x, y, reward) {
this._drawTitle(x, y);
this._drawNumberAndText(x, y, reward.getText(), reward.getValue(), reward.getNumberColorIndex());
},
_getNumberColorInex: function() {
return 1;
},
_isRewardEnabled: function(reward) {
// アイテムに変数を指定している場合は、取得できないことがある
if (reward.getType() === QuestRewardType.ITEM && reward.getItem() === null) {
return false;
}
return true;
}
}
);