fifty_achievement_engine 0.1.1
fifty_achievement_engine: ^0.1.1 copied to clipboard
Achievement system for Flutter games with condition-based unlocks, progress tracking, and FDL-compliant UI.
example/lib/main.dart
import 'package:fifty_tokens/fifty_tokens.dart';
import 'package:flutter/material.dart';
import 'examples/basic_achievements.dart';
import 'examples/rpg_achievements.dart';
import 'examples/fitness_achievements.dart';
void main() {
runApp(const AchievementEngineExampleApp());
}
/// Example app demonstrating fifty_achievement_engine features.
class AchievementEngineExampleApp extends StatelessWidget {
const AchievementEngineExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Achievement Engine Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
colorScheme: ColorScheme.dark(
primary: FiftyColors.burgundy,
surface: FiftyColors.darkBurgundy,
onSurface: FiftyColors.cream,
outline: FiftyColors.borderDark,
surfaceContainerHighest: FiftyColors.surfaceDark,
),
scaffoldBackgroundColor: FiftyColors.darkBurgundy,
appBarTheme: AppBarTheme(
backgroundColor: FiftyColors.surfaceDark,
foregroundColor: FiftyColors.cream,
elevation: 0,
),
),
home: const ExampleLauncher(),
);
}
}
/// Launcher screen for selecting different examples.
class ExampleLauncher extends StatelessWidget {
const ExampleLauncher({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Achievement Engine Examples'),
),
body: ListView(
padding: const EdgeInsets.all(FiftySpacing.md),
children: [
_buildExampleTile(
context,
title: 'Basic Achievements',
subtitle: 'Simple event and count-based achievements',
icon: Icons.star_outline,
builder: (context) => const BasicAchievementsExample(),
),
const SizedBox(height: FiftySpacing.md),
_buildExampleTile(
context,
title: 'RPG Achievements',
subtitle: 'Combat, leveling, and quest achievements',
icon: Icons.sports_esports,
builder: (context) => const RpgAchievementsExample(),
),
const SizedBox(height: FiftySpacing.md),
_buildExampleTile(
context,
title: 'Fitness Achievements',
subtitle: 'Workout tracking with time and stat conditions',
icon: Icons.fitness_center,
builder: (context) => const FitnessAchievementsExample(),
),
],
),
);
}
Widget _buildExampleTile(
BuildContext context, {
required String title,
required String subtitle,
required IconData icon,
required WidgetBuilder builder,
}) {
final colorScheme = Theme.of(context).colorScheme;
return Card(
color: colorScheme.surfaceContainerHighest,
shape: RoundedRectangleBorder(
borderRadius: FiftyRadii.lgRadius,
side: BorderSide(color: colorScheme.outline),
),
child: ListTile(
contentPadding: const EdgeInsets.all(FiftySpacing.md),
leading: Container(
width: 48,
height: 48,
decoration: BoxDecoration(
color: colorScheme.primary.withValues(alpha: 0.2),
borderRadius: FiftyRadii.mdRadius,
),
child: Icon(
icon,
color: colorScheme.primary,
),
),
title: Text(
title,
style: TextStyle(
fontFamily: FiftyTypography.fontFamily,
fontWeight: FiftyTypography.bold,
color: colorScheme.onSurface,
),
),
subtitle: Text(
subtitle,
style: TextStyle(
fontFamily: FiftyTypography.fontFamily,
color: colorScheme.onSurface.withValues(alpha: 0.7),
),
),
trailing: Icon(
Icons.chevron_right,
color: colorScheme.onSurface.withValues(alpha: 0.5),
),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute(builder: builder),
);
},
),
);
}
}