This commit is contained in:
2025-12-08 18:57:17 +09:00
parent eab99eee6f
commit f49902c067
6 changed files with 223 additions and 254 deletions
+37 -32
View File
@@ -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);
}
}
}