This commit is contained in:
2025-12-04 01:21:37 +09:00
parent a29dc50c4c
commit 0a7c50e6c9
10 changed files with 300 additions and 38 deletions
+43 -15
View File
@@ -235,13 +235,14 @@ class BattleProvider with ChangeNotifier {
return;
// Update Enemy Status Effects at the start of Player's turn (user request)
enemy.updateStatusEffects();
// 1. Check for Defense Forbidden status
if (type == ActionType.defend &&
player.hasStatus(StatusEffectType.defenseForbidden)) {
_addLog("Cannot defend! You are under Defense Forbidden status.");
notifyListeners(); // 상태 변경을 알림
_endPlayerTurn();
return;
}
@@ -283,10 +284,9 @@ class BattleProvider with ChangeNotifier {
_effectEventController.sink.add(
EffectEvent(
type: ActionType.attack,
risk: risk,
target: EffectTarget.enemy,
feedbackType: null, // 공격 성공이므로 feedbackType 없음
),
);
@@ -313,27 +313,43 @@ class BattleProvider with ChangeNotifier {
}
// Try applying status effects from items
_tryApplyStatusEffects(player, enemy);
} else {
_effectEventController.sink.add(
EffectEvent(
type: ActionType.defend,
risk: risk,
target: EffectTarget.player,
feedbackType: null, // 방어 성공이므로 feedbackType 없음
),
);
int armorGained = (player.totalDefense * efficiency).toInt();
player.armor += armorGained;
_addLog("Player gained $armorGained armor.");
}
} else {
_addLog("Player's action missed!");
if (type == ActionType.attack) {
_addLog("Player's attack missed!");
_effectEventController.sink.add(
EffectEvent(
type: type,
risk: risk,
target: EffectTarget.enemy, // 공격 실패는 적 위치에 MISS
feedbackType: BattleFeedbackType.miss,
),
);
} else {
_addLog("Player's defense failed!");
_effectEventController.sink.add(
EffectEvent(
type: type,
risk: risk,
target: EffectTarget.player, // 방어 실패는 내 위치에 FAILED
feedbackType: BattleFeedbackType.failed,
),
);
}
}
if (enemy.isDead) {
@@ -394,6 +410,7 @@ class BattleProvider with ChangeNotifier {
type: ActionType.attack,
risk: intent.risk,
target: EffectTarget.player,
feedbackType: null, // 공격 성공이므로 feedbackType 없음
),
);
@@ -421,6 +438,14 @@ class BattleProvider with ChangeNotifier {
}
} else {
_addLog("Enemy's ${intent.risk.name} attack missed!");
_effectEventController.sink.add(
EffectEvent(
type: ActionType.attack, // 적의 공격이므로 ActionType.attack
risk: intent.risk,
target: EffectTarget.player, // 플레이어가 회피했으므로 플레이어 위치에 이펙트
feedbackType: BattleFeedbackType.miss, // 변경: MISS 피드백
),
);
}
}
} else if (!canAct) {
@@ -636,6 +661,10 @@ class BattleProvider with ChangeNotifier {
// Decide Action Type
// If baseDefense is 0, CANNOT defend.
bool canDefend = enemy.baseDefense > 0;
// Check for DefenseForbidden status
if (enemy.hasStatus(StatusEffectType.defenseForbidden)) {
canDefend = false;
}
bool isAttack = true;
if (canDefend) {
@@ -662,9 +691,8 @@ class BattleProvider with ChangeNotifier {
if (isAttack) {
// Attack Intent
// Variance: +/- 20%
double variance = 0.8 + random.nextDouble() * 0.4;
int damage = (enemy.totalAtk * efficiency * variance).toInt();
// Variance removed as per request
int damage = (enemy.totalAtk * efficiency).toInt();
if (damage < 1) damage = 1;
// Calculate success immediately
@@ -692,9 +720,8 @@ class BattleProvider with ChangeNotifier {
} else {
// Defend Intent
int baseDef = enemy.totalDefense;
// Variance
double variance = 0.8 + random.nextDouble() * 0.4;
int armor = (baseDef * 2 * efficiency * variance).toInt();
// Variance removed
int armor = (baseDef * 2 * efficiency).toInt();
// Calculate success immediately
bool success = false;
@@ -728,6 +755,7 @@ class BattleProvider with ChangeNotifier {
type: ActionType.defend,
risk: risk,
target: EffectTarget.enemy,
feedbackType: null, // 방어 성공이므로 feedbackType 없음
),
);
} else {