update
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user