diff --git a/src/ui/flutter_app/lib/appearance_settings/models/display_settings.dart b/src/ui/flutter_app/lib/appearance_settings/models/display_settings.dart index 894cd7d05..018790b71 100644 --- a/src/ui/flutter_app/lib/appearance_settings/models/display_settings.dart +++ b/src/ui/flutter_app/lib/appearance_settings/models/display_settings.dart @@ -73,6 +73,8 @@ class DisplaySettings { this.markedPieceImagePath = '', this.boardImagePath = '', this.vignetteEffectEnabled = false, + this.placeEffectAnimation = 'Default', + this.removeEffectAnimation = 'Default', }); /// Encodes a Json style map into a [DisplaySettings] object @@ -174,6 +176,12 @@ class DisplaySettings { @HiveField(27, defaultValue: false) final bool vignetteEffectEnabled; + @HiveField(28, defaultValue: 'Default') + final String placeEffectAnimation; + + @HiveField(29, defaultValue: 'Default') + final String removeEffectAnimation; + /// Decodes a Json from a [DisplaySettings] object Map toJson() => _$DisplaySettingsToJson(this); } diff --git a/src/ui/flutter_app/lib/appearance_settings/widgets/appearance_settings_page.dart b/src/ui/flutter_app/lib/appearance_settings/widgets/appearance_settings_page.dart index 6c1b8de52..349fb30ed 100644 --- a/src/ui/flutter_app/lib/appearance_settings/widgets/appearance_settings_page.dart +++ b/src/ui/flutter_app/lib/appearance_settings/widgets/appearance_settings_page.dart @@ -36,12 +36,13 @@ import '../../shared/themes/app_theme.dart'; import '../../shared/widgets/snackbars/scaffold_messenger.dart'; import '../models/color_settings.dart'; import '../models/display_settings.dart'; +import 'piece_effect_selection_page.dart'; part 'package:sanmill/appearance_settings/widgets/modals/point_painting_style_modal.dart'; part 'package:sanmill/appearance_settings/widgets/pickers/background_image_picker.dart'; part 'package:sanmill/appearance_settings/widgets/pickers/board_image_picker.dart'; -part 'package:sanmill/appearance_settings/widgets/pickers/piece_image_picker.dart'; part 'package:sanmill/appearance_settings/widgets/pickers/language_picker.dart'; +part 'package:sanmill/appearance_settings/widgets/pickers/piece_image_picker.dart'; part 'package:sanmill/appearance_settings/widgets/sliders/animation_duration_slider.dart'; part 'package:sanmill/appearance_settings/widgets/sliders/board_boarder_line_width_slider.dart'; part 'package:sanmill/appearance_settings/widgets/sliders/board_inner_line_width_slider.dart'; @@ -108,6 +109,42 @@ class AppearanceSettingsPage extends StatelessWidget { builder: (_) => const _AnimationDurationSlider(), ); + Future setPlaceEffectAnimation(BuildContext context) async { + final EffectItem? selectedEffect = await Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const PieceEffectSelectionPage(), + ), + ); + + if (selectedEffect != null) { + DB().displaySettings = DB().displaySettings.copyWith( + placeEffectAnimation: selectedEffect.name, + ); + + logger + .t("[config] Selected PlaceEffectAnimation: ${selectedEffect.name}"); + } + } + + Future setRemoveEffectAnimation(BuildContext context) async { + final EffectItem? selectedEffect = await Navigator.push( + context, + MaterialPageRoute( + builder: (BuildContext context) => const PieceEffectSelectionPage(), + ), + ); + + if (selectedEffect != null) { + DB().displaySettings = DB().displaySettings.copyWith( + removeEffectAnimation: selectedEffect.name, + ); + + logger + .t("[config] Selected RemoveEffectAnimation: ${selectedEffect.name}"); + } + } + void setBackgroundImage(BuildContext context) => showModalBottomSheet( context: context, builder: (_) => const _BackgroundImagePicker(), @@ -585,6 +622,14 @@ class AppearanceSettingsPage extends StatelessWidget { titleString: S.of(context).animationDuration, onTap: () => setAnimationDuration(context), ), + SettingsListTile( + titleString: S.of(context).placeEffectAnimation, + onTap: () => setPlaceEffectAnimation(context), + ), + SettingsListTile( + titleString: S.of(context).removeEffectAnimation, + onTap: () => setRemoveEffectAnimation(context), + ), SettingsListTile.switchTile( value: displaySettings.vignetteEffectEnabled, onChanged: (bool val) => DB().displaySettings = diff --git a/src/ui/flutter_app/lib/appearance_settings/widgets/piece_effect_selection_page.dart b/src/ui/flutter_app/lib/appearance_settings/widgets/piece_effect_selection_page.dart new file mode 100644 index 000000000..42ed6b3c0 --- /dev/null +++ b/src/ui/flutter_app/lib/appearance_settings/widgets/piece_effect_selection_page.dart @@ -0,0 +1,208 @@ +// This file is part of Sanmill. +// Copyright (C) 2019-2024 The Sanmill developers +// +// Sanmill is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Sanmill is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'dart:math'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +import '../../game_page/services/painters/animations/piece_effect_animation.dart'; +import '../../generated/intl/l10n.dart'; +import '../../shared/themes/app_theme.dart'; + +/// Effect item model to hold the name and animation instance. +class EffectItem { + EffectItem({required this.name, required this.animation}); + final String name; + final PieceEffectAnimation animation; +} + +/// The main page that displays the animations in a grid. +class PieceEffectSelectionPage extends StatefulWidget { + const PieceEffectSelectionPage({super.key}); + + @override + PieceEffectSelectionPageState createState() => + PieceEffectSelectionPageState(); +} + +class PieceEffectSelectionPageState extends State { + late List effects; + + @override + void initState() { + super.initState(); + + // Initialize the list of effect items. + effects = [ + EffectItem(name: 'Aura', animation: AuraPieceEffectAnimation()), + EffectItem(name: 'Echo', animation: EchoPieceEffectAnimation()), + EffectItem(name: 'Expand', animation: ExpandPieceEffectAnimation()), + EffectItem(name: 'Explode', animation: ExplodePieceEffectAnimation()), + EffectItem(name: 'Orbit', animation: OrbitPieceEffectAnimation()), + EffectItem( + name: 'ParticleBurst', + animation: ParticleBurstPieceEffectAnimation()), + EffectItem(name: 'Radial', animation: RadialPieceEffectAnimation()), + EffectItem(name: 'Ripple', animation: RipplePieceEffectAnimation()), + EffectItem(name: 'Rotate', animation: RotatePieceEffectAnimation()), + EffectItem(name: 'Spiral', animation: SpiralPieceEffectAnimation()), + EffectItem(name: 'Shatter', animation: ShatterPieceEffectAnimation()), + EffectItem(name: 'Disperse', animation: DispersePieceEffectAnimation()), + EffectItem(name: 'Radiate', animation: RadiatePieceEffectAnimation()), + EffectItem(name: 'StarBurst', animation: StarBurstPieceEffectAnimation()), + EffectItem(name: 'Vanish', animation: VanishPieceEffectAnimation()), + EffectItem(name: 'Fade', animation: FadePieceEffectAnimation()), + EffectItem(name: 'Melt', animation: MeltPieceEffectAnimation()), + ]; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text( + S.of(context).settings, + style: AppTheme.appBarTheme.titleTextStyle, + ), + ), + body: GridView.builder( + padding: const EdgeInsets.all(8.0), + gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, // 3 items per row + crossAxisSpacing: 8.0, + mainAxisSpacing: 8.0, + ), + itemCount: effects.length, + itemBuilder: (BuildContext context, int index) { + final EffectItem effectItem = effects[index]; + return EffectGridItem( + effectItem: effectItem, + onTap: () { + // Handle the selection logic here. + if (kDebugMode) { + print('Selected effect: ${effectItem.name}'); + } + + Navigator.pop(context, + effectItem); // Return the selected effect to the previous page. + }, + ); + }, + ), + ); + } +} + +/// Widget representing each grid item in the selection page. +class EffectGridItem extends StatefulWidget { + const EffectGridItem({ + super.key, + required this.effectItem, + required this.onTap, + }); + final EffectItem effectItem; + final VoidCallback onTap; + + @override + EffectGridItemState createState() => EffectGridItemState(); +} + +class EffectGridItemState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + + // Initialize the animation controller. + _controller = AnimationController( + duration: const Duration(seconds: 2), // Duration of each animation cycle. + vsync: this, + ); + + _animation = CurvedAnimation(parent: _controller, curve: Curves.linear); + + // Repeat the animation indefinitely. + _controller.repeat(); + } + + @override + void dispose() { + // Dispose the animation controller to free resources. + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // GestureDetector to handle taps on the grid item. + return GestureDetector( + onTap: widget.onTap, + child: Column( + children: [ + // Use Expanded and AspectRatio to maintain a square shape. + Expanded( + child: AspectRatio( + aspectRatio: 1.0, + // AnimatedBuilder to rebuild the CustomPaint when the animation updates. + child: AnimatedBuilder( + animation: _animation, + builder: (BuildContext context, Widget? child) { + return CustomPaint( + painter: EffectPainter( + animation: widget.effectItem.animation, + animationValue: _animation.value, + ), + ); + }, + ), + ), + ), + const SizedBox(height: 4.0), + // Display the name of the effect. + Text(widget.effectItem.name), + ], + ), + ); + } +} + +/// Custom painter that uses the PieceEffectAnimation to draw the effect. +class EffectPainter extends CustomPainter { + EffectPainter({required this.animation, required this.animationValue}); + final PieceEffectAnimation animation; + final double animationValue; + + @override + void paint(Canvas canvas, Size size) { + // Calculate the center and diameter based on the size of the widget. + final Offset center = Offset(size.width / 2, size.height / 2); + final double diameter = min(size.width, size.height); + + // Use the animation's draw method to render the effect. + animation.draw(canvas, center, diameter, animationValue); + } + + @override + bool shouldRepaint(covariant EffectPainter oldDelegate) { + // Repaint when the animation value changes. + return oldDelegate.animationValue != animationValue || + oldDelegate.animation != animation; + } +} diff --git a/src/ui/flutter_app/lib/game_page/services/painters/animations/piece_effect_animation.dart b/src/ui/flutter_app/lib/game_page/services/painters/animations/piece_effect_animation.dart new file mode 100644 index 000000000..29b38fac1 --- /dev/null +++ b/src/ui/flutter_app/lib/game_page/services/painters/animations/piece_effect_animation.dart @@ -0,0 +1,686 @@ +// This file is part of Sanmill. +// Copyright (C) 2019-2024 The Sanmill developers +// +// Sanmill is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Sanmill is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +import 'dart:math'; +import 'dart:ui' as ui; +import 'package:flutter/material.dart'; + +import '../../../../shared/database/database.dart'; + +/// Abstract class for PlaceEffect animations. +abstract class PieceEffectAnimation { + void draw( + Canvas canvas, Offset center, double diameter, double animationValue); +} + +/// Default implementation of the RemoveEffect animation. +class ExplodePieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final int numParticles = DB().ruleSettings.piecesCount; + final double maxDistance = diameter * 3; + final double particleMaxSize = diameter * 0.12; + final double particleMinSize = diameter * 0.05; + + final double time = Curves.easeOut.transform(animationValue); + + final int seed = DateTime.now().millisecondsSinceEpoch; + final Random random = Random(seed); + + for (int i = 0; i < numParticles; i++) { + final double angle = + (i / numParticles) * 2 * pi + random.nextDouble() * 0.2; + final double speed = 0.5 + random.nextDouble() * 0.4; + + final double distance = speed * time * maxDistance; + final Offset offset = Offset(cos(angle), sin(angle)) * distance; + final Offset particlePos = center + offset; + + final double opacity = (1.0 - time).clamp(0.0, 1.0); + + final Color particleColor = HSVColor.fromAHSV( + opacity, + random.nextDouble() * 360, + 1.0, + 1.0, + ).toColor(); + + final Paint particlePaint = Paint() + ..color = particleColor + ..style = PaintingStyle.fill; + + final double particleSize = particleMinSize + + (particleMaxSize - particleMinSize) * + (1.0 - time) * + (0.8 + random.nextDouble() * 0.4); + + canvas.drawCircle(particlePos, particleSize, particlePaint); + } + } +} + +/// Aura effect for placing a piece. +/// Displays a halo around the piece that pulsates like a breathing light. +class AuraPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, + Offset center, + double diameter, + double animationValue, + ) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + // Use a sinusoidal function to create a breathing effect. + final double easedAnimation = + (sin(animationValue * pi * 2 - pi / 2) + 1) / 2; + + final double maxRadius = diameter * 1.2; + final double radius = + diameter / 2 + (maxRadius - diameter / 2) * easedAnimation; + final double opacity = 0.1 * easedAnimation + 0.1; + final ui.Color pieceHighlightColor = DB().colorSettings.pieceHighlightColor; + + final Paint paint = Paint() + ..color = pieceHighlightColor.withOpacity(opacity) + ..style = PaintingStyle.stroke + ..strokeWidth = diameter * 0.1; + + canvas.drawCircle(center, radius, paint); + } +} + +/// Echo effect for placing a piece. +/// Creates multiple fading outlines of the piece expanding outward. +class EchoPieceEffectAnimation implements PieceEffectAnimation { + final int echoCount = 3; + + @override + void draw( + Canvas canvas, + Offset center, + double diameter, + double animationValue, + ) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + for (int i = 0; i < echoCount; i++) { + final double progress = + ((animationValue * echoCount) - i).clamp(0.0, 1.0); + final double easedProgress = Curves.easeOut.transform(progress); + final double radius = diameter / 2 + diameter * easedProgress; + final double opacity = (1.0 - easedProgress) * 0.4; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0; + + canvas.drawCircle(center, radius, paint); + } + } +} + +/// Expand effect for placing a piece. +class ExpandPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + const double maxScale = 2.0; + final double easedAnimation = Curves.elasticOut.transform(animationValue); + final double scale = 1.0 + (maxScale - 1.0) * easedAnimation; + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity * 0.4) + ..style = PaintingStyle.fill; + + canvas.save(); + canvas.translate(center.dx, center.dy); + canvas.scale(scale); + canvas.drawCircle(Offset.zero, diameter / 2, paint); + canvas.restore(); + } +} + +/// Orbit effect for placing a piece. +/// Displays small circles orbiting around the center point. +class OrbitPieceEffectAnimation implements PieceEffectAnimation { + final int orbitCount = 3; + + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double easedAnimation = Curves.linear.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + final double orbitRadius = diameter * 0.5; + + for (int i = 0; i < orbitCount; i++) { + final double angle = easedAnimation * 2 * pi + (2 * pi * i / orbitCount); + final Offset orbitCenter = Offset( + center.dx + orbitRadius * cos(angle), + center.dy + orbitRadius * sin(angle), + ); + + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.fill; + + canvas.drawCircle(orbitCenter, diameter * 0.1, paint); + } + } +} + +/// ParticleBurst effect for placing a piece. +/// Emits small particles in random directions that fade out over time. +class ParticleBurstPieceEffectAnimation implements PieceEffectAnimation { + final int particleCount = 20; + final List directions = List.generate( + 20, + (int index) => Offset( + cos((2 * pi / 20) * index + Random().nextDouble() * pi / 10), + sin((2 * pi / 20) * index + Random().nextDouble() * pi / 10), + ), + ); + + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double maxDistance = diameter; + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + for (int i = 0; i < particleCount; i++) { + final Offset direction = directions[i]; + final double distance = maxDistance * easedAnimation; + final double opacity = (1.0 - easedAnimation).clamp(0.0, 1.0) * 0.7; + + final Offset particlePosition = center + direction * distance; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.fill; + + canvas.drawCircle(particlePosition, 2.0, paint); + } + } +} + +/// Radiate effect for placing a piece. +/// Draws lines radiating outwards from the center point. +class RadiatePieceEffectAnimation implements PieceEffectAnimation { + final int lineCount = 8; + + @override + void draw( + Canvas canvas, + Offset center, + double diameter, + double animationValue, + ) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + final double maxLength = diameter; + + for (int i = 0; i < lineCount; i++) { + final double angle = (2 * pi / lineCount) * i; + final double length = maxLength * easedAnimation; + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + + final Offset endPoint = Offset( + center.dx + length * cos(angle), + center.dy + length * sin(angle), + ); + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity * 0.5) + ..strokeWidth = 2.0; + + canvas.drawLine(center, endPoint, paint); + } + } +} + +/// RadialAnimation implementation of the PlaceEffect animation. +/// Renamed from DefaultPieceEffectAnimation to a single-word name. +class RadialPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + // Apply easing to the animation value. + final double easedAnimation = Curves.easeOut.transform(animationValue); + + // Calculate the maximum and current radius based on the diameter and animation. + final double maxRadius = diameter * 0.25; + final double currentRadius = diameter + maxRadius * easedAnimation; + + // Define the main and secondary opacities. + final double mainOpacity = 0.6 * (1.0 - easedAnimation); + final double secondOpacity = mainOpacity * 0.8; + + // Cache the board line color to avoid repeated calls. + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + // Define the configuration for each effect layer. + final List<_EffectLayer> layers = <_EffectLayer>[ + // Main layer. + _EffectLayer( + radiusFactor: 1.0, + opacityFactor: 0.8, + ), + // Second layer. + _EffectLayer( + radiusFactor: 0.75, + opacityFactor: 0.5, + ), + // Third layer. + _EffectLayer( + radiusFactor: 0.5, + opacityFactor: 0.2, + ), + ]; + + // Iterate over each layer configuration to draw the circles. + for (final _EffectLayer layer in layers) { + // Determine the radius for the current layer. + final double layerRadius = currentRadius * layer.radiusFactor; + + // Determine the opacity for the current layer. + double layerOpacity; + if (layer.opacityFactor == 1.0) { + layerOpacity = mainOpacity; + } else if (layer.opacityFactor == 0.8) { + layerOpacity = secondOpacity; + } else { + layerOpacity = mainOpacity * layer.opacityFactor; + } + + // Create the paint with a radial gradient shader. + final Paint paint = Paint() + ..shader = RadialGradient( + colors: [ + boardLineColor.withOpacity(layerOpacity), + boardLineColor.withOpacity(0.0), + ], + stops: const [ + 0.0, + 1.0, + ], + ).createShader(Rect.fromCircle(center: center, radius: layerRadius)) + ..style = PaintingStyle.fill; + + // Draw the circle on the canvas. + canvas.drawCircle(center, layerRadius, paint); + } + } +} + +/// Ripple effect for placing a piece. +class RipplePieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double maxRadius = diameter * 2.0; + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + // Draw multiple concentric circles with varying opacity and radius. + for (int i = 0; i < 3; i++) { + final double progress = (easedAnimation + i * 0.3) % 1.0; + final double radius = maxRadius * progress; + final double opacity = (1.0 - progress).clamp(0.0, 1.0); + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity * 0.5) + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0; + + canvas.drawCircle(center, radius, paint); + } + } +} + +/// Rotate effect for placing a piece. +class RotatePieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double rotation = animationValue * 2 * pi; + final double radius = diameter * 1.0; + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + + final Path path = Path(); + path.moveTo( + center.dx + radius * cos(rotation), center.dy + radius * sin(rotation)); + for (int i = 1; i <= 6; i++) { + final double angle = rotation + (2 * pi * i) / 6; + path.lineTo( + center.dx + radius * cos(angle), + center.dy + radius * sin(angle), + ); + } + path.close(); + + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity * 0.7) + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0; + + canvas.drawPath(path, paint); + } +} + +/// Spiral effect for placing a piece. +class SpiralPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double maxRadius = diameter * 1.5; + final double easedAnimation = Curves.easeInOut.transform(animationValue); + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + + final Path path = Path(); + for (int i = 0; i < 3; i++) { + final double startAngle = i * 2 * pi / 3; + final double endAngle = (i + easedAnimation) * 2 * pi / 3; + final double radius = + diameter / 2 + (maxRadius - diameter / 2) * easedAnimation; + + path.addArc( + Rect.fromCircle(center: center, radius: radius), + startAngle, + endAngle - startAngle, + ); + } + + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity * 0.6) + ..style = PaintingStyle.stroke + ..strokeWidth = 2.0; + + canvas.drawPath(path, paint); + } +} + +/// StarBurst effect for placing a piece. +/// Radiates multiple lines outward from the center with fading opacity. +class StarBurstPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double maxLength = diameter * 1.5; + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + const int numberOfLines = 12; + const double angleIncrement = 2 * pi / numberOfLines; + + for (int i = 0; i < numberOfLines; i++) { + final double angle = i * angleIncrement; + final double currentLength = maxLength * easedAnimation; + final double opacity = (1.0 - easedAnimation).clamp(0.0, 1.0) * 0.6; + + final Offset endPoint = Offset( + center.dx + currentLength * cos(angle), + center.dy + currentLength * sin(angle), + ); + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..strokeWidth = 2.0 + ..strokeCap = StrokeCap.round; + + canvas.drawLine(center, endPoint, paint); + } + } +} + +//////////////////////////////////////////////////////////////////////////////// + +/// Fade effect for removing a piece. +class FadePieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + // Calculate opacity based on animation progress. + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + // Draw the piece with decreasing opacity. + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.fill; + + canvas.drawCircle(center, diameter / 2, paint); + } +} + +/// Shrink effect for removing a piece. +class ShrinkPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + // Calculate the shrinking size. + final double scale = (1.0 - animationValue).clamp(0.0, 1.0); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + // Draw the shrinking piece. + final Paint paint = Paint() + ..color = boardLineColor + ..style = PaintingStyle.fill; + + final double currentDiameter = diameter * scale; + canvas.drawCircle(center, currentDiameter / 2, paint); + } +} + +/// Shatter effect for removing a piece. +class ShatterPieceEffectAnimation implements PieceEffectAnimation { + ShatterPieceEffectAnimation() + : shardDirections = List.generate( + 12, + (int index) { + final double angle = + (2 * pi / 12) * index + Random().nextDouble() * 0.2; + return Offset(cos(angle), sin(angle)); + }, + ); + final int shardCount = 12; + final List shardDirections; + + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + final double maxDistance = diameter * 2.0; + + for (int i = 0; i < shardCount; i++) { + final Offset direction = shardDirections[i]; + final double distance = maxDistance * easedAnimation; + final double shardSize = diameter / shardCount; + + final Offset shardCenter = center + direction * distance; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(1.0 - animationValue) + ..style = PaintingStyle.fill; + + canvas.drawCircle(shardCenter, shardSize / 2, paint); + } + } +} + +/// Disperse effect for removing a piece. +class DispersePieceEffectAnimation implements PieceEffectAnimation { + DispersePieceEffectAnimation() + : particleOffsets = List.generate( + 20, + (int index) { + final double angle = Random().nextDouble() * 2 * pi; + final double radius = Random().nextDouble() * 0.5; + return Offset(radius * cos(angle), radius * sin(angle)); + }, + ); + final int particleCount = 20; + final List particleOffsets; + + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double easedAnimation = Curves.easeOut.transform(animationValue); + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + for (int i = 0; i < particleCount; i++) { + final Offset offset = particleOffsets[i]; + final double distance = diameter * 1.5 * easedAnimation; + final double opacity = (1.0 - animationValue).clamp(0.0, 1.0); + + final Offset particlePosition = center + offset * distance; + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.fill; + + canvas.drawCircle(particlePosition, diameter * 0.05, paint); + } + } +} + +/// Vanish effect for removing a piece. +class VanishPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + // Instantly removes the piece without animation. + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + // No drawing needed as the piece vanishes. + } +} + +/// Melt effect for removing a piece. +class MeltPieceEffectAnimation implements PieceEffectAnimation { + @override + void draw( + Canvas canvas, Offset center, double diameter, double animationValue) { + if (DB().displaySettings.animationDuration == 0.0) { + return; + } + + final double easedAnimation = Curves.easeIn.transform(animationValue); + final double scaleY = (1.0 - easedAnimation).clamp(0.0, 1.0); + final double opacity = (1.0 - easedAnimation).clamp(0.0, 1.0); + + final ui.Color boardLineColor = DB().colorSettings.boardLineColor; + + canvas.save(); + canvas.translate(center.dx, center.dy); + canvas.scale(1.0, scaleY); + + final Paint paint = Paint() + ..color = boardLineColor.withOpacity(opacity) + ..style = PaintingStyle.fill; + + canvas.drawCircle(Offset.zero, diameter / 2, paint); + canvas.restore(); + } +} + +/// A helper class to define the properties of each effect layer. +class _EffectLayer { + _EffectLayer({ + required this.radiusFactor, + required this.opacityFactor, + }); + + /// The factor by which to multiply the current radius. + final double radiusFactor; + + /// The factor by which to multiply the main opacity. + final double opacityFactor; +} diff --git a/src/ui/flutter_app/lib/game_page/services/painters/animations/place_effect_animation.dart b/src/ui/flutter_app/lib/game_page/services/painters/animations/place_effect_animation.dart deleted file mode 100644 index 26c0093bd..000000000 --- a/src/ui/flutter_app/lib/game_page/services/painters/animations/place_effect_animation.dart +++ /dev/null @@ -1,117 +0,0 @@ -// This file is part of Sanmill. -// Copyright (C) 2019-2024 The Sanmill developers (see AUTHORS file) -// -// Sanmill is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Sanmill is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:ui' as ui; -import 'package:flutter/material.dart'; - -import '../../../../shared/database/database.dart'; - -/// Abstract class for PlaceEffect animations. -abstract class PlaceEffectAnimation { - void draw( - Canvas canvas, Offset center, double diameter, double animationValue); -} - -/// Default implementation of the PlaceEffect animation. -class DefaultPlaceEffectAnimation implements PlaceEffectAnimation { - @override - void draw( - Canvas canvas, Offset center, double diameter, double animationValue) { - if (DB().displaySettings.animationDuration == 0.0) { - return; - } - - // Apply easing to the animation value. - final double easedAnimation = Curves.easeOut.transform(animationValue); - - // Calculate the maximum and current radius based on the diameter and animation. - final double maxRadius = diameter * 0.25; - final double currentRadius = diameter + maxRadius * easedAnimation; - - // Define the main and secondary opacities. - final double mainOpacity = 0.6 * (1.0 - easedAnimation); - final double secondOpacity = mainOpacity * 0.8; - - // Cache the board line color to avoid repeated calls. - final ui.Color boardLineColor = DB().colorSettings.boardLineColor; - - // Define the configuration for each effect layer. - final List<_EffectLayer> layers = <_EffectLayer>[ - // Main layer. - _EffectLayer( - radiusFactor: 1.0, - opacityFactor: 0.8, - ), - // Second layer. - _EffectLayer( - radiusFactor: 0.75, - opacityFactor: 0.5, - ), - // Third layer. - _EffectLayer( - radiusFactor: 0.5, - opacityFactor: 0.2, - ), - ]; - - // Iterate over each layer configuration to draw the circles. - for (final _EffectLayer layer in layers) { - // Determine the radius for the current layer. - final double layerRadius = currentRadius * layer.radiusFactor; - - // Determine the opacity for the current layer. - double layerOpacity; - if (layer.opacityFactor == 1.0) { - layerOpacity = mainOpacity; - } else if (layer.opacityFactor == 0.8) { - layerOpacity = secondOpacity; - } else { - layerOpacity = mainOpacity * layer.opacityFactor; - } - - // Create the paint with a radial gradient shader. - final Paint paint = Paint() - ..shader = RadialGradient( - colors: [ - boardLineColor.withOpacity(layerOpacity), - boardLineColor.withOpacity(0.0), - ], - stops: const [ - 0.0, - 1.0, - ], - ).createShader(Rect.fromCircle(center: center, radius: layerRadius)) - ..style = PaintingStyle.fill; - - // Draw the circle on the canvas. - canvas.drawCircle(center, layerRadius, paint); - } - } -} - -/// A helper class to define the properties of each effect layer. -class _EffectLayer { - _EffectLayer({ - required this.radiusFactor, - required this.opacityFactor, - }); - - /// The factor by which to multiply the current radius. - final double radiusFactor; - - /// The factor by which to multiply the main opacity. - final double opacityFactor; -} diff --git a/src/ui/flutter_app/lib/game_page/services/painters/animations/remove_effect_animation.dart b/src/ui/flutter_app/lib/game_page/services/painters/animations/remove_effect_animation.dart deleted file mode 100644 index 8fb9a6a90..000000000 --- a/src/ui/flutter_app/lib/game_page/services/painters/animations/remove_effect_animation.dart +++ /dev/null @@ -1,76 +0,0 @@ -// This file is part of Sanmill. -// Copyright (C) 2019-2024 The Sanmill developers (see AUTHORS file) -// -// Sanmill is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Sanmill is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -import 'dart:math'; -import 'package:flutter/material.dart'; -import '../../../../shared/database/database.dart'; - -/// Abstract class for RemoveEffect animations. -abstract class RemoveEffectAnimation { - void draw( - Canvas canvas, Offset center, double diameter, double animationValue); -} - -/// Default implementation of the RemoveEffect animation. -class DefaultRemoveEffectAnimation implements RemoveEffectAnimation { - @override - void draw( - Canvas canvas, Offset center, double diameter, double animationValue) { - if (DB().displaySettings.animationDuration == 0.0) { - return; - } - - final int numParticles = DB().ruleSettings.piecesCount; - final double maxDistance = diameter * 3; - final double particleMaxSize = diameter * 0.12; - final double particleMinSize = diameter * 0.05; - - final double time = Curves.easeOut.transform(animationValue); - - final int seed = DateTime.now().millisecondsSinceEpoch; - final Random random = Random(seed); - - for (int i = 0; i < numParticles; i++) { - final double angle = - (i / numParticles) * 2 * pi + random.nextDouble() * 0.2; - final double speed = 0.5 + random.nextDouble() * 0.4; - - final double distance = speed * time * maxDistance; - final Offset offset = Offset(cos(angle), sin(angle)) * distance; - final Offset particlePos = center + offset; - - final double opacity = (1.0 - time).clamp(0.0, 1.0); - - final Color particleColor = HSVColor.fromAHSV( - opacity, - random.nextDouble() * 360, - 1.0, - 1.0, - ).toColor(); - - final Paint particlePaint = Paint() - ..color = particleColor - ..style = PaintingStyle.fill; - - final double particleSize = particleMinSize + - (particleMaxSize - particleMinSize) * - (1.0 - time) * - (0.8 + random.nextDouble() * 0.4); - - canvas.drawCircle(particlePos, particleSize, particlePaint); - } - } -} diff --git a/src/ui/flutter_app/lib/game_page/services/painters/painters.dart b/src/ui/flutter_app/lib/game_page/services/painters/painters.dart index 9ab561d57..1cd381e5f 100644 --- a/src/ui/flutter_app/lib/game_page/services/painters/painters.dart +++ b/src/ui/flutter_app/lib/game_page/services/painters/painters.dart @@ -28,8 +28,7 @@ import '../../../shared/database/database.dart'; import '../../../shared/services/environment_config.dart'; import '../../../shared/themes/app_theme.dart'; import '../mill.dart'; -import 'animations/place_effect_animation.dart'; -import 'animations/remove_effect_animation.dart'; +import 'animations/piece_effect_animation.dart'; import 'piece.dart'; part 'board_painter.dart'; diff --git a/src/ui/flutter_app/lib/game_page/services/painters/piece_painter.dart b/src/ui/flutter_app/lib/game_page/services/painters/piece_painter.dart index 133585460..8fb0bd005 100644 --- a/src/ui/flutter_app/lib/game_page/services/painters/piece_painter.dart +++ b/src/ui/flutter_app/lib/game_page/services/painters/piece_painter.dart @@ -37,8 +37,8 @@ class PiecePainter extends CustomPainter { final Map? pieceImages; // Animation instances for place and remove effects. - final PlaceEffectAnimation placeEffectAnimation; - final RemoveEffectAnimation removeEffectAnimation; + final PieceEffectAnimation placeEffectAnimation; + final PieceEffectAnimation removeEffectAnimation; @override void paint(Canvas canvas, Size size) { diff --git a/src/ui/flutter_app/lib/game_page/widgets/game_board.dart b/src/ui/flutter_app/lib/game_page/widgets/game_board.dart index 11dd968f3..5b0dc7336 100644 --- a/src/ui/flutter_app/lib/game_page/widgets/game_board.dart +++ b/src/ui/flutter_app/lib/game_page/widgets/game_board.dart @@ -194,6 +194,117 @@ class _GameBoardState extends State with TickerProviderStateMixin { context: context, ); + // Assuming you have a user setting that selects the animation type. + PieceEffectAnimation placeEffectAnimation; + + switch (DB().displaySettings.placeEffectAnimation) { + case 'Aura': + placeEffectAnimation = AuraPieceEffectAnimation(); + break; + case 'Echo': + placeEffectAnimation = EchoPieceEffectAnimation(); + break; + case 'Expand': + placeEffectAnimation = ExpandPieceEffectAnimation(); + break; + case 'Explode': + placeEffectAnimation = ExplodePieceEffectAnimation(); + break; + case 'Orbit': + placeEffectAnimation = OrbitPieceEffectAnimation(); + break; + case 'ParticleBurst': + placeEffectAnimation = ParticleBurstPieceEffectAnimation(); + break; + case 'Radiate': + placeEffectAnimation = RadiatePieceEffectAnimation(); + break; + case 'Radial': + placeEffectAnimation = RadialPieceEffectAnimation(); + break; + case 'Ripple': + placeEffectAnimation = RipplePieceEffectAnimation(); + break; + case 'Rotate': + placeEffectAnimation = RotatePieceEffectAnimation(); + break; + case 'Spiral': + placeEffectAnimation = SpiralPieceEffectAnimation(); + break; + case 'StarBurst': + placeEffectAnimation = StarBurstPieceEffectAnimation(); + break; + case 'Shatter': + placeEffectAnimation = ShatterPieceEffectAnimation(); + break; + case 'Disperse': + placeEffectAnimation = DispersePieceEffectAnimation(); + break; + default: + placeEffectAnimation = RadialPieceEffectAnimation(); + } + + PieceEffectAnimation removeEffectAnimation; + + switch (DB().displaySettings.removeEffectAnimation) { + case 'Aura': + removeEffectAnimation = AuraPieceEffectAnimation(); + break; + case 'Echo': + removeEffectAnimation = EchoPieceEffectAnimation(); + break; + case 'Expand': + removeEffectAnimation = ExpandPieceEffectAnimation(); + break; + case 'Explode': + removeEffectAnimation = ExplodePieceEffectAnimation(); + break; + case 'Orbit': + removeEffectAnimation = OrbitPieceEffectAnimation(); + break; + case 'ParticleBurst': + removeEffectAnimation = ParticleBurstPieceEffectAnimation(); + break; + case 'Radiate': + removeEffectAnimation = RadiatePieceEffectAnimation(); + break; + case 'Radial': + removeEffectAnimation = RadialPieceEffectAnimation(); + break; + case 'Ripple': + removeEffectAnimation = RipplePieceEffectAnimation(); + break; + case 'Rotate': + removeEffectAnimation = RotatePieceEffectAnimation(); + break; + case 'Spiral': + removeEffectAnimation = SpiralPieceEffectAnimation(); + break; + case 'StarBurst': + removeEffectAnimation = StarBurstPieceEffectAnimation(); + break; + case 'Fade': // + removeEffectAnimation = FadePieceEffectAnimation(); + break; + case 'Shrink': // + removeEffectAnimation = ShrinkPieceEffectAnimation(); + break; + case 'Shatter': + removeEffectAnimation = ShatterPieceEffectAnimation(); + break; + case 'Disperse': + removeEffectAnimation = DispersePieceEffectAnimation(); + break; + case 'Vanish': // + removeEffectAnimation = VanishPieceEffectAnimation(); + break; + case 'Melt': // + removeEffectAnimation = MeltPieceEffectAnimation(); + break; + default: + removeEffectAnimation = ExplodePieceEffectAnimation(); + } + final AnimatedBuilder customPaint = AnimatedBuilder( animation: Listenable.merge(>[ animationManager.placeAnimationController, @@ -221,8 +332,8 @@ class _GameBoardState extends State with TickerProviderStateMixin { PieceColor.black: gameImages?.blackPieceImage, PieceColor.marked: gameImages?.markedPieceImage, }, - placeEffectAnimation: DefaultPlaceEffectAnimation(), - removeEffectAnimation: DefaultRemoveEffectAnimation(), + placeEffectAnimation: placeEffectAnimation, + removeEffectAnimation: removeEffectAnimation, ), child: DB().generalSettings.screenReaderSupport ? const _BoardSemantics() diff --git a/src/ui/flutter_app/lib/game_page/widgets/game_page.dart b/src/ui/flutter_app/lib/game_page/widgets/game_page.dart index c23cac773..3483ee37d 100644 --- a/src/ui/flutter_app/lib/game_page/widgets/game_page.dart +++ b/src/ui/flutter_app/lib/game_page/widgets/game_page.dart @@ -41,8 +41,7 @@ import '../../shared/utils/helpers/string_helpers/string_buffer_helper.dart'; import '../../shared/widgets/custom_spacer.dart'; import '../../shared/widgets/snackbars/scaffold_messenger.dart'; import '../services/animation/animation_manager.dart'; -import '../services/painters/animations/place_effect_animation.dart'; -import '../services/painters/animations/remove_effect_animation.dart'; +import '../services/painters/animations/piece_effect_animation.dart'; import '../services/painters/painters.dart'; import 'play_area.dart'; import 'toolbars/game_toolbar.dart'; diff --git a/src/ui/flutter_app/lib/l10n/intl_af.arb b/src/ui/flutter_app/lib/l10n/intl_af.arb index b5c36a995..2899d0f54 100644 --- a/src/ui/flutter_app/lib/l10n/intl_af.arb +++ b/src/ui/flutter_app/lib/l10n/intl_af.arb @@ -1575,5 +1575,9 @@ "liquid": "Vloeistof", "@liquid": {}, "wood": "Hout", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Stuk plaas animasie-effek", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Stuk verwydering animasie-effek", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_am.arb b/src/ui/flutter_app/lib/l10n/intl_am.arb index 506a49bf1..e1e870fff 100644 --- a/src/ui/flutter_app/lib/l10n/intl_am.arb +++ b/src/ui/flutter_app/lib/l10n/intl_am.arb @@ -1575,5 +1575,9 @@ "liquid": "ፈሳሽ", "@liquid": {}, "wood": "ዛፍ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "ቁስ ማስቀመጥ አንድነት ተጽእኖ", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "ቁስ ማስወገድ አንድነት ተጽእኖ", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ar.arb b/src/ui/flutter_app/lib/l10n/intl_ar.arb index ddfb05c6a..a5c7afee8 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ar.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ar.arb @@ -1477,5 +1477,9 @@ "liquid": "سائل", "@liquid": {}, "wood": "خشب", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "تأثير تحريك وضع القطعة", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "تأثير تحريك إزالة القطعة", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_az.arb b/src/ui/flutter_app/lib/l10n/intl_az.arb index e2db10308..e6c11316e 100644 --- a/src/ui/flutter_app/lib/l10n/intl_az.arb +++ b/src/ui/flutter_app/lib/l10n/intl_az.arb @@ -1575,5 +1575,9 @@ "liquid": "Maye", "@liquid": {}, "wood": "Taxta", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Fiquru yerləşdirmə animasiya effekti", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Fiquru çıxarma animasiya effekti", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_be.arb b/src/ui/flutter_app/lib/l10n/intl_be.arb index a556c0eac..411ff6791 100644 --- a/src/ui/flutter_app/lib/l10n/intl_be.arb +++ b/src/ui/flutter_app/lib/l10n/intl_be.arb @@ -1575,5 +1575,9 @@ "liquid": "Целавая", "@liquid": {}, "wood": "Дрэва", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анімацыйны эфект размяшчэння фігуры", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анімацыйны эфект выдалення фігуры", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_bg.arb b/src/ui/flutter_app/lib/l10n/intl_bg.arb index 9604df932..bb8328a92 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bg.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bg.arb @@ -1477,5 +1477,9 @@ "liquid": "Течност", "@liquid": {}, "wood": "Дърво", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анимационен ефект при поставяне на фигура", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анимационен ефект при премахване на фигура", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_bn.arb b/src/ui/flutter_app/lib/l10n/intl_bn.arb index 42dc337d1..974418e2a 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bn.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bn.arb @@ -1477,5 +1477,9 @@ "liquid": "তরল", "@liquid": {}, "wood": "কাঠ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "ঘুঁটি স্থাপনের অ্যানিমেশন প্রভাব", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "ঘুঁটি অপসারণের অ্যানিমেশন প্রভাব", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_bo.arb b/src/ui/flutter_app/lib/l10n/intl_bo.arb index 5e1641754..f32c3b38a 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bo.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bo.arb @@ -1575,5 +1575,9 @@ "liquid": "འཕེལ་བ", "@liquid": {}, "wood": "འབྲུག", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "ཆ་འཇུག་རིག་བཟོ་བའི་བསྒྱུར་བཅོས", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "ཆ་སུབ་རིག་བཟོ་བའི་བསྒྱུར་བཅོས", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_bs.arb b/src/ui/flutter_app/lib/l10n/intl_bs.arb index 4eebf41ce..c144c8682 100644 --- a/src/ui/flutter_app/lib/l10n/intl_bs.arb +++ b/src/ui/flutter_app/lib/l10n/intl_bs.arb @@ -1477,5 +1477,9 @@ "liquid": "Tekućina", "@liquid": {}, "wood": "Drvo", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animacijski efekt postavljanja figure", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animacijski efekt uklanjanja figure", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_cs.arb b/src/ui/flutter_app/lib/l10n/intl_cs.arb index 089cd2dc3..e1c4de0ef 100644 --- a/src/ui/flutter_app/lib/l10n/intl_cs.arb +++ b/src/ui/flutter_app/lib/l10n/intl_cs.arb @@ -1477,5 +1477,9 @@ "liquid": "Tekutina", "@liquid": {}, "wood": "Dřevo", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animace efektu umístění figurky", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animace efektu odstranění figurky", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_da.arb b/src/ui/flutter_app/lib/l10n/intl_da.arb index 45634060e..1034136cc 100644 --- a/src/ui/flutter_app/lib/l10n/intl_da.arb +++ b/src/ui/flutter_app/lib/l10n/intl_da.arb @@ -1477,5 +1477,9 @@ "liquid": "Væske", "@liquid": {}, "wood": "Træ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animations­effekt ved placering af brik", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animations­effekt ved fjernelse af brik", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_de.arb b/src/ui/flutter_app/lib/l10n/intl_de.arb index a8ed6a97c..36cd49d6e 100644 --- a/src/ui/flutter_app/lib/l10n/intl_de.arb +++ b/src/ui/flutter_app/lib/l10n/intl_de.arb @@ -1477,5 +1477,9 @@ "liquid": "Flüssigkeit", "@liquid": {}, "wood": "Holz", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animationseffekt beim Platzieren von Figuren", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animationseffekt beim Entfernen von Figuren", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_de_ch.arb b/src/ui/flutter_app/lib/l10n/intl_de_ch.arb index ccc7c11c5..3988e8957 100644 --- a/src/ui/flutter_app/lib/l10n/intl_de_ch.arb +++ b/src/ui/flutter_app/lib/l10n/intl_de_ch.arb @@ -1477,5 +1477,9 @@ "liquid": "Flüssigkeit", "@liquid": {}, "wood": "Holz", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animationseffekt beim Platzieren von Spielfiguren", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animationseffekt beim Entfernen von Spielfiguren", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_el.arb b/src/ui/flutter_app/lib/l10n/intl_el.arb index e02fb9220..2e09c0fba 100644 --- a/src/ui/flutter_app/lib/l10n/intl_el.arb +++ b/src/ui/flutter_app/lib/l10n/intl_el.arb @@ -1477,5 +1477,9 @@ "liquid": "Υγρό", "@liquid": {}, "wood": "Ξύλο", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Εφέ κίνησης τοποθέτησης πιόνιου", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Εφέ κίνησης αφαίρεσης πιόνιου", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_en.arb b/src/ui/flutter_app/lib/l10n/intl_en.arb index 101806b8f..0a7435376 100644 --- a/src/ui/flutter_app/lib/l10n/intl_en.arb +++ b/src/ui/flutter_app/lib/l10n/intl_en.arb @@ -1575,5 +1575,9 @@ "liquid": "Liquid", "@liquid": {}, "wood": "Wood", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Piece placing animation effect", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Piece removing animation effect", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_es.arb b/src/ui/flutter_app/lib/l10n/intl_es.arb index 59e1c7335..70f405f41 100644 --- a/src/ui/flutter_app/lib/l10n/intl_es.arb +++ b/src/ui/flutter_app/lib/l10n/intl_es.arb @@ -1477,5 +1477,9 @@ "liquid": "Líquido", "@liquid": {}, "wood": "Madera", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efecto de animación al colocar pieza", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efecto de animación al eliminar pieza", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_et.arb b/src/ui/flutter_app/lib/l10n/intl_et.arb index 4681e21c6..b5d188f99 100644 --- a/src/ui/flutter_app/lib/l10n/intl_et.arb +++ b/src/ui/flutter_app/lib/l10n/intl_et.arb @@ -1477,5 +1477,9 @@ "liquid": "Vedelik", "@liquid": {}, "wood": "Puit", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Nupu paigutamise animatsiooni efekt", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Nupu eemaldamise animatsiooni efekt", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_fa.arb b/src/ui/flutter_app/lib/l10n/intl_fa.arb index a381b2d52..9093889c5 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fa.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fa.arb @@ -1477,5 +1477,9 @@ "liquid": "مایع", "@liquid": {}, "wood": "چوب", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "اثر انیمیشن قرار دادن مهره", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "اثر انیمیشن حذف مهره", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_fi.arb b/src/ui/flutter_app/lib/l10n/intl_fi.arb index 8a4d33971..c26d814bd 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fi.arb @@ -1477,5 +1477,9 @@ "liquid": "Neste", "@liquid": {}, "wood": "Puu", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Nappulan asettamisen animaatioefekti", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Nappulan poistamisen animaatioefekti", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_fr.arb b/src/ui/flutter_app/lib/l10n/intl_fr.arb index c01abe905..afbfa526a 100644 --- a/src/ui/flutter_app/lib/l10n/intl_fr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_fr.arb @@ -1477,5 +1477,9 @@ "liquid": "Liquide", "@liquid": {}, "wood": "Bois", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Effet d'animation lors du placement de la pièce", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Effet d'animation lors du retrait de la pièce", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_gu.arb b/src/ui/flutter_app/lib/l10n/intl_gu.arb index ba7caaeb9..679b4c53e 100644 --- a/src/ui/flutter_app/lib/l10n/intl_gu.arb +++ b/src/ui/flutter_app/lib/l10n/intl_gu.arb @@ -1477,5 +1477,9 @@ "liquid": "તરસ", "@liquid": {}, "wood": "લાકડું", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "પતાની મૂકાશની એનિમેશન અસર", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "પતાની દૂર કરવાની એનિમેશન અસર", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_he.arb b/src/ui/flutter_app/lib/l10n/intl_he.arb index d6beeed49..64c23da87 100644 --- a/src/ui/flutter_app/lib/l10n/intl_he.arb +++ b/src/ui/flutter_app/lib/l10n/intl_he.arb @@ -1575,5 +1575,9 @@ "liquid": "נוזל", "@liquid": {}, "wood": "עץ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "אפקט אנימציה של הנחת כלי", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "אפקט אנימציה של הסרת כלי", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_hi.arb b/src/ui/flutter_app/lib/l10n/intl_hi.arb index 7bd7f16f9..5a59cdd91 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hi.arb @@ -1477,5 +1477,9 @@ "liquid": "तरल", "@liquid": {}, "wood": "लकड़ी", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "गोटी रखने का एनीमेशन प्रभाव", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "गोटी हटाने का एनीमेशन प्रभाव", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_hr.arb b/src/ui/flutter_app/lib/l10n/intl_hr.arb index b6b0c242c..0b8c1496c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hr.arb @@ -1477,5 +1477,9 @@ "liquid": "Tekućina", "@liquid": {}, "wood": "Drvo", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animacijski efekt postavljanja figure", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animacijski efekt uklanjanja figure", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_hu.arb b/src/ui/flutter_app/lib/l10n/intl_hu.arb index 2d0bb02d2..20661753e 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hu.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hu.arb @@ -1477,5 +1477,9 @@ "liquid": "Folyadék", "@liquid": {}, "wood": "Fa", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Bábu elhelyezési animációs effektus", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Bábu eltávolítási animációs effektus", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_hy.arb b/src/ui/flutter_app/lib/l10n/intl_hy.arb index 53b8966d3..d21d8de6f 100644 --- a/src/ui/flutter_app/lib/l10n/intl_hy.arb +++ b/src/ui/flutter_app/lib/l10n/intl_hy.arb @@ -1575,5 +1575,9 @@ "liquid": "ցուցակ", "@liquid": {}, "wood": "փայտ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Խաղաքար դնելու անիմացիոն էֆեկտ", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Խաղաքար հանելու անիմացիոն էֆեկտ", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_id.arb b/src/ui/flutter_app/lib/l10n/intl_id.arb index 08129104a..75133e8d5 100644 --- a/src/ui/flutter_app/lib/l10n/intl_id.arb +++ b/src/ui/flutter_app/lib/l10n/intl_id.arb @@ -1477,5 +1477,9 @@ "liquid": "Cairan", "@liquid": {}, "wood": "Kayu", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efek animasi penempatan bidak", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efek animasi penghapusan bidak", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_is.arb b/src/ui/flutter_app/lib/l10n/intl_is.arb index ef33c7f8e..0f98ae037 100644 --- a/src/ui/flutter_app/lib/l10n/intl_is.arb +++ b/src/ui/flutter_app/lib/l10n/intl_is.arb @@ -1575,5 +1575,9 @@ "liquid": "Vökvi", "@liquid": {}, "wood": "Tré", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Hreyfimyndaráhrif við að setja niður taflmann", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Hreyfimyndaráhrif við að fjarlægja taflmann", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_it.arb b/src/ui/flutter_app/lib/l10n/intl_it.arb index 52aad479f..96b96f71d 100644 --- a/src/ui/flutter_app/lib/l10n/intl_it.arb +++ b/src/ui/flutter_app/lib/l10n/intl_it.arb @@ -1477,5 +1477,9 @@ "liquid": "Liquido", "@liquid": {}, "wood": "Legno", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Effetto animazione di posizionamento pezzo", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Effetto animazione di rimozione pezzo", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ja.arb b/src/ui/flutter_app/lib/l10n/intl_ja.arb index 813f1a679..88bf00ef2 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ja.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ja.arb @@ -1575,5 +1575,9 @@ "liquid": "液体", "@liquid": {}, "wood": "木", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "駒を置くアニメーション効果", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "駒を取り除くアニメーション効果", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_kn.arb b/src/ui/flutter_app/lib/l10n/intl_kn.arb index 619639c94..887279f0b 100644 --- a/src/ui/flutter_app/lib/l10n/intl_kn.arb +++ b/src/ui/flutter_app/lib/l10n/intl_kn.arb @@ -1477,5 +1477,9 @@ "liquid": "ದ್ರವ", "@liquid": {}, "wood": "ಮರ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "ಮುಗ್ದವನ್ನು ಇರಿಸುವ ಅನಿಮೇಷನ್ ಪರಿಣಾಮ", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "ಮುಗ್ದವನ್ನು ತೆಗೆದುಹಾಕುವ ಅನಿಮೇಷನ್ ಪರಿಣಾಮ", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ko.arb b/src/ui/flutter_app/lib/l10n/intl_ko.arb index 02bd97f18..b0c8a3e0e 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ko.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ko.arb @@ -1477,5 +1477,9 @@ "liquid": "액체", "@liquid": {}, "wood": "목재", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "말 놓기 애니메이션 효과", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "말 제거 애니메이션 효과", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_lt.arb b/src/ui/flutter_app/lib/l10n/intl_lt.arb index 1a80be98d..d709b911f 100644 --- a/src/ui/flutter_app/lib/l10n/intl_lt.arb +++ b/src/ui/flutter_app/lib/l10n/intl_lt.arb @@ -1477,5 +1477,9 @@ "liquid": "Skystis", "@liquid": {}, "wood": "Mediena", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Figūros padėjimo animacijos efektas", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Figūros pašalinimo animacijos efektas", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_lv.arb b/src/ui/flutter_app/lib/l10n/intl_lv.arb index 612559975..ba843fdb2 100644 --- a/src/ui/flutter_app/lib/l10n/intl_lv.arb +++ b/src/ui/flutter_app/lib/l10n/intl_lv.arb @@ -1477,5 +1477,9 @@ "liquid": "Šķidrums", "@liquid": {}, "wood": "Koks", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Figūras novietošanas animācijas efekts", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Figūras noņemšanas animācijas efekts", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_mk.arb b/src/ui/flutter_app/lib/l10n/intl_mk.arb index bceb74169..f648f214a 100644 --- a/src/ui/flutter_app/lib/l10n/intl_mk.arb +++ b/src/ui/flutter_app/lib/l10n/intl_mk.arb @@ -1477,5 +1477,9 @@ "liquid": "Течност", "@liquid": {}, "wood": "Дрво", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анимациски ефект при поставување на фигура", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анимациски ефект при отстранување на фигура", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ms.arb b/src/ui/flutter_app/lib/l10n/intl_ms.arb index a80b1561b..191efb742 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ms.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ms.arb @@ -1477,5 +1477,9 @@ "liquid": "Cecair", "@liquid": {}, "wood": "Kayu", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efek animasi meletakkan buah", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efek animasi mengeluarkan buah", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_my.arb b/src/ui/flutter_app/lib/l10n/intl_my.arb index 89593cb7f..e937238d3 100644 --- a/src/ui/flutter_app/lib/l10n/intl_my.arb +++ b/src/ui/flutter_app/lib/l10n/intl_my.arb @@ -1575,5 +1575,9 @@ "liquid": "ရည်", "@liquid": {}, "wood": "သစ်သား", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "သားကိုထားရာတွင် အန်နိမေးရှင်း အကျိုးသက်ရောက်မှု", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "သားကိုဖယ်ရှားရာတွင် အန်နိမေးရှင်း အကျိုးသက်ရောက်မှု", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_nb.arb b/src/ui/flutter_app/lib/l10n/intl_nb.arb index 5445707a2..97a758c72 100644 --- a/src/ui/flutter_app/lib/l10n/intl_nb.arb +++ b/src/ui/flutter_app/lib/l10n/intl_nb.arb @@ -1477,5 +1477,9 @@ "liquid": "Væske", "@liquid": {}, "wood": "Tre", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animasjonseffekt ved plassering av brikke", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animasjonseffekt ved fjerning av brikke", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_nl.arb b/src/ui/flutter_app/lib/l10n/intl_nl.arb index de87a717c..1724f32f2 100644 --- a/src/ui/flutter_app/lib/l10n/intl_nl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_nl.arb @@ -1477,5 +1477,9 @@ "liquid": "Vloeistof", "@liquid": {}, "wood": "Hout", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animatie-effect bij plaatsen van stuk", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animatie-effect bij verwijderen van stuk", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_pl.arb b/src/ui/flutter_app/lib/l10n/intl_pl.arb index 716bd8afd..d70f0690a 100644 --- a/src/ui/flutter_app/lib/l10n/intl_pl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_pl.arb @@ -1477,5 +1477,9 @@ "liquid": "Płyn", "@liquid": {}, "wood": "Drewno", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efekt animacji przy stawianiu pionka", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efekt animacji przy usuwaniu pionka", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_pt.arb b/src/ui/flutter_app/lib/l10n/intl_pt.arb index 81cb76e85..8e12deec5 100644 --- a/src/ui/flutter_app/lib/l10n/intl_pt.arb +++ b/src/ui/flutter_app/lib/l10n/intl_pt.arb @@ -1477,5 +1477,9 @@ "liquid": "Líquido", "@liquid": {}, "wood": "Madeira", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efeito de animação ao colocar peça", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efeito de animação ao remover peça", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ro.arb b/src/ui/flutter_app/lib/l10n/intl_ro.arb index 87287cf93..86965da7c 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ro.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ro.arb @@ -1477,5 +1477,9 @@ "liquid": "Lichid", "@liquid": {}, "wood": "Lemn", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efect de animație la plasarea piesei", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efect de animație la eliminarea piesei", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ru.arb b/src/ui/flutter_app/lib/l10n/intl_ru.arb index c652679a1..fb3e15120 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ru.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ru.arb @@ -1477,5 +1477,9 @@ "liquid": "Жидкость", "@liquid": {}, "wood": "Дерево", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анимационный эффект при размещении фигуры", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анимационный эффект при удалении фигуры", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_si.arb b/src/ui/flutter_app/lib/l10n/intl_si.arb index ce52456ca..9e957f456 100644 --- a/src/ui/flutter_app/lib/l10n/intl_si.arb +++ b/src/ui/flutter_app/lib/l10n/intl_si.arb @@ -1575,5 +1575,9 @@ "liquid": "ද්‍රවය", "@liquid": {}, "wood": "මුද", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "කිවිය තබා ඇති ඇනිමේෂන් බලපෑම", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "කිවිය ඉවත් කිරීමේ ඇනිමේෂන් බලපෑම", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sk.arb b/src/ui/flutter_app/lib/l10n/intl_sk.arb index b55898adf..eb140120d 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sk.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sk.arb @@ -1477,5 +1477,9 @@ "liquid": "Tekutina", "@liquid": {}, "wood": "Drevo", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animovaný efekt pri umiestnení figúrky", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animovaný efekt pri odstránení figúrky", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sl.arb b/src/ui/flutter_app/lib/l10n/intl_sl.arb index 7f9c67f5a..51babac31 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sl.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sl.arb @@ -1477,5 +1477,9 @@ "liquid": "Tekočina", "@liquid": {}, "wood": "Les", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animacijski učinek pri postavitvi figure", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animacijski učinek pri odstranitvi figure", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sq.arb b/src/ui/flutter_app/lib/l10n/intl_sq.arb index b86daa124..ead3d81f6 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sq.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sq.arb @@ -1477,5 +1477,9 @@ "liquid": "Lëng", "@liquid": {}, "wood": "Druri", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Efekti i animacionit të vendosjes së figurës", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Efekti i animacionit të heqjes së figurës", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sr.arb b/src/ui/flutter_app/lib/l10n/intl_sr.arb index 1d8669618..d8144700f 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sr.arb @@ -1477,5 +1477,9 @@ "liquid": "Tečnost", "@liquid": {}, "wood": "Drvo", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анимациони ефекат постављања фигуре", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анимациони ефекат уклањања фигуре", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sv.arb b/src/ui/flutter_app/lib/l10n/intl_sv.arb index 8b23a2673..1456c02b4 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sv.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sv.arb @@ -1477,5 +1477,9 @@ "liquid": "Vätska", "@liquid": {}, "wood": "Trä", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Animeringseffekt vid placering av pjäs", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Animeringseffekt vid borttagning av pjäs", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_sw.arb b/src/ui/flutter_app/lib/l10n/intl_sw.arb index b58d9fb35..9f8875def 100644 --- a/src/ui/flutter_app/lib/l10n/intl_sw.arb +++ b/src/ui/flutter_app/lib/l10n/intl_sw.arb @@ -1575,5 +1575,9 @@ "liquid": "Kiasi", "@liquid": {}, "wood": "Mbao", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Athari ya uhuishaji wa kuweka kipande", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Athari ya uhuishaji wa kuondoa kipande", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_te.arb b/src/ui/flutter_app/lib/l10n/intl_te.arb index aceca7af9..a5a56cc90 100644 --- a/src/ui/flutter_app/lib/l10n/intl_te.arb +++ b/src/ui/flutter_app/lib/l10n/intl_te.arb @@ -1477,5 +1477,9 @@ "liquid": "ద్రవం", "@liquid": {}, "wood": "మొక్క", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "గేమ్ భాగాన్ని ఉంచే యానిమేషన్ ప్రభావం", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "గేమ్ భాగాన్ని తొలగించే యానిమేషన్ ప్రభావం", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_th.arb b/src/ui/flutter_app/lib/l10n/intl_th.arb index 316c313d7..1d2533991 100644 --- a/src/ui/flutter_app/lib/l10n/intl_th.arb +++ b/src/ui/flutter_app/lib/l10n/intl_th.arb @@ -1477,5 +1477,9 @@ "liquid": "ของเหลว", "@liquid": {}, "wood": "ไม้", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "เอฟเฟกต์แอนิเมชันการวางตัวหมาก", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "เอฟเฟกต์แอนิเมชันการลบตัวหมาก", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_tr.arb b/src/ui/flutter_app/lib/l10n/intl_tr.arb index fbd324fd8..f525457e9 100644 --- a/src/ui/flutter_app/lib/l10n/intl_tr.arb +++ b/src/ui/flutter_app/lib/l10n/intl_tr.arb @@ -1477,5 +1477,9 @@ "liquid": "Sıvı", "@liquid": {}, "wood": "Odun", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Taş yerleştirme animasyon efekti", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Taş kaldırma animasyon efekti", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_uk.arb b/src/ui/flutter_app/lib/l10n/intl_uk.arb index 91ef36ba2..524dbba50 100644 --- a/src/ui/flutter_app/lib/l10n/intl_uk.arb +++ b/src/ui/flutter_app/lib/l10n/intl_uk.arb @@ -1575,5 +1575,9 @@ "liquid": "Рідина", "@liquid": {}, "wood": "Дерево", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Анімаційний ефект розміщення фігури", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Анімаційний ефект видалення фігури", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_ur.arb b/src/ui/flutter_app/lib/l10n/intl_ur.arb index 75b32bf33..16f0e4026 100644 --- a/src/ui/flutter_app/lib/l10n/intl_ur.arb +++ b/src/ui/flutter_app/lib/l10n/intl_ur.arb @@ -1575,5 +1575,9 @@ "liquid": "سیال", "@liquid": {}, "wood": "لکڑی", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "مہرا رکھنے کا متحرک اثر", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "مہرا ہٹانے کا متحرک اثر", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_uz.arb b/src/ui/flutter_app/lib/l10n/intl_uz.arb index d00a919d6..5915a30f7 100644 --- a/src/ui/flutter_app/lib/l10n/intl_uz.arb +++ b/src/ui/flutter_app/lib/l10n/intl_uz.arb @@ -1477,5 +1477,9 @@ "liquid": "Suyuqlik", "@liquid": {}, "wood": "Yog'och", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Figurani joylashtirish animatsion effekti", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Figurani olib tashlash animatsion effekti", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_vi.arb b/src/ui/flutter_app/lib/l10n/intl_vi.arb index 251cf9570..dd2aea1c3 100644 --- a/src/ui/flutter_app/lib/l10n/intl_vi.arb +++ b/src/ui/flutter_app/lib/l10n/intl_vi.arb @@ -1575,5 +1575,9 @@ "liquid": "Chất lỏng", "@liquid": {}, "wood": "Gỗ", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Hiệu ứng hoạt hình đặt quân cờ", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Hiệu ứng hoạt hình loại bỏ quân cờ", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_zh.arb b/src/ui/flutter_app/lib/l10n/intl_zh.arb index 29385b78d..0070c11c6 100644 --- a/src/ui/flutter_app/lib/l10n/intl_zh.arb +++ b/src/ui/flutter_app/lib/l10n/intl_zh.arb @@ -1477,5 +1477,9 @@ "liquid": "水", "@liquid": {}, "wood": "木", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "摆子的动画效果", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "吃子的动画效果", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb b/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb index 684e31a9b..7d552b4ba 100644 --- a/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb +++ b/src/ui/flutter_app/lib/l10n/intl_zh_Hant.arb @@ -1477,5 +1477,9 @@ "liquid": "水", "@liquid": {}, "wood": "木", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "擺子的動畫效果", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "吃子的動畫效果", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/intl_zu.arb b/src/ui/flutter_app/lib/l10n/intl_zu.arb index 17b0dbb1c..94599aac5 100644 --- a/src/ui/flutter_app/lib/l10n/intl_zu.arb +++ b/src/ui/flutter_app/lib/l10n/intl_zu.arb @@ -1575,5 +1575,9 @@ "liquid": "Uchwepheshe", "@liquid": {}, "wood": "Izinkuni", - "@wood": {} + "@wood": {}, + "placeEffectAnimation": "Umphumela we-animation wokubeka ucezu", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Umphumela we-animation wokususa ucezu", + "@removeEffectAnimation": {} } diff --git a/src/ui/flutter_app/lib/l10n/prompt.txt b/src/ui/flutter_app/lib/l10n/prompt.txt index c116d55cc..9bce88d85 100644 --- a/src/ui/flutter_app/lib/l10n/prompt.txt +++ b/src/ui/flutter_app/lib/l10n/prompt.txt @@ -1,14 +1,10 @@ Please translate the following contents of the arb file, output the complete arb file directly: ```json -"soundTheme": "Sound theme", -"@soundTheme": {}, -"ball": "Ball", -"@ball": {}, -"liquid": "Liquid", -"@liquid": {}, -"wood": "Wood", -"@wood": {}, +"placeEffectAnimation": "Piece placing animation effect", +"@placeEffectAnimation": {}, +"removeEffectAnimation": "Piece removing animation effect", +"@removeEffectAnimation": {} ``` into: @@ -80,23 +76,16 @@ The corresponding content. The format is as follows: ```json // intl_en.arb - "soundTheme": "Sound theme", - "@soundTheme": {}, - "ball": "Ball", - "@ball": {}, - "liquid": "Liquid", - "@liquid": {}, - "wood": "Wood", - "@wood": {}, + "placeEffectAnimation": "Piece placing animation effect", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "Piece removing animation effect", + "@removeEffectAnimation": {} + // intl_zh.arb - "soundTheme": "声音主题", - "@soundTheme": {}, - "ball": "球", - "@ball": {}, - "liquid": "水", - "@liquid": {}, - "wood": "木", - "@wood": {}, + "placeEffectAnimation": "摆子的动画效果", + "@placeEffectAnimation": {}, + "removeEffectAnimation": "吃子的动画效果", + "@removeEffectAnimation": {} ```