slave-princess-charlotte/data/Script/singleton/singleton-statecontrol.js
2025-10-12 13:17:46 -05:00

232 lines
6.1 KiB
JavaScript

// ユニットのステートを管理する
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;
}
};