This commit is contained in:
2025-12-09 01:04:14 +09:00
parent f49902c067
commit d544f46766
8 changed files with 302 additions and 208 deletions
+33 -115
View File
@@ -126,53 +126,6 @@ class BattleProvider with ChangeNotifier {
// Give test gold
player.gold = GameConfig.startingGold;
// Provide starter equipment
// final starterSword = Item(
// id: "starter_sword",
// name: "Wooden Sword",
// description: "A basic sword",
// atkBonus: 5,
// hpBonus: 0,
// slot: EquipmentSlot.weapon,
// );
// final starterArmor = Item(
// id: "starter_armor",
// name: "Leather Armor",
// description: "Basic protection",
// atkBonus: 0,
// hpBonus: 20,
// slot: EquipmentSlot.armor,
// );
// final starterShield = Item(
// id: "starter_shield",
// name: "Wooden Shield",
// description: "A small shield",
// atkBonus: 0,
// hpBonus: 0,
// armorBonus: 3,
// slot: EquipmentSlot.shield,
// );
// final starterRing = Item(
// id: "starter_ring",
// name: "Copper Ring",
// description: "A simple ring",
// atkBonus: 1,
// hpBonus: 5,
// slot: EquipmentSlot.accessory,
// );
// player.addToInventory(starterSword);
// player.equip(starterSword);
// player.addToInventory(starterArmor);
// player.equip(starterArmor);
// player.addToInventory(starterShield);
// player.equip(starterShield);
// player.addToInventory(starterRing);
// player.equip(starterRing);
// Add new status effect items for testing
player.addToInventory(ItemTable.weapons[3].createItem()); // Stunning Hammer
player.addToInventory(ItemTable.weapons[4].createItem()); // Jagged Dagger
@@ -250,11 +203,6 @@ class BattleProvider with ChangeNotifier {
notifyListeners();
}
// Shop-related methods are now handled by ShopProvider
// Replaces _spawnEnemy
// void _spawnEnemy() { ... } - Removed
Future<void> _onDefeat() async {
_addLog("Player defeated! Enemy wins!");
await SaveManager.clearSaveData();
@@ -304,6 +252,7 @@ class BattleProvider with ChangeNotifier {
: player.totalDefense;
final result = CombatCalculator.calculateActionOutcome(
actionType: type, // Pass player's action type
risk: risk,
luck: player.totalLuck,
baseValue: baseValue,
@@ -436,6 +385,9 @@ class BattleProvider with ChangeNotifier {
);
} else {
_addLog("${enemy.name} tried to defend but failed.");
// Optional: Emit failed defense visual?
// For now, let's keep it simple as log only for failure, or add visual later.
}
intent.isApplied = true; // Mark as applied so we don't do it again
}
@@ -593,7 +545,7 @@ class BattleProvider with ChangeNotifier {
Future<void> _processMiddleTurn() async {
// Phase 3 Middle Turn - Reduced functionality as Defense is now Phase 1.
int tid = _turnTransactionId;
await Future.delayed(const Duration(milliseconds: 200)); // Short pause
// await Future.delayed(const Duration(milliseconds: 200)); // Removed for faster turn transition
if (tid != _turnTransactionId) return;
_startPlayerTurn();
@@ -770,16 +722,13 @@ class BattleProvider with ChangeNotifier {
final random = Random();
// 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) {
// 70% Attack, 30% Defend
isAttack = random.nextDouble() < BattleConfig.enemyAttackChance;
} else {
isAttack = true;
@@ -787,78 +736,40 @@ class BattleProvider with ChangeNotifier {
// Decide Risk Level
RiskLevel risk = RiskLevel.values[random.nextInt(RiskLevel.values.length)];
double efficiency = 1.0;
switch (risk) {
case RiskLevel.safe:
efficiency = BattleConfig.safeEfficiency;
break;
case RiskLevel.normal:
efficiency = BattleConfig.normalEfficiency;
break;
case RiskLevel.risky:
efficiency = BattleConfig.riskyEfficiency;
break;
}
CombatResult result;
if (isAttack) {
// Attack Intent
// Variance removed as per request
int damage = (enemy.totalAtk * efficiency).toInt();
if (damage < 1) damage = 1;
// Calculate success immediately
bool success = false;
switch (risk) {
case RiskLevel.safe:
success = random.nextDouble() < BattleConfig.safeBaseChance;
break;
case RiskLevel.normal:
success = random.nextDouble() < BattleConfig.normalBaseChance;
break;
case RiskLevel.risky:
success = random.nextDouble() < BattleConfig.riskyBaseChance;
break;
}
result = CombatCalculator.calculateActionOutcome(
actionType: ActionType.attack,
risk: risk,
luck: enemy.totalLuck,
baseValue: enemy.totalAtk,
);
currentEnemyIntent = EnemyIntent(
type: EnemyActionType.attack,
value: damage,
value: result.value, // Damage value from CombatCalculator
risk: risk,
description: "Attacks for $damage (${risk.name})",
isSuccess: success,
finalValue: damage,
description: "${result.value} (${risk.name})",
isSuccess: result.success,
finalValue: result.value,
);
} else {
// Defend Intent
int baseDef = enemy.totalDefense;
// Variance removed
int armor = (baseDef * efficiency).toInt();
// Calculate success immediately
bool success = false;
switch (risk) {
case RiskLevel.safe:
success = random.nextDouble() < BattleConfig.safeBaseChance;
break;
case RiskLevel.normal:
success = random.nextDouble() < BattleConfig.normalBaseChance;
break;
case RiskLevel.risky:
success = random.nextDouble() < BattleConfig.riskyBaseChance;
break;
}
result = CombatCalculator.calculateActionOutcome(
actionType: ActionType.defend,
risk: risk,
luck: enemy.totalLuck,
baseValue: enemy.totalDefense,
);
currentEnemyIntent = EnemyIntent(
type: EnemyActionType.defend,
value: armor,
value: result.value, // Armor value from CombatCalculator
risk: risk,
description: "Defends for $armor (${risk.name})",
isSuccess: success,
finalValue: armor,
description: "${result.value} (${risk.name})",
isSuccess: result.success,
finalValue: result.value,
);
// Note: Armor is NO LONGER applied here instantly.
// It is applied in _applyEnemyIntentEffects() which is called before Player turn.
}
notifyListeners();
}
@@ -872,6 +783,13 @@ class BattleProvider with ChangeNotifier {
// New public method to be called by UI at impact moment
void handleImpact(EffectEvent event) {
if (event.isVisualOnly) {
// Logic Skipped. Just log if needed, but usually logging is done at event creation.
// We do NOT process damage or armor here.
notifyListeners();
return;
}
if ((event.isSuccess == false || event.feedbackType != null) &&
event.type != ActionType.defend) {
// If it's a miss/fail/feedback, just log and return