shitman/lib/game/levels/shit_level.dart
zeyus 67aaa9589f
All checks were successful
/ build-web (push) Successful in 4m5s
updated level...player can now "complete" (no ui)
2025-07-27 17:41:51 +02:00

124 lines
3.4 KiB
Dart

import 'package:flame/components.dart';
import 'package:shitman/attributes/resetable.dart';
import 'package:shitman/game/shitman_game.dart';
import 'package:shitman/game/components/base.dart';
import 'package:shitman/game/components/player.dart';
import 'package:shitman/services/log_service.dart';
import 'package:shitman/settings/app_settings.dart';
class ShitLevel extends PositionComponent
with HasGameReference<ShitmanGame>, Resetable, AppLogging, AppSettings {
/// Base class for game levels.
/// This can be extended to create specific levels with unique layouts
String levelName;
int difficulty;
bool _isActive = false;
// Core game components
late Player player;
ShitLevel({required this.levelName, this.difficulty = 1});
/// Whether the level is currently active
bool get isActive => _isActive;
@override
Future<void> onLoad() async {
await super.onLoad();
await initSettings();
// Initialize level-specific components
await initializeLevelComponents();
appLog.fine('Level loaded: $levelName (difficulty: $difficulty)');
}
/// Initialize the core components for this level
Future<void> initializeLevelComponents() async {
appLog.fine('Initializing level components for $levelName');
// Create player
player = Player();
add(player);
// Setup camera to follow player if game reference is available
try {
game.camera.follow(player);
} catch (e) {
appLog.warning('Unable to setup camera following: $e');
}
appLog.fine('Level components initialized');
}
/// Start the level gameplay
Future<void> startLevel() async {
if (_isActive) return;
_isActive = true;
appLog.info('Starting level: $levelName');
// Any level-specific start logic can be added here
await onLevelStart();
}
/// End the level gameplay
Future<void> endLevel() async {
if (!_isActive) return;
_isActive = false;
appLog.info('Ending level: $levelName');
// Any level-specific end logic can be added here
await onLevelEnd();
}
/// Override this method in subclasses for custom start logic
Future<void> onLevelStart() async {
// Default implementation does nothing
}
/// Override this method in subclasses for custom end logic
Future<void> onLevelEnd() async {
// Default implementation does nothing
}
/// Get all components in this level that implement Resetable
List<Resetable> getResetableComponents() {
return children.whereType<Resetable>().toList();
}
/// Get all ShitComponents in this level
List<ShitComponent> getAllShitComponents() {
return children.whereType<ShitComponent>().toList();
}
/// Reset all components in this level
Future<void> resetAllComponents() async {
appLog.fine('Resetting all components in level: $levelName');
final resetableComponents = getResetableComponents();
for (final component in resetableComponents) {
await component.reset();
}
}
@override
Future<void> reset() async {
appLog.fine('Resetting level: $levelName');
_isActive = false;
// Reset all child components first
await resetAllComponents();
// Override in subclasses for additional reset logic
await onLevelReset();
}
/// Override this method in subclasses for custom reset logic
Future<void> onLevelReset() async {
// Default implementation does nothing
}
}