var UnitMenuMode = { TOP: 0, HELP: 1 }; var UnitMenuEnum = { ALIVE: 0, SORTIE: 1 }; var UnitMenuScreen = defineObject(BaseScreen, { _unit: null, _unitEnumMode: 0, _unitList: null, _activePageIndex: 0, _topWindow: null, _bottomWindowArray: null, _unitSentenceWindow: null, _pageChanger: null, _dataChanger: null, setScreenData: function(screenParam) { this._prepareScreenMemberData(screenParam); this._completeScreenMemberData(screenParam); }, moveScreenCycle: function() { var mode = this.getCycleMode(); var result = MoveResult.CONTINUE; this._moveAnimation(); if (mode === UnitMenuMode.TOP) { result = this._moveTopMode(); } else if (mode === UnitMenuMode.HELP) { result = this._moveHelpMode(); } return result; }, drawScreenCycle: function() { var x, y; var index = this._activePageIndex; var width = this._topWindow.getWindowWidth(); var topHeight = this._topWindow.getWindowHeight(); var bottomHeight = this._bottomWindowArray[index].getWindowHeight(); var interval = DefineControl.getWindowInterval(); if (this._isUnitSentenceVisible()) { x = LayoutControl.getCenterX(-1, width + this._unitSentenceWindow.getWindowWidth()); } else { x = LayoutControl.getCenterX(-1, width); } y = LayoutControl.getCenterY(-1, topHeight + bottomHeight + interval); this._topWindow.drawWindow(x, y); if (this._isUnitSentenceVisible()) { this._unitSentenceWindow.drawWindow(x + width, y); } this._bottomWindowArray[index].drawWindow(x, y + topHeight + interval); // drawWindowの後のthis._pageChanger.drawPageは、 // スクロールカーソルがアイテムウインドウの上に表示されてしまう。 // 予めsetDrawingMethodを呼び出すことで、drawWindowContentの前にカーソルが描画されるようにする。 }, drawScreenBottomText: function(textui) { var text; var index = this._activePageIndex; if (this._topWindow.isTracingHelp()) { text = this._topWindow.getHelpText(); } else if (this._bottomWindowArray[index].isHelpMode() || this._bottomWindowArray[index].isTracingHelp()) { text = this._bottomWindowArray[index].getHelpText(); } else { text = this._unit.getDescription(); } TextRenderer.drawScreenBottomText(text, textui); }, getScreenInteropData: function() { return root.queryScreen('UnitMenu'); }, getCurrentTarget: function() { return this._unit; }, getPageChanger: function() { return this._pageChanger; }, _prepareScreenMemberData: function(screenParam) { this._unit = screenParam.unit; this._unitEnumMode = screenParam.enummode; this._unitList = this._getUnitList(this._unit); this._activePageIndex = 0; this._topWindow = createObject(UnitMenuTopWindow); if (this._isUnitSentenceVisible()) { this._unitSentenceWindow = createObject(UnitSentenceWindow); } this._bottomWindowArray = []; this._pageChanger = createObject(HorizontalPageChanger); this._dataChanger = createObject(VerticalDataChanger); }, _completeScreenMemberData: function(screenParam) { this._configureBottomWindows(this._bottomWindowArray); this._setMenuData(); this._setNewTarget(this._unit); this._playMenuOpenSound(); this._pageChanger.setPageData(this._bottomWindowArray.length, this._bottomWindowArray[0].getWindowWidth(), this._bottomWindowArray[0].getWindowHeight()); this.changeCycleMode(UnitMenuMode.TOP); }, _setMenuData: function() { var i, count; var method = function(x, y) { SceneManager.getLastScreen().getPageChanger().drawPage(x, y); }; this._topWindow.setUnitMenuData(); count = this._bottomWindowArray.length; for (i = 0; i < count; i++) { this._bottomWindowArray[i].setDrawingMethod(method); this._bottomWindowArray[i].setUnitMenuData(); } }, _setNewTarget: function(unit) { var i, count; this._unit = unit; if (this._isUnitSentenceVisible()) { this._unitSentenceWindow.setUnitData(unit); } // unitは上下のウインドウも必要になる this._topWindow.changeUnitMenuTarget(unit); count = this._bottomWindowArray.length; for (i = 0; i < count; i++) { this._bottomWindowArray[i].changeUnitMenuTarget(unit); } }, _moveTopMode: function() { var index; var result = MoveResult.CONTINUE; this._pageChanger.movePage(); if (this._pageChanger.checkPage()) { this._activePageIndex = this._pageChanger.getPageIndex(); return result; } // 上下のキーが押された場合は_changeTargetでユニットが切り替わる if (InputControl.isSelectAction()) { result = this._selectAction(); } else if (InputControl.isCancelAction()) { result = this._cancelAction(); } else if (InputControl.isOptionAction()) { result = this._optionAction(); } else { index = this._dataChanger.checkDataIndex(this._unitList, this._unit); if (index !== -1) { this._setNewTarget(this._unitList.getData(index)); } } return result; }, _moveHelpMode: function() { if (!this._bottomWindowArray[this._activePageIndex].isHelpMode()) { this.changeCycleMode(UnitMenuMode.TOP); } return MoveResult.CONTINUE; }, _moveAnimation: function() { this._topWindow.moveWindow(); this._bottomWindowArray[this._activePageIndex].moveWindow(); if (this._isUnitSentenceVisible()) { this._unitSentenceWindow.moveWindow(); } return MoveResult.CONTINUE; }, _selectAction: function() { return this._optionAction(); }, _cancelAction: function() { this._playMenuCancelSound(); return MoveResult.END; }, _optionAction: function() { var result = this._bottomWindowArray[this._activePageIndex].setHelpMode(); if (result) { this.changeCycleMode(UnitMenuMode.HELP); } return MoveResult.CONTINUE; }, _getUnitList: function(unit) { var list = []; var type = unit.getUnitType(); if (type === UnitType.PLAYER) { if (this._unitEnumMode === UnitMenuEnum.ALIVE) { if (unit.isGuest()) { // 開かれているユニットがゲストの場合は、ゲストユニットに切り替えるようにする list = root.getCurrentSession().getGuestList(); } else { list = PlayerList.getAliveDefaultList(); } } else if (this._unitEnumMode === UnitMenuEnum.SORTIE) { // 出撃が完了している場合は、PlayerListにゲストユニットも含まれる list = PlayerList.getSortieDefaultList(); } } else if (type === UnitType.ENEMY) { list = EnemyList.getAliveDefaultList(); } else if (type === UnitType.ALLY) { list = AllyList.getAliveDefaultList(); } return list; }, _isUnitSentenceVisible: function() { return true; }, _playMenuOpenSound: function() { MediaControl.soundDirect('commandopen'); }, _playMenuCancelSound: function() { MediaControl.soundDirect('commandcancel'); }, _configureBottomWindows: function(groupArray) { groupArray.appendWindowObject(UnitMenuBottomWindow, this); } } ); var UnitMenuTopWindow = defineObject(BaseWindow, { _unit: null, setUnitMenuData: function() { }, changeUnitMenuTarget: function(unit) { this._unit = unit; }, moveWindowContent: function() { return MoveResult.CONTINUE; }, drawWindowContent: function(x, y) { this._drawUnitFace(x, y); this._drawUnitName(x, y); this._drawUnitClass(x, y); this._drawUnitLevel(x, y); this._drawUnitHp(x, y); this._drawFusionIcon(x, y); }, getWindowWidth: function() { return DefineControl.getUnitMenuWindowWidth(); }, getWindowHeight: function() { return DefineControl.getFaceWindowHeight(); }, getWindowXPadding: function() { return DefineControl.getFaceXPadding(); }, getWindowYPadding: function() { return DefineControl.getFaceYPadding(); }, getWindowTextUI: function() { return root.queryTextUI('face_window'); }, getWindowUI: function() { return root.queryTextUI('face_window').getUIImage(); }, isTracingHelp: function() { var range = createRangeObject(this.xRendering + 120, this.yRendering + 50, 170, 32); return MouseControl.isHovering(range) && this._unit.getClass().getDescription() !== ''; }, getHelpText: function() { var text = ''; if (this.isTracingHelp()) { text = this._unit.getClass().getDescription(); } return text; }, _drawUnitFace: function(xBase, yBase) { var alpha = 255; if (this._unit.getHp() === 0) { // 蘇生時に実行される alpha = 128; } ContentRenderer.drawUnitFace(xBase, yBase, this._unit, false, alpha); }, _drawUnitName: function(xBase, yBase) { var textui = this.getWindowTextUI(); var color = textui.getColor(); var font = textui.getFont(); var length = this._getUnitTextLength(); var x = xBase + 130; var y = yBase + 15; TextRenderer.drawText(x, y, this._unit.getName(), length, color, font); }, _drawUnitClass: function(xBase, yBase) { var textui = this.getWindowTextUI(); var color = textui.getColor(); var font = textui.getFont(); var length = this._getClassTextLength(); var x = xBase + 120; var y = yBase + 50; var cls = this._unit.getClass(); UnitRenderer.drawDefaultUnit(this._unit, x, y, null); TextRenderer.drawText(x + 45, y + 13, cls.getName(), length, color, font); }, _drawUnitLevel: function(xBase, yBase) { var x = xBase + 303; var y = yBase + 10; ContentRenderer.drawLevelInfo(x, y, this._unit); }, _drawUnitHp: function(xBase, yBase) { var x = xBase + 303; var y = yBase + 50; var pic = root.queryUI('unit_gauge'); ContentRenderer.drawUnitHpZone(x, y, this._unit, pic); }, _drawFusionIcon: function(xBase, yBase) { var handle; var x = xBase + 102; var y = yBase + 11; if (FusionControl.getFusionParent(this._unit) === null) { return; } handle = FusionControl.getFusionData(this._unit).getIconResourceHandle(); if (handle.isNullHandle()) { return; } GraphicsRenderer.drawImage(x, y, handle, GraphicsType.ICON); }, _getUnitTextLength: function() { return 180; }, _getClassTextLength: function() { return 145; } } ); var BaseMenuBottomWindow = defineObject(BaseWindow, { setUnitMenuData: function() { }, changeUnitMenuTarget: function(unit) { }, moveWindowContent: function() { return MoveResult.END; }, drawWindowContent: function(x, y) { }, getWindowWidth: function() { return DefineControl.getUnitMenuWindowWidth(); }, getWindowHeight: function() { return DefineControl.getUnitMenuBottomWindowHeight(); }, setHelpMode: function() { return false; }, isHelpMode: function() { return false; }, isTracingHelp: function() { return false; }, getHelpText: function() { return ''; } } ); var UnitMenuHelp = { ITEM: 0, SKILL: 1 }; var UnitMenuBottomWindow = defineObject(BaseMenuBottomWindow, { _statusScrollbar: null, _unit: null, _unitMenuHelp: 0, _isTracingLocked: false, _skillInteraction: null, _itemInteraction: null, setUnitMenuData: function() { this._skillInteraction = createObject(SkillInteraction); this._itemInteraction = createObject(ItemInteraction); this._statusScrollbar = createScrollbarObject(UnitStatusScrollbar, this); }, changeUnitMenuTarget: function(unit) { this._unit = unit; this._unitMenuHelp = 0; this._itemInteraction.setData(unit); this._itemInteraction.setWindowTextUI(this.getWindowTextUI()); this._setSkillData(unit); this._statusScrollbar.setStatusFromUnit(unit); this._skillInteraction.checkInitialTopic(); this._itemInteraction.checkInitialTopic(); }, moveWindowContent: function() { var recentlyInput; this._itemInteraction.moveInteraction(); this._skillInteraction.moveInteraction(); if (!this.isHelpMode()) { return MoveResult.CONTINUE; } if (this._unitMenuHelp === UnitMenuHelp.ITEM) { recentlyInput = this._itemInteraction.getInteractionScrollbar().getRecentlyInputType(); if (this._skillInteraction.isHelpAvailable() && (recentlyInput === InputType.LEFT || recentlyInput === InputType.RIGHT)) { this._itemInteraction.cancelInteraction(); this._unitMenuHelp = UnitMenuHelp.SKILL; this._skillInteraction.setHelpMode(); } } else if (this._unitMenuHelp === UnitMenuHelp.SKILL) { recentlyInput = this._skillInteraction.getInteractionScrollbar().getRecentlyInputType(); if (this._itemInteraction.isHelpAvailable() && (recentlyInput === InputType.UP || recentlyInput === InputType.DOWN)) { this._skillInteraction.cancelInteraction(); this._unitMenuHelp = UnitMenuHelp.ITEM; this._itemInteraction.setHelpMode(); } } return MoveResult.CONTINUE; }, drawWindowContent: function(x, y) { this._drawParamArea(x, y); this._drawItemArea(x, y); this._drawWeaponTypeArea(x, y); this._drawSkillArea(x, y); this._drawInfoWindow(x, y); }, isHelpMode: function() { return this._itemInteraction.isHelpMode() || this._skillInteraction.isHelpMode(); }, isTracingHelp: function() { return this._itemInteraction.isTracingHelp() || this._skillInteraction.isTracingHelp(); }, setHelpMode: function() { if (this._itemInteraction.setHelpMode()) { this._unitMenuHelp = UnitMenuHelp.ITEM; return true; } if (this._skillInteraction.setHelpMode()) { this._unitMenuHelp = UnitMenuHelp.SKILL; return true; } return false; }, getHelpText: function() { var text = ''; var help = this._getActiveUnitMenuHelp(); if (help === UnitMenuHelp.ITEM) { text = this._itemInteraction.getHelpText(); } else if (help === UnitMenuHelp.SKILL) { text = this._skillInteraction.getHelpText(); } return text; }, lockTracing: function(isLocked) { this._isTracingLocked = isLocked; }, // 後のバージョンで削除 _setStatusArea: function(unit) { var statusEntry = this._createStatusEntry(unit); this._statusScrollbar.setStatusFromParam(statusEntry.typeArray, statusEntry.paramArray, 2, 4); }, // 後のバージョンで削除 _createStatusEntry: function(unit) { var i; var count = ParamGroup.getParameterCount(); var statusEntry = StructureBuilder.buildStatusEntry(); statusEntry.typeArray = []; statusEntry.paramArray = []; // HPを入れないために1から開始する for (i = 1; i < count; i++) { statusEntry.typeArray.push(ParamGroup.getParameterName(i)); // ボーナスも加算する statusEntry.paramArray.push(ParamGroup.getLastValue(unit, i)); } return statusEntry; }, _setSkillData: function(unit) { var i; var weapon = ItemControl.getEquippedWeapon(unit); var arr = SkillControl.getSkillMixArray(unit, weapon, -1, ''); var count = arr.length; var newSkillArray = []; for (i = 0; i < count; i++) { if (!arr[i].skill.isHidden()) { newSkillArray.push(arr[i]); } } this._skillInteraction.setSkillArray(newSkillArray); }, _drawItemArea: function(xBase, yBase) { this._itemInteraction.getInteractionScrollbar().drawScrollbar(xBase, yBase); }, _drawParamArea: function(xBase, yBase) { var dx = 15; this._statusScrollbar.drawScrollbar(xBase + ItemRenderer.getItemWidth() + dx, yBase); }, _drawWeaponTypeArea: function(xBase, yBase) { var dy = this._itemInteraction.getInteractionScrollbar().getScrollbarHeight() + 14; WeaponTypeRenderer.drawClassWeaponList(xBase, yBase + dy, this._unit.getClass()); }, _drawSkillArea: function(xBase, yBase) { var dy = this._itemInteraction.getInteractionScrollbar().getScrollbarHeight() + 14; var width = 230; this._skillInteraction.getInteractionScrollbar().drawScrollbar(xBase + width, yBase + dy); }, _drawInfoWindow: function(xBase, yBase) { var x, help; if (this._isTracingLocked) { return; } help = this._getActiveUnitMenuHelp(); if (help === UnitMenuHelp.SKILL) { this._skillInteraction.getInteractionWindow().drawWindow(xBase, yBase); } else if (help === UnitMenuHelp.ITEM) { x = xBase + ItemRenderer.getItemWidth(); if (x + this._itemInteraction.getInteractionWindow().getWindowWidth() > root.getGameAreaWidth()) { x -= x + this._itemInteraction.getInteractionWindow().getWindowWidth() - root.getGameAreaWidth(); x -= 8; } this._itemInteraction.getInteractionWindow().drawWindow(x, yBase); } }, _getActiveUnitMenuHelp: function() { var help = -1; if (this._itemInteraction.isTracingHelp()) { help = UnitMenuHelp.ITEM; } else if (this._skillInteraction.isTracingHelp()) { help = UnitMenuHelp.SKILL; } else if (this._itemInteraction.isHelpMode()) { help = UnitMenuHelp.ITEM; } else if (this._skillInteraction.isHelpMode()) { help = UnitMenuHelp.SKILL; } return help; } } ); var IconItemScrollbar = defineObject(BaseScrollbar, { drawScrollContent: function(x, y, object, isSelect, index) { var handle = object.skill.getIconResourceHandle(); GraphicsRenderer.drawImage(x, y, handle, GraphicsType.ICON); }, drawDescriptionLine: function(x, y) { }, playSelectSound: function() { }, getObjectWidth: function() { return 30; }, getObjectHeight: function() { return GraphicsFormat.ICON_HEIGHT; } } ); var BaseInteraction = defineObject(BaseObject, { _isHelpMode: false, _scrollbar: null, _window: null, moveInteraction: function() { var input, index; if (this._isHelpMode) { input = this._scrollbar.moveInput(); if (input === ScrollbarInput.CANCEL) { this.cancelInteraction(); } else { this._changeTopic(); } } else { index = this._getTracingIndex(); if (index !== -1) { this._scrollbar.setIndex(index); this._changeTopic(); } } return MoveResult.CONTINUE; }, checkInitialTopic: function() { var index = MouseControl.getIndexFromMouse(this._scrollbar); if (index !== -1) { this._scrollbar.setIndex(index); this._changeTopic(); } }, cancelInteraction: function() { this._isHelpMode = false; this._scrollbar.setActive(false); }, isInteraction: function() { return this.isHelpMode() || this.isTracingHelp(); }, isHelpMode: function() { return this._isHelpMode; }, isTracingHelp: function() { return MouseControl.getIndexFromMouse(this._scrollbar) !== -1; }, isHelpAvailable: function() { return this._scrollbar.getObjectCount() > 0; }, setHelpMode: function() { if (!this.isHelpAvailable()) { return false; } this._isHelpMode = true; this._scrollbar.setActive(true); this._playHelpSelectSound(); return true; }, getHelpText: function() { var item = this._scrollbar.getObject(); return item.getDescription(); }, getInteractionScrollbar: function() { return this._scrollbar; }, getInteractionWindow: function() { return this._window; }, _changeTopic: function() { }, _getTracingIndex: function() { return MouseControl.pointMouse(this._scrollbar); }, _playHelpSelectSound: function() { MediaControl.soundDirect('commandselect'); } } ); var ItemInteraction = defineObject(BaseInteraction, { _textui: null, initialize: function() { this._scrollbar = createScrollbarObject(ItemDropListScrollbar, this); this._scrollbar.setScrollFormation(1, DefineControl.getVisibleUnitItemCount()); this._window = createWindowObject(ItemInfoWindow, this); }, setData: function(unit) { this._scrollbar.setUnitItemFormation(unit); this._scrollbar.resetDropMark(); }, getWindowTextUI: function() { return this._textui; }, setWindowTextUI: function(textui) { this._textui = textui; }, _changeTopic: function() { var item = this._scrollbar.getObject(); this._window.setInfoItem(item); } } ); var SkillInteraction = defineObject(BaseInteraction, { initialize: function() { this._scrollbar = createScrollbarObject(IconItemScrollbar, this); this._scrollbar.setScrollFormation(7, 1); this._window = createWindowObject(SkillInfoWindow, this); }, setSkillArray: function(arr) { this._scrollbar.setObjectArray(arr); }, getHelpText: function() { var skillEntry = this._scrollbar.getObject(); return skillEntry.skill.getDescription(); }, _changeTopic: function() { var skillEntry = this._scrollbar.getObject(); this._window.setSkillInfoData(skillEntry.skill, skillEntry.objecttype); } } ); var SkillInteractionLong = defineObject(SkillInteraction, { initialize: function() { this._scrollbar = createScrollbarObject(IconItemScrollbar, this); this._scrollbar.setScrollFormation(7, 1); this._window = createWindowObject(SkillInfoWindowLong, this); } } );