var ShopLayoutMode = { MESSAGE: 1, BUYSELLSELECT: 2, BUY: 3, BUYQUESTION: 4, SELL: 5, SELLQUESTION: 6, GOLDCHANGE: 7, VISITORSELECT: 8 }; var ShopLayoutResult = { ACTION: 0, NOACTION: 1 }; var ShopLayoutScreen = defineObject(BaseScreen, { _targetUnit: null, _shopLayout: null, _screenIneropData: null, _isSale: false, _nextmode: 0, _itemSale: null, _shopItemArray: null, _buyItemWindow: null, _sellItemWindow: null, _buySellWindow: null, _buyQuestionWindow: null, _sellQuestionWindow: null, _visitorSelectWindow: null, _currencyWindow: null, _keeperWindow: null, _itemInfoWindow: null, _shopMessageTable: null, _activeSelectWindow: null, _activeItemWindow: null, setScreenData: function(screenParam) { this._prepareScreenMemberData(screenParam); this._completeScreenMemberData(screenParam); }, moveScreenCycle: function() { var mode = this.getCycleMode(); var result = MoveResult.CONTINUE; if (mode === ShopLayoutMode.BUYSELLSELECT) { result = this._moveBuySellSelect(); } else if (mode === ShopLayoutMode.MESSAGE) { result = this._moveMessage(); } else if (mode === ShopLayoutMode.BUY) { result = this._moveBuy(); } else if (mode === ShopLayoutMode.BUYQUESTION) { result = this._moveBuyQuestion(); } else if (mode === ShopLayoutMode.SELL) { result = this._moveSell(); } else if (mode === ShopLayoutMode.SELLQUESTION) { result = this._moveSellQuestion(); } else if (mode === ShopLayoutMode.VISITORSELECT) { result = this._moveVisitorSelect(); } this._moveAnimation(); return result; }, drawScreenCycle: function() { var width = this._getTopWindowWidth(); var height = this._getTopWindowHeight(); var xBase = LayoutControl.getCenterX(-1, width); var yBase = LayoutControl.getCenterY(-1, height); // 上部 this._keeperWindow.drawWindow(xBase, yBase); this._activeSelectWindow.drawWindow(xBase + this._keeperWindow.getWindowWidth(), yBase); this._currencyWindow.drawWindow(xBase + this._keeperWindow.getWindowWidth(), yBase + this._activeSelectWindow.getWindowHeight()); if (this.getCycleMode() === ShopLayoutMode.VISITORSELECT) { this._visitorSelectWindow.drawWindow(xBase + this._keeperWindow.getWindowWidth(), yBase + this._activeSelectWindow.getWindowHeight()); } // 下部 yBase += this._keeperWindow.getWindowHeight(); this._activeItemWindow.drawWindow(xBase, yBase); width = this._activeItemWindow.getWindowWidth(); this._itemInfoWindow.drawWindow(xBase + width, yBase); }, drawScreenBottomText: function(textui) { var item = this._itemInfoWindow.getInfoItem(); if (item !== null) { TextRenderer.drawScreenBottomText(item.getDescription(), textui); } else { TextRenderer.drawScreenBottomText('', textui); } }, getScreenInteropData: function() { return this._screenIneropData; }, setScreenInteropData: function(screenIneropData) { this._screenIneropData = screenIneropData; }, getScreenResult: function() { return this._isSale ? ShopLayoutResult.ACTION : ShopLayoutResult.NOACTION; }, getDiscountFactor: function() { var factor = 100; var skill; if (this._targetUnit !== null) { // 店の訪問者が「値引き」のスキルを持っているかを調べる skill = SkillControl.getBestPossessionSkill(this._targetUnit, SkillType.DISCOUNT); if (skill !== null) { factor = 100 - skill.getSkillValue(); } } return factor / 100; }, getVisitor: function() { return this._targetUnit; }, getStockVisitor: function() { if (this._targetUnit === null) { return null; } if (this._visitorSelectWindow === null) { return this._targetUnit; } return this._visitorSelectWindow.getSelectIndex() === 0 ? this._targetUnit : null; }, getGold: function() { return root.getMetaSession().getGold(); }, setGold: function(gold) { root.getMetaSession().setGold(gold); }, getGoldFromItem: function(item) { return item.getGold(); }, getShopItemArray: function() { return this._shopItemArray; }, getShopLayout: function() { return this._shopLayout; }, getSelectItem: function() { return this._activeItemWindow.getShopSelectItem(); }, notifyInfoItem: function(item) { this._itemInfoWindow.setInfoItem(item); }, _prepareScreenMemberData: function(screenParam) { // unitがnullの場合、売買ではストックアイテムが対象になる。 // たとえば、購入時にはストックアイテムにアイテムが追加される。 // 一方、unitがnullでない場合は、何らかのユニットが店を訪問したということで、ユニットアイテムが対象になる。 // つまり、ユニットのアイテム欄にアイテムが追加される。 this._targetUnit = screenParam.unit; this._shopLayout = screenParam.shopLayout; // 一度でも購入か売却を行うとtrue this._isSale = false; this._nextmode = 0; this._itemSale = createObject(ItemSale); this._itemSale.setParentShopScreen(this); this._shopItemArray = screenParam.itemArray; this._buyItemWindow = createWindowObject(BuyItemWindow, this); this._sellItemWindow = createWindowObject(SellItemWindow, this); this._buySellWindow = createWindowObject(BuySellWindow, this); this._buyQuestionWindow = createWindowObject(BuyQuestionWindow, this); this._sellQuestionWindow = createWindowObject(SellQuestionWindow, this); this._visitorSelectWindow = createWindowObject(VisitorSelectWindow, this); this._currencyWindow = createWindowObject(ShopCurrencyWindow, this); this._keeperWindow = createWindowObject(ShopMessageWindow, this); this._itemInfoWindow = createWindowObject(ItemInfoWindow, this); this._activeSelectWindow = this._buySellWindow; this._activeItemWindow = this._buyItemWindow; this._createShopMessageTable(this._shopLayout); }, _completeScreenMemberData: function(screenParam) { this._buyItemWindow.setShopWindowData(); this._sellItemWindow.setShopWindowData(); this._buySellWindow.setShopWindowData(); this._buyQuestionWindow.setShopWindowData(); this._sellQuestionWindow.setShopWindowData(); this._visitorSelectWindow.setShopWindowData(); this._currencyWindow.setShopWindowData(this.getGold()); this._keeperWindow.createShopAnalyzer(); this._startMessage(this._shopMessageTable.FirstMessage, ShopLayoutMode.BUYSELLSELECT); }, _createShopMessageTable: function(shopLayout) { this._shopMessageTable = {}; this._shopMessageTable.FirstMessage = shopLayout.getMessage(0); this._shopMessageTable.QuestionBuy = shopLayout.getMessage(1); this._shopMessageTable.QuestionSell = shopLayout.getMessage(2); this._shopMessageTable.SelectQuestion = shopLayout.getMessage(3); this._shopMessageTable.OtherMessage = shopLayout.getMessage(4); this._shopMessageTable.EndBuy = shopLayout.getMessage(5); this._shopMessageTable.EndSell = shopLayout.getMessage(6); this._shopMessageTable.NoGold = shopLayout.getMessage(7); this._shopMessageTable.ItemFull = shopLayout.getMessage(8); this._shopMessageTable.ForceStock = shopLayout.getMessage(9); this._shopMessageTable.NoSell = shopLayout.getMessage(10); this._shopMessageTable.NoItemBring = shopLayout.getMessage(11); }, _moveTop: function() { this._startMessage(this._shopMessageTable.FirstMessage, ShopLayoutMode.BUYSELLSELECT); return MoveResult.CONTINUE; }, isStockDefault: function() { return root.getCurrentScene() === SceneType.BATTLESETUP || Miscellaneous.isStockAccess(this._targetUnit); }, _isStockSelectable: function() { if (this._targetUnit === null) { return false; } return this.isStockDefault(); }, _moveBuySellSelect: function() { var result = this._buySellWindow.moveWindow(); if (result === BuySellSelectResult.BUY) { this._startMessage(this._shopMessageTable.QuestionBuy, ShopLayoutMode.BUY); } else if (result === BuySellSelectResult.SELL) { if (this._isStockSelectable()) { // ユニットまたはストックの選択に進む this._processMode(ShopLayoutMode.VISITORSELECT); } else { if (this._buySellWindow.isPossessionItem()) { this._startMessage(this._shopMessageTable.QuestionSell, ShopLayoutMode.SELL); } else { this._startMessage(this._shopMessageTable.NoItemBring, ShopLayoutMode.BUYSELLSELECT); } } } else if (result === BuySellSelectResult.CANCEL) { return MoveResult.END; } return MoveResult.CONTINUE; }, _moveMessage: function() { if (this._keeperWindow.moveWindow() !== MoveResult.CONTINUE) { this._processMode(this._nextmode); } return MoveResult.CONTINUE; }, _moveBuy: function() { var input = this._buyItemWindow.moveWindow(); if (input === ScrollbarInput.SELECT) { this._startMessage(this._shopMessageTable.SelectQuestion, ShopLayoutMode.BUYQUESTION); } else if (input === ScrollbarInput.CANCEL) { this._startMessage(this._shopMessageTable.OtherMessage, ShopLayoutMode.BUYSELLSELECT); } return MoveResult.CONTINUE; }, _moveBuyQuestion: function() { var result = this._buyQuestionWindow.moveWindow(); if (result === BuyQuestionResult.BUY) { // 「買う」が選択されたため、実際に購入する this._startSale(true, false); this._startMessage(this._shopMessageTable.EndBuy, ShopLayoutMode.BUY); } else if (result === BuyQuestionResult.CANCEL) { this._startMessage(this._shopMessageTable.QuestionBuy, ShopLayoutMode.BUY); } else if (result === BuyQuestionResult.NOGOLD) { this._startMessage(this._shopMessageTable.NoGold, ShopLayoutMode.BUY); } else if (result === BuyQuestionResult.ITEMFULL) { this._startMessage(this._shopMessageTable.ItemFull, ShopLayoutMode.BUY); } else if (result === BuyQuestionResult.FORCESTOCK) { this._startSale(true, true); this._startMessage(this._shopMessageTable.ForceStock, ShopLayoutMode.BUY); } return MoveResult.CONTINUE; }, _moveSell: function() { var input = this._sellItemWindow.moveWindow(); if (input === ScrollbarInput.SELECT) { this._startMessage(this._shopMessageTable.SelectQuestion, ShopLayoutMode.SELLQUESTION); } else if (input === ScrollbarInput.CANCEL) { this._startMessage(this._shopMessageTable.OtherMessage, ShopLayoutMode.BUYSELLSELECT); } return MoveResult.CONTINUE; }, _moveSellQuestion: function() { var result = this._sellQuestionWindow.moveWindow(); if (result === SellQuestionResult.SELL) { // 「売る」が選択されたため、実際に売却する this._startSale(false); if (this._buySellWindow.isPossessionItem()) { this._startMessage(this._shopMessageTable.EndSell, ShopLayoutMode.SELL); } else { // 売るものがなくなったらトップに戻る this._startMessage(this._shopMessageTable.OtherMessage, ShopLayoutMode.BUYSELLSELECT); } } else if (result === SellQuestionResult.CANCEL) { this._startMessage(this._shopMessageTable.QuestionSell, ShopLayoutMode.SELL); } else if (result === SellQuestionResult.NOSELL) { this._startMessage(this._shopMessageTable.NoSell, ShopLayoutMode.SELL); } return MoveResult.CONTINUE; }, _moveVisitorSelect: function() { var result = this._visitorSelectWindow.moveWindow(); if (result === VisitorSelectResult.UNIT) { this._sellItemWindow.updateItemArea(); this._startMessage(this._shopMessageTable.QuestionSell, ShopLayoutMode.SELL); } else if (result === VisitorSelectResult.STOCK) { this._sellItemWindow.updateItemArea(); this._startMessage(this._shopMessageTable.QuestionSell, ShopLayoutMode.SELL); } else if (result === VisitorSelectResult.CANCEL) { this._processMode(ShopLayoutMode.BUYSELLSELECT); } return MoveResult.CONTINUE; }, _moveAnimation: function() { this._currencyWindow.moveWindow(); return MoveResult.CONTINUE; }, _startSale: function(isBuy, isForceStock) { var price = this._itemSale.startSale(isBuy, isForceStock, this._activeItemWindow.getShopSelectItem()); // ゴールドを表示するウインドウの内容を変更する this._currencyWindow.startPriceCount(price); this._isSale = true; // 買ったときはアイテムを増やし、売ったときはアイテムを減らすから常に呼び出す this._sellItemWindow.updateItemArea(); this._playSaleSound(); }, _playSaleSound: function() { MediaControl.soundDirect('itemsale'); }, _getTopWindowWidth: function() { return this._activeItemWindow.getWindowWidth() + this._itemInfoWindow.getWindowWidth(); }, _getTopWindowHeight: function() { return this._keeperWindow.getWindowHeight() + this._activeItemWindow.getWindowHeight(); }, _startMessage: function(text, mode) { this._keeperWindow.setShopMessage(text); this.changeCycleMode(ShopLayoutMode.MESSAGE); this._nextmode = mode; }, _processMode: function(mode) { if (mode === ShopLayoutMode.SELLQUESTION) { this._activeSelectWindow = this._sellQuestionWindow; this._activeSelectWindow.resetShopIndex(); this._activeSelectWindow.setShopActive(true); this._activeItemWindow = this._sellItemWindow; this._activeItemWindow.setShopActive(false); } else if (mode === ShopLayoutMode.BUYQUESTION) { this._activeSelectWindow = this._buyQuestionWindow; this._activeSelectWindow.resetShopIndex(); this._activeSelectWindow.setShopActive(true); this._activeItemWindow = this._buyItemWindow; this._activeItemWindow.setShopActive(false); } else if (mode === ShopLayoutMode.BUYSELLSELECT) { this._activeSelectWindow = this._buySellWindow; this._activeSelectWindow.setShopActive(true); this._itemInfoWindow.setInfoItem(null); this._activeItemWindow.hideShopCursor(); } else if (mode === ShopLayoutMode.BUY) { this._activeSelectWindow = this._buySellWindow; this._activeSelectWindow.setShopActive(false); this._activeItemWindow = this._buyItemWindow; this._activeItemWindow.setShopActive(true); } else if (mode === ShopLayoutMode.SELL) { this._activeSelectWindow = this._buySellWindow; this._activeSelectWindow.setShopActive(false); this._activeItemWindow = this._sellItemWindow; this._activeItemWindow.setShopActive(true); } else if (mode === ShopLayoutMode.VISITORSELECT) { this._activeSelectWindow.setShopActive(false); this._visitorSelectWindow.setShopActive(true); } this._nextmode = 0; this.changeCycleMode(mode); } } ); var ItemSale = defineObject(BaseObject, { _parentShopScreen: null, startSale: function(isBuy, isForceStock, item) { var price = this._getPrice(isBuy, item); if (isBuy) { this._pushBuyItem(item, isForceStock); } else { this._cutSellItem(item); } this._setPrice(price); return price; }, setParentShopScreen: function(parentShopScreen) { this._parentShopScreen = parentShopScreen; }, _pushBuyItem: function(item, isForceStock) { var unit = this._parentShopScreen.getVisitor(); var newItem = root.duplicateItem(item); if (isForceStock || unit === null) { StockItemControl.pushStockItem(newItem); } else { UnitItemControl.pushItem(unit, newItem); } }, _cutSellItem: function(item) { var i, count; var unit = this._parentShopScreen.getStockVisitor(); if (unit !== null) { count = DataConfig.getMaxUnitItemCount(); for (i = 0; i < count; i++) { if (UnitItemControl.getItem(unit, i) === item) { UnitItemControl.cutItem(unit, i); break; } } } else { count = StockItemControl.getStockItemCount(); for (i = 0; i < count; i++) { if (StockItemControl.getStockItem(i) === item) { StockItemControl.cutStockItem(i); break; } } } }, _getPrice: function(isBuy, item) { var price; if (isBuy) { price = this._parentShopScreen.getGoldFromItem(item); price = Math.floor(price * this._parentShopScreen.getDiscountFactor()); price *= -1; } else { price = Calculator.calculateSellPrice(item); } return price; }, _setPrice: function(price) { this._parentShopScreen.setGold(this._parentShopScreen.getGold() + price); } } ); var ShopMessageWindow = defineObject(BaseWindow, { _message: null, createShopAnalyzer: function() { var messageAnalyzerParam = this._createMessageAnalyzerParam(); this._messageAnalyzer = createObject(MessageAnalyzer); this._messageAnalyzer.setMessageAnalyzerParam(messageAnalyzerParam); }, setShopMessage: function(text) { if (text === '') { text = ' '; } // 通常、this._messageAnalyzer.moveMessageは、決定を押すまで制御を返さないが、 // atをつけることでそれを防いでいる。 this._messageAnalyzer.setMessageAnalyzerText('\\at[1]' + text); }, moveWindowContent: function() { if (this._messageAnalyzer.moveMessageAnalyzer() !== MoveResult.CONTINUE) { return MoveResult.END; } return MoveResult.CONTINUE; }, drawWindowContent: function(x, y) { this._drawKeeperFace(x, y); // 店主のメッセージが複数ページにまたがると、違和感が生じるため、 // setMessageAnalyzerTextにそうした文字列が指定されるべきではない。 // 複数ページは好ましくないということで、カーソルに関する引数は指定しない。 this._messageAnalyzer.drawMessageAnalyzer(x + GraphicsFormat.FACE_WIDTH + 10, y + 10, -1, -1, null); }, getWindowWidth: function() { return 415; }, 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(); }, _drawKeeperFace: function(x, y) { var handle = this.getParentInstance().getShopLayout().getFaceResourceHandle(); ContentRenderer.drawFaceFromResourceHandle(x, y, handle); }, _createMessageAnalyzerParam: function() { var textui = this.getWindowTextUI(); var messageAnalyzerParam = StructureBuilder.buildMessageAnalyzerParam(); messageAnalyzerParam.color = textui.getColor(); messageAnalyzerParam.font = textui.getFont(); messageAnalyzerParam.messageSpeedType = SpeedType.DIRECT; return messageAnalyzerParam; } } ); var ShopCurrencyWindowMode = { TOP: 0, WAIT: 1 }; var ShopCurrencyWindow = defineObject(BaseWindow, { _counter: null, _balancer: null, setShopWindowData: function(price) { this._counter = createObject(CycleCounter); this._counter.setCounterInfo(30); this._balancer = createObject(SimpleBalancer); this._balancer.setBalancerInfo(price, this.getMaxPrice()); this.changeCycleMode(ShopCurrencyWindowMode.NONE); }, moveWindowContent: function() { var mode = this.getCycleMode(); var result = MoveResult.CONTINUE; if (mode === ShopCurrencyWindowMode.TOP) { result = this._moveTop(); } else if (mode === ShopCurrencyWindowMode.WAIT) { result = this._moveWait(); } return result; }, drawWindowContent: function(x, y) { var textui = this.getWindowTextUI(); var color = textui.getColor(); var font = textui.getFont(); var price = this._balancer.getCurrentValue(); var text = this.getCurrencySign(); TextRenderer.drawKeywordText(x, y, text, -1, color, font); NumberRenderer.drawNumber(x + 90, y, price); }, getWindowWidth: function() { return 136; }, getWindowHeight: function() { return 52; }, startPriceCount: function(price) { this._balancer.startBalancerMove(price); this.changeCycleMode(ShopCurrencyWindowMode.TOP); }, getMaxPrice: function() { return DataConfig.getMaxGold(); }, getCurrencySign: function() { return StringTable.CurrencySign_Gold; }, _moveTop: function() { if (this._balancer.moveBalancer() !== MoveResult.CONTINUE) { this.changeCycleMode(ShopCurrencyWindowMode.WAIT); } return MoveResult.CONTINUE; }, _moveWait: function() { if (this._counter.moveCycleCounter() !== MoveResult.CONTINUE) { return MoveResult.END; } return MoveResult.CONTINUE; } } ); var VisitorSelectResult = { UNIT: 0, STOCK: 1, CANCEL: 2, NONE: 3 }; var VisitorSelectWindow = defineObject(BaseWindow, { _scrollbar: null, setShopWindowData: function() { this._createScrollbar(); }, moveWindowContent: function() { var index; var input = this._scrollbar.moveInput(); var result = VisitorSelectResult.NONE; if (input === ScrollbarInput.SELECT) { index = this._scrollbar.getIndex(); if (this._scrollbar.isSellTarget(index)) { if (index === 0) { result = VisitorSelectResult.UNIT; } else { result = VisitorSelectResult.STOCK; } } else { this._playOperationBlockSound(); } } else if (input === ScrollbarInput.CANCEL) { result = VisitorSelectResult.CANCEL; } return result; }, 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); }, getSelectIndex: function() { if (this._scrollbar === null) { return 0; } return this._scrollbar.getIndex(); }, setShopActive: function(isActive) { this._scrollbar.enableSelectCursor(isActive); }, getSelectTextArray: function() { return [StringTable.ShopLayout_Unit, StringTable.ShopLayout_Stock]; }, _createScrollbar: function() { var textArray; this._scrollbar = createScrollbarObject(VisitorSelectScrollbar, this); this._scrollbar.setActive(true); textArray = this.getSelectTextArray(); this._scrollbar.setScrollFormation(1, textArray.length); this._scrollbar.setObjectArray(textArray); }, _playOperationBlockSound: function() { MediaControl.soundDirect('operationblock'); } } ); var VisitorSelectScrollbar = defineObject(BaseScrollbar, { drawScrollContent: function(x, y, object, isSelect, index) { var length = this._getTextLength(); var textui = this.getParentTextUI(); var color = textui.getColor(); var font = textui.getFont(); if (!this.isSellTarget(index)) { color = ColorValue.DISABLE; } TextRenderer.drawText(x, y, object, length, color, font); }, getObjectWidth: function() { return 105; }, getObjectHeight: function() { return DefineControl.getTextPartsHeight(); }, isSellTarget: function(index) { var unit, result; if (index === 0) { unit = this.getParentInstance().getParentInstance().getVisitor(); result = UnitItemControl.getPossessionItemCount(unit) > 0; } else { result = StockItemControl.getStockItemCount() > 0; } return result; }, _getTextLength: function() { return this.getObjectWidth(); } } ); // はい、いいえなどの選択肢のためのウインドウ。 // これは、BuySellWindow、BuyQuestionWindow、SellQuestionWindowが継承する。 var ShopSelectWindow = defineObject(BaseWindow, { _scrollbar: null, setShopWindowData: function() { this._createScrollbar(); }, 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); }, resetShopIndex: function() { this._scrollbar.setIndex(0); }, setShopActive: function(isActive) { this._scrollbar.enableSelectCursor(isActive); }, getSelectTextArray: function() { return null; }, _createScrollbar: function() { var textArray; this._scrollbar = createScrollbarObject(ShopSelectScrollbar, this); this._scrollbar.setActive(true); textArray = this.getSelectTextArray(); this._scrollbar.setScrollFormation(textArray.length, 1); this._scrollbar.setObjectArray(textArray); } } ); var ShopSelectScrollbar = defineObject(BaseScrollbar, { drawScrollContent: function(x, y, object, isSelect, index) { var length = this._getTextLength(); var textui = this.getParentTextUI(); var color = textui.getColor(); var font = textui.getFont(); TextRenderer.drawText(x, y, object, length, color, font); }, getObjectWidth: function() { return 53; }, getObjectHeight: function() { return DefineControl.getTextPartsHeight() - 10; }, _getTextLength: function() { return this.getObjectWidth(); } } ); var BuySellSelectResult = { BUY: 0, SELL: 1, CANCEL: 2, NONE: 3 }; var BuySellWindow = defineObject(ShopSelectWindow, { moveWindowContent: function() { var input = this._scrollbar.moveInput(); var result = BuySellSelectResult.NONE; if (input === ScrollbarInput.SELECT) { if (this._scrollbar.getIndex() === 0) { result = BuySellSelectResult.BUY; } else { result = BuySellSelectResult.SELL; } } else if (input === ScrollbarInput.CANCEL) { result = BuySellSelectResult.CANCEL; } else { result = BuySellSelectResult.NONE; } return result; }, getSelectTextArray: function() { return [StringTable.ShopLayout_SelectBuy, StringTable.ShopLayout_SelectSell]; }, isPossessionItem: function() { var unit = this.getParentInstance().getStockVisitor(); if (unit !== null) { return UnitItemControl.getPossessionItemCount(unit) > 0; } else { return StockItemControl.getStockItemCount() > 0; } } } ); var BuyQuestionResult = { BUY: 0, CANCEL: 1, NOGOLD: 2, ITEMFULL: 3, FORCESTOCK: 4, NONE: 5 }; var BuyQuestionWindow = defineObject(ShopSelectWindow, { moveWindowContent: function() { var input = this._scrollbar.moveInput(); var result = BuyQuestionResult.NONE; if (input === ScrollbarInput.SELECT) { if (this._scrollbar.getIndex() === 0) { if (!this._isPriceOk()) { // 購入しようとしたが、ゴールドが足りなかった result = BuyQuestionResult.NOGOLD; } else if (!this._isSpaceOk()) { if (!this._isForceStockOk()) { // 購入しようとしたが、アイテム欄が一杯だった result = BuyQuestionResult.ITEMFULL; } else { // アイテム欄が一杯だが、ストックに送ることで購入する result = BuyQuestionResult.FORCESTOCK; } } else { result = BuyQuestionResult.BUY; } } else { result = BuyQuestionResult.CANCEL; } } else if (input === ScrollbarInput.CANCEL) { result = BuyQuestionResult.CANCEL; } return result; }, getSelectTextArray: function() { return [StringTable.QuestionWindow_DefaultCase1, StringTable.QuestionWindow_DefaultCase2]; }, _isPriceOk: function() { var gold = this.getParentInstance().getGold(); var itemGold = this.getParentInstance().getGoldFromItem(this.getParentInstance().getSelectItem()); itemGold = Math.floor(itemGold * this.getParentInstance().getDiscountFactor()); return gold >= itemGold; }, _isSpaceOk: function() { var result; var unit = this.getParentInstance().getVisitor(); if (unit !== null) { result = this._isUnitSpaceOk(unit); } else { result = this._isStockSpaceOk(); } return result; }, _isUnitSpaceOk: function(unit) { return UnitItemControl.isUnitItemSpace(unit); }, _isStockSpaceOk: function() { return StockItemControl.isStockItemSpace(); }, _isForceStockOk: function() { var unit = this.getParentInstance().getVisitor(); if (unit !== null) { if (!Miscellaneous.isStockAccess(unit) && root.getCurrentScene() === SceneType.FREE) { // クラスオプションとしてストックを持っておらず、 // さらにシーンがSceneType.FREEである場合は、 // アイテムをストックに送れるかどうかがisFullItemTransportableで決定する。 if (!DataConfig.isFullItemTransportable()) { return false; } } } return this._isStockSpaceOk(); } } ); var SellQuestionResult = { SELL: 0, CANCEL: 1, NOSELL: 2, NONE: 3 }; var SellQuestionWindow = defineObject(ShopSelectWindow, { moveWindowContent: function() { var input = this._scrollbar.moveInput(); var result = BuyQuestionResult.NONE; if (input === ScrollbarInput.SELECT) { if (this._scrollbar.getIndex() === 0) { if (this._isSellOk()) { result = SellQuestionResult.SELL; } else { result = SellQuestionResult.NOSELL; } } else { result = SellQuestionResult.CANCEL; } } else if (input === ScrollbarInput.CANCEL) { result = BuyQuestionResult.CANCEL; } return result; }, getSelectTextArray: function() { return [StringTable.QuestionWindow_DefaultCase1, StringTable.QuestionWindow_DefaultCase2]; }, _isSellOk: function() { var item = this.getParentInstance().getSelectItem(); // 重要アイテムでなければ売れる return !item.isImportance(); } } ); // ShopItemWindowは下側に存在するウインドウ。 // これは、BuyItemWindowをSellItemWindowが継承する。 var ShopItemWindow = defineObject(BaseWindow, { _scrollbar: null, setShopWindowData: function() { var count = 6; if (root.getGameAreaHeight() >= 600) { count = 7; } this._scrollbar = createScrollbarObject(this.getScrollbarObject(), this); this._scrollbar.setScrollFormation(1, count); this._scrollbar.enablePageChange(); this.updateItemArea(); }, moveWindowContent: function() { var input = this._scrollbar.moveInput(); if (this._scrollbar.checkAndUpdateIndex()) { this.getParentInstance().notifyInfoItem(this._scrollbar.getObject()); } return input; }, drawWindowContent: function(x, y) { // 情報ウインドウにスクロールカーソルがかぶらないように、後で描画 this._scrollbar.drawScrollbar(x, y); }, getWindowWidth: function() { return 300; }, getWindowHeight: function() { return this._scrollbar.getScrollbarHeight() + (this.getWindowYPadding() * 2); }, getDiscountFactor: function() { return this.getParentInstance().getDiscountFactor(); }, getShopSelectItem: function() { return this._scrollbar.getObject(); }, setShopActive: function(isActive) { this._scrollbar.enableSelectCursor(isActive); }, hideShopCursor: function() { this._scrollbar.setForceSelect(-1); this._scrollbar.setActive(false); }, getScrollbarObject: function() { return null; }, updateItemArea: function() { } } ); var BuyItemWindow = defineObject(ShopItemWindow, { getScrollbarObject: function() { return BuyScrollbar; }, updateItemArea: function() { var itemArray = this.getParentInstance().getShopItemArray(); this._scrollbar.setObjectArray(itemArray); this._scrollbar.resetAvailableData(); } } ); var SellItemWindow = defineObject(ShopItemWindow, { _unit: null, getScrollbarObject: function() { return SellScrollbar; }, updateItemArea: function() { var i, item, count; var unit = this.getParentInstance().getStockVisitor(); if (this._unit === unit) { this._scrollbar.saveScroll(); } this._scrollbar.resetScrollData(); if (unit !== null) { count = DataConfig.getMaxUnitItemCount(); for (i = 0; i < count; i++) { item = UnitItemControl.getItem(unit, i); if (item !== null) { this._scrollbar.objectSet(item); } } } else { count = StockItemControl.getStockItemCount(); for (i = 0; i < count; i++) { item = StockItemControl.getStockItem(i); if (item !== null) { this._scrollbar.objectSet(item); } } } this._scrollbar.objectSetEnd(); this._scrollbar.resetAvailableData(); // 売却先を変更していなければ、前回のスクロール位置を維持する if (this._unit === unit) { this._scrollbar.restoreScroll(); } this._unit = unit; } } ); var BuyScrollbar = defineObject(BaseScrollbar, { _availableArray: null, drawScrollContent: function(x, y, object, isSelect, index) { var price; var textui = this.getParentTextUI(); var color = textui.getColor(); var font = textui.getFont(); var item = object; if (!this._availableArray[index]) { // 条件を満たしていないアイテムを薄暗くする color = ColorValue.DISABLE; } price = this._getPrice(item); ItemRenderer.drawItemGold(x, y, object, color, font, price); }, resetAvailableData: function() { var i, item; var length = this._objectArray.length; this._availableArray = []; for (i = 0; i < length; i++) { item = this._objectArray[i]; if (item !== null) { this._availableArray.push(this._isItemBuyable(item)); } } }, getObjectWidth: function() { return ItemRenderer.getItemGoldWidth(); }, getObjectHeight: function() { return ItemRenderer.getItemHeight(); }, _isItemBuyable: function(item) { var result; var unit = this.getParentInstance().getParentInstance().getVisitor(); if (unit === null) { return true; } if (item.isWeapon()) { result = ItemControl.isWeaponAvailable(unit, item); } else { result = ItemControl.isItemUsable(unit, item); } return result; }, _getPrice: function(item) { var price = this.getParentInstance().getParentInstance().getGoldFromItem(item); return Math.floor(price * this.getParentInstance().getDiscountFactor()); } } ); var SellScrollbar = defineObject(BaseScrollbar, { drawScrollContent: function(x, y, object, isSelect, index) { var textui = this.getParentTextUI(); var color = textui.getColor(); var font = textui.getFont(); var item = object; var gold = Calculator.calculateSellPrice(item); ItemRenderer.drawItemGold(x, y, object, color, font, gold); }, resetAvailableData: function() { }, getObjectWidth: function() { return ItemRenderer.getItemGoldWidth(); }, getObjectHeight: function() { return ItemRenderer.getItemHeight(); } } ); //------------------------------------------------------------------ var BonusLayoutScreen = defineObject(ShopLayoutScreen, { _bonusArray: null, _prepareScreenMemberData: function(screenParam) { this._targetUnit = screenParam.unit; this._shopLayout = screenParam.shopLayout; this._isSale = false; this._nextmode = 0; this._itemSale = createObject(ItemSale); this._itemSale.setParentShopScreen(this); this._shopItemArray = screenParam.itemArray; this._buyItemWindow = createWindowObject(BuyItemWindow, this); this._buyQuestionWindow = createWindowObject(BuyQuestionWindow, this); this._currencyWindow = createWindowObject(BonusCurrencyWindow, this); this._keeperWindow = createWindowObject(ShopMessageWindow, this); this._itemInfoWindow = createWindowObject(ItemInfoWindow, this); this._sellItemWindow = createWindowObject(SellItemWindow, this); this._buySellWindow = createWindowObject(BuySellWindow, this); this._sellQuestionWindow = createWindowObject(SellQuestionWindow, this); this._activeSelectWindow = this._buySellWindow; this._activeItemWindow = this._buyItemWindow; this._bonusArray = screenParam.bonusArray; this._createShopMessageTable(this._shopLayout); }, _completeScreenMemberData: function(screenParam) { this._buyItemWindow.setShopWindowData(); this._sellItemWindow.setShopWindowData(); this._buySellWindow.setShopWindowData(); this._buyQuestionWindow.setShopWindowData(); this._sellQuestionWindow.setShopWindowData(); this._currencyWindow.setShopWindowData(this.getGold()); // 買う/売るのウインドウは表示しない this._buySellWindow.enableWindow(false); this._keeperWindow.createShopAnalyzer(); this._startMessage(this._shopMessageTable.FirstMessage, ShopLayoutMode.BUY); this._buyItemWindow.setShopActive(true); this._itemInfoWindow.setInfoItem(this._buyItemWindow.getShopSelectItem()); }, _moveBuy: function() { var input = this._buyItemWindow.moveWindow(); if (input === ScrollbarInput.SELECT) { this._startMessage(this._shopMessageTable.SelectQuestion, ShopLayoutMode.BUYQUESTION); } else if (input === ScrollbarInput.CANCEL) { return MoveResult.END; } return MoveResult.CONTINUE; }, getDiscountFactor: function() { return 1; }, getGold: function() { return root.getMetaSession().getBonus(); }, setGold: function(gold) { root.getMetaSession().setBonus(gold); }, getGoldFromItem: function(item) { var i; var count = this._shopItemArray.length; for (i = 0; i < count; i++) { if (ItemControl.compareItem(this._shopItemArray[i], item)) { return this._bonusArray[i]; } } return 0; } } ); var BonusCurrencyWindow = defineObject(ShopCurrencyWindow, { getMaxPrice: function() { return DataConfig.getMaxBonus(); }, getCurrencySign: function() { return StringTable.CurrencySign_Bonus; } } ); //------------------------------------------------------------------ var PointLayoutScreen = defineObject(BonusLayoutScreen, { _point: 0, _prepareScreenMemberData: function(screenParam) { BonusLayoutScreen._prepareScreenMemberData.call(this, screenParam); this._currencyWindow = createWindowObject(PointCurrencyWindow, this); this._point = root.getExternalData().getGameClearPoint(); }, getGold: function() { return this._point; }, setGold: function(gold) { this._point = gold; } } ); var PointCurrencyWindow = defineObject(ShopCurrencyWindow, { getMaxPrice: function() { return DataConfig.getMaxBonus(); }, getCurrencySign: function() { return StringTable.CurrencySign_Point; } } );