// ユニットのステートを管理する var StateControl = { // unitが特定のBadStateOptionを含むか調べる isBadStateOption: function(unit, option) { var i, state; var list = unit.getTurnStateList(); var count = list.getCount(); for (i = 0; i < count; i++) { state = list.getData(i).getState(); if (state.getBadStateOption() === option) { return true; } } return false; }, // unitが特定のBadStateFlagを含むか調べる isBadStateFlag: function(unit, flag) { var i, state; var list = unit.getTurnStateList(); var count = list.getCount(); for (i = 0; i < count; i++) { state = list.getData(i).getState(); if (state.getBadStateFlag() & flag) { return true; } } return false; }, // unitが指定されたstateを含むか調べる getTurnState: function(unit, state) { var i, turnState; var list = unit.getTurnStateList(); var count = list.getCount(); for (i = 0; i < count; i++) { turnState = list.getData(i); if (turnState.getState() === state) { return turnState; } } return null; }, // 「自然回復」の値を取得する getHpValue: function(unit) { var i, state; var list = unit.getTurnStateList(); var count = list.getCount(); var recoveryValue = 0; for (i = 0; i < count; i++) { state = list.getData(i).getState(); recoveryValue += state.getAutoRecoveryValue(); } return recoveryValue; }, // ステートを発動できるか計算する checkStateInvocation: function(active, passive, obj) { var stateInvocation = obj.getStateInvocation(); var state = stateInvocation.getState(); if (this.isStateBlocked(passive, active, state)) { // ステートを無効にできた場合はnullを返す return null; } if (Probability.getInvocationProbability(active, stateInvocation.getInvocationType(), stateInvocation.getInvocationValue())) { // ステートを発動できた場合はステートを返す return state; } return null; }, // unitに対してstateを追加、または解除する arrangeState: function(unit, state, increaseType) { var turnState; var list = unit.getTurnStateList(); var count = list.getCount(); var editor = root.getDataEditor(); if (increaseType === IncreaseType.INCREASE) { turnState = this.getTurnState(unit, state); if (turnState !== null) { // 既にステートが追加されている場合は、ターン数値を更新する turnState.setTurn(state.getTurn()); } else { if (count < DataConfig.getMaxStateCount()) { editor.addTurnStateData(list, state); } } } else if (increaseType === IncreaseType.DECREASE) { editor.deleteTurnStateData(list, state); } else if (increaseType === IncreaseType.ALLRELEASE) { editor.deleteAllTurnStateData(list); } }, // 「ターン毎の減少値」を考慮したパラメータ値を取得する getStateParameter: function(unit, index) { var i; var list = unit.getTurnStateList(); var count = list.getCount(); var value = 0; for (i = 0; i < count; i++) { value += ParamGroup.getDopingParameter(list.getData(i), index); } return value; }, // ユニットに設定されているステートのターンを減少させる decreaseTurn: function(list) { var i, j, count, count2, unit, arr, list2, turn, turnState; count = list.getCount(); for (i = 0; i < count; i++) { arr = []; unit = list.getData(i); list2 = unit.getTurnStateList(); count2 = list2.getCount(); for (j = 0; j < count2; j++) { turnState = list2.getData(j); turn = turnState.getTurn(); if (turn <= 0) { continue; } // ターンを1つ減少させ、新たに設定する turn--; turnState.setTurn(turn); if (turn <= 0) { // ステートを後で解除するために配列へ保存する arr.push(turnState.getState()); } } count2 = arr.length; for (j = 0; j < count2; j++) { this.arrangeState(unit, arr[j], IncreaseType.DECREASE); } } }, // unitがstateを受けるのを無効にできるか調べる isStateBlocked: function(unit, targetUnit, state) { var i, count, item, stateGroup; if (state === null) { return false; } if (state.isBadState()) { // ユニットがバッドステートを無効にできるか調べる if (unit.isBadStateGuard()) { return true; } // スキルでバッドステートを無効にできるか調べる if (SkillControl.getBattleSkillFromFlag(unit, targetUnit, SkillType.INVALID, InvalidFlag.BADSTATE) !== null) { return true; } } count = UnitItemControl.getPossessionItemCount(unit); for (i = 0; i < count; i++) { item = UnitItemControl.getItem(unit, i); if (item.isWeapon()) { continue; } // アイテムの耐性ステートを確認する stateGroup = item.getStateGroup(); if (this.isStateGroupEnabled(state, stateGroup)) { return true; } } return false; }, // ユニットに設定されているステートをstateGroupが回復できるか調べる isStateRecoverable: function(unit, stateGroup) { var i, state; var list = unit.getTurnStateList(); var count = list.getCount(); for (i = 0; i < count; i++) { state = list.getData(i).getState(); if (this.isStateGroupEnabled(state, stateGroup)) { return true; } } return false; }, // stateGroupがstateを処理できるか調べる isStateGroupEnabled: function(state, stateGroup) { var i, count, refList; // ステートが「バッドステート」の場合は、「全バッドステート対象」が設定されているか調べる if (state.isBadState() && stateGroup.isAllBadState()) { return true; } else { refList = stateGroup.getStateReferenceList(); count = refList.getTypeCount(); for (i = 0; i < count; i++) { if (state === refList.getTypeData(i)) { return true; } } } return false; } };