update
This commit is contained in:
@@ -126,11 +126,13 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
|
||||
void _addFloatingEffect(EffectEvent event) {
|
||||
if (_processedEffectIds.contains(event.id)) {
|
||||
// print("[UI Debug] Duplicate Event Ignored: ${event.id}");
|
||||
return;
|
||||
}
|
||||
|
||||
_processedEffectIds.add(event.id);
|
||||
if (_processedEffectIds.length > 20) {
|
||||
// Keep the set size manageable
|
||||
if (_processedEffectIds.length > 50) {
|
||||
_processedEffectIds.remove(_processedEffectIds.first);
|
||||
}
|
||||
|
||||
@@ -138,7 +140,9 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
|
||||
// Feedback Text Cooldown
|
||||
if (event.feedbackType != null) {
|
||||
print("[UI Debug] Feedback Event: ${event.id}, Type: ${event.feedbackType}");
|
||||
// print(
|
||||
// "[UI Debug] Feedback Event: ${event.id}, Type: ${event.feedbackType}",
|
||||
// );
|
||||
if (_lastFeedbackTime != null &&
|
||||
DateTime.now().difference(_lastFeedbackTime!).inMilliseconds < 300) {
|
||||
return; // Skip if too soon
|
||||
@@ -194,7 +198,7 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
|
||||
// Prevent duplicate feedback texts for the same event ID (UI Level)
|
||||
if (_floatingFeedbackTexts.any((e) => e.eventId == event.id)) {
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
@@ -208,7 +212,7 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
top: position.dy,
|
||||
child: FloatingFeedbackText(
|
||||
key: ValueKey(id),
|
||||
feedback: "$feedbackText (${event.id.substring(0, 4)})",
|
||||
feedback: feedbackText,
|
||||
color: feedbackColor,
|
||||
onRemove: () {
|
||||
if (mounted) {
|
||||
@@ -259,9 +263,7 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
}
|
||||
|
||||
// 1. Player Attack Animation Trigger (Success or Miss)
|
||||
if (event.type == ActionType.attack &&
|
||||
event.target == EffectTarget.enemy) {
|
||||
|
||||
if (event.type == ActionType.attack && event.target == EffectTarget.enemy) {
|
||||
final RenderBox? playerBox =
|
||||
_playerKey.currentContext?.findRenderObject() as RenderBox?;
|
||||
final RenderBox? enemyBox =
|
||||
@@ -277,11 +279,13 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
});
|
||||
|
||||
// Force SAFE animation for MISS, otherwise use event risk
|
||||
final RiskLevel animRisk = event.feedbackType != null ? RiskLevel.safe : event.risk;
|
||||
final RiskLevel animRisk = event.feedbackType != null
|
||||
? RiskLevel.safe
|
||||
: event.risk;
|
||||
|
||||
_playerAnimKey.currentState
|
||||
?.animateAttack(offset, () {
|
||||
showEffect();
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
|
||||
if (event.risk == RiskLevel.risky && event.feedbackType == null) {
|
||||
@@ -306,11 +310,10 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// 2. Enemy Attack Animation Trigger (Success or Miss)
|
||||
else if (event.type == ActionType.attack &&
|
||||
event.target == EffectTarget.player) {
|
||||
|
||||
bool enableAnim = context.read<SettingsProvider>().enableEnemyAnimations;
|
||||
|
||||
if (!enableAnim) {
|
||||
@@ -334,11 +337,13 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
});
|
||||
|
||||
// Force SAFE animation for MISS
|
||||
final RiskLevel animRisk = event.feedbackType != null ? RiskLevel.safe : event.risk;
|
||||
final RiskLevel animRisk = event.feedbackType != null
|
||||
? RiskLevel.safe
|
||||
: event.risk;
|
||||
|
||||
_enemyAnimKey.currentState
|
||||
?.animateAttack(offset, () {
|
||||
showEffect();
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
|
||||
if (event.risk == RiskLevel.risky && event.feedbackType == null) {
|
||||
@@ -363,36 +368,36 @@ class _BattleScreenState extends State<BattleScreen> {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
// 3. Defend Animation Trigger (Success OR Failure)
|
||||
else if (event.type == ActionType.defend) {
|
||||
if (event.target == EffectTarget.player) {
|
||||
_playerAnimKey.currentState?.animateDefense(() {
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
});
|
||||
} else if (event.target == EffectTarget.enemy) {
|
||||
_enemyAnimKey.currentState?.animateDefense(() {
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
});
|
||||
} else {
|
||||
if (event.target == EffectTarget.player) {
|
||||
_playerAnimKey.currentState?.animateDefense(() {
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
}
|
||||
});
|
||||
} else if (event.target == EffectTarget.enemy) {
|
||||
_enemyAnimKey.currentState?.animateDefense(() {
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
});
|
||||
} else {
|
||||
showEffect();
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
}
|
||||
}
|
||||
// 4. Others (Feedback for attacks, Buffs, etc.)
|
||||
else {
|
||||
showEffect();
|
||||
|
||||
|
||||
// If it's a feedback event (MISS/FAILED for attacks), wait 500ms.
|
||||
if (event.feedbackType != null) {
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
if (mounted) context.read<BattleProvider>().handleImpact(event);
|
||||
});
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
if (mounted) context.read<BattleProvider>().handleImpact(event);
|
||||
});
|
||||
} else {
|
||||
// Success events (Icon)
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
// Success events (Icon)
|
||||
context.read<BattleProvider>().handleImpact(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user