var ClassChangeItemSelection = defineObject(BaseItemSelection, { _classChangeSelectManager: null, setInitialSelection: function() { this._classChangeSelectManager = createObject(ClassChangeSelectManager); this._classChangeSelectManager.setClassChangeSelectData(this._unit, this._item); return EnterResult.OK; }, moveItemSelectionCycle: function() { if (this._classChangeSelectManager.moveWindowManager() !== MoveResult.CONTINUE) { this._targetClass = this._classChangeSelectManager.getTargetClass(); if (this._targetClass === null) { this._isSelection = false; } else { this._isSelection = true; } return MoveResult.END; } return MoveResult.CONTINUE; }, drawItemSelectionCycle: function() { this._classChangeSelectManager.drawWindowManager(); } } ); var ClassChangeItemUse = defineObject(BaseItemUse, { _dynamicEvent: null, _itemUseParent: null, enterMainUseCycle: function(itemUseParent) { var generator, result; var itemTargetInfo = itemUseParent.getItemTargetInfo(); this._itemUseParent = itemUseParent; if (!this._isChangeAllowed(itemTargetInfo)) { // アイテムを使用しない場合は、アイテムの使用数を減らせない itemUseParent.disableItemDecrement(); return EnterResult.NOTENTER; } this._dynamicEvent = createObject(DynamicEvent); generator = this._dynamicEvent.acquireEventGenerator(); generator.classChange(itemTargetInfo.targetUnit, itemTargetInfo.targetClass, itemUseParent.isItemSkipMode()); result = this._dynamicEvent.executeDynamicEvent(); if (result === EnterResult.NOTENTER) { this.mainAction(); } return result; }, moveMainUseCycle: function() { var result = this._dynamicEvent.moveDynamicEvent(); if (result === MoveResult.END) { this.mainAction(); } return result; }, mainAction: function() { var itemTargetInfo = this._itemUseParent.getItemTargetInfo(); if (itemTargetInfo.item.getClassChangeInfo().isLevelReset()) { itemTargetInfo.unit.setLv(1); } }, _isChangeAllowed: function(itemTargetInfo) { if (itemTargetInfo.targetClass === null) { return false; } return true; } } ); var ClassChangeItemInfo = defineObject(BaseItemInfo, { _arr: null, setInfoItem: function(item) { var i, count, classGroup, name; var info = item.getClassChangeInfo(); this._arr = []; BaseItemInfo.setInfoItem.call(this, item); if (info.isClassInfoDisplayable()) { // クラスグループは、同名のものが存在することが考えられるため、 // 重複を除いたものを_arrに設定する。 count = info.getClassGroupCount(); for (i = 0; i < count; i++) { classGroup = info.getClassGroupData(i); name = classGroup.getName(); if (this._arr.indexOf(name) !== -1) { continue; } this._arr.push(name); } } }, drawItemInfoCycle: function(x, y) { ItemInfoRenderer.drawKeyword(x, y, this.getItemTypeName(StringTable.ItemInfo_ClassChange)); y += ItemInfoRenderer.getSpaceY(); if (this._arr.length > 0) { this._drawList(x, y); } }, getInfoPartsCount: function() { return 1 + this._arr.length; }, _drawList: function(x, y, list) { var i; var count = this._arr.length; var textui = this.getWindowTextUI(); var color = textui.getColor(); var font = textui.getFont(); ItemInfoRenderer.drawKeyword(x, y, StringTable.ClassChangeInfo_Target); x += ItemInfoRenderer.getSpaceX(); for (i = 0 ; i < count; i++) { TextRenderer.drawKeywordText(x, y, this._arr[i], -1, color, font); y += ItemInfoRenderer.getSpaceY(); } } } ); var ClassChangeItemAvailability = defineObject(BaseItemAvailability, { } ); var ClassChangeItemAI = defineObject(BaseItemAI, { } ); var ClassChangeSelectMode = { MSG: 0, SCREEN: 1 }; var ClassChangeSelectManager = defineObject(BaseWindowManager, { _unit: null, _targetClass: null, _infoWindow: null, setClassChangeSelectData: function(unit, item) { var group, screenParam; this._unit = unit; this._targetClass = null; this._infoWindow = createWindowObject(InfoWindow, this); // 内部でmode変更が起こる group = this._checkGroup(unit, item); if (group === null) { return; } screenParam = this._createScreenParam(); this._classChangeScreen = createObject(MultiClassChangeScreen); SceneManager.addScreen(this._classChangeScreen, screenParam); this.changeCycleMode(ClassChangeSelectMode.SCREEN); }, moveWindowManager: function() { var mode = this.getCycleMode(); var result = MoveResult.CONTINUE; if (mode === ClassChangeSelectMode.MSG) { result = this._moveMsg(); } else if (mode === ClassChangeSelectMode.SCREEN) { result = this._moveScreen(); } return result; }, drawWindowManager: function() { var mode = this.getCycleMode(); if (mode === ClassChangeSelectMode.MSG) { this._drawMsg(); } }, getTargetClass: function() { return this._targetClass; }, _moveMsg: function() { var result = this._infoWindow.moveWindow(); if (result === MoveResult.END) { this._playCancelSound(); } return result; }, _moveScreen: function() { if (SceneManager.isScreenClosed(this._classChangeScreen)) { this._targetClass = this._classChangeScreen.getScreenResult(); return MoveResult.END; } return MoveResult.CONTINUE; }, _drawMsg: function() { var x = LayoutControl.getCenterX(-1, this._infoWindow.getWindowWidth()); var y = LayoutControl.getCenterY(-1, this._infoWindow.getWindowHeight()); this._infoWindow.drawWindow(x, y); }, _checkGroup: function(unit, item) { var i, count, classGroupId, classUpCount, classUpMaxCount; var group = null; var info = item.getClassChangeInfo(); if (DataConfig.isBattleSetupClassChangeAllowed()) { // SceneType.BATTLESETUPでのクラスチェンジが可能な場合は、クラスグループ2を使用 classGroupId = unit.getClassGroupId2(); classUpMaxCount = 1; } else { if (this._unit.getClassUpCount() === 0) { // 一度もクラスチェンジしていない場合は、クラスグループ1を使用 classGroupId = this._unit.getClassGroupId1(); } else { // クラスチェンジしたことがある場合は、クラスグループ2を使用 classGroupId = this._unit.getClassGroupId2(); } classUpMaxCount = 2; } // idが-1の場合、このユニットはCCできないことを意味する if (classGroupId === -1) { this._infoWindow.setInfoMessage(StringTable.ClassChange_UnableClassChange); this.changeCycleMode(ClassChangeSelectMode.MSG); return null; } // ユニットのgroupIdが含まれているかどうかを調べる count = info.getClassGroupCount(); for (i = 0; i < count; i++) { group = info.getClassGroupData(i); if (group.getId() === classGroupId) { break; } } // groupIdが含まれていなかったということは、unitはitemでCCできないことを意味する if (i === count) { this._infoWindow.setInfoMessage(StringTable.ClassChange_UnableClassChangeItem); this.changeCycleMode(ClassChangeSelectMode.MSG); return null; } classUpCount = unit.getClassUpCount(); if (classUpCount >= classUpMaxCount) { // 既にクラスチェンジしているため、これ以上のクラスチェンジはできない this._infoWindow.setInfoMessage(StringTable.ClassChange_UnableClassChangeMore); this.changeCycleMode(ClassChangeSelectMode.MSG); return null; } return group; }, _playCancelSound: function() { MediaControl.soundDirect('commandcancel'); }, _createScreenParam: function() { var screenParam = ScreenBuilder.buildMultiClassChange(); screenParam.unit = this._unit; screenParam.isMapCall = true; return screenParam; } } );