shitman/lib/game/components/level_components.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

77 lines
No EOL
2.1 KiB
Dart

import 'package:flame/components.dart';
import 'package:flutter/material.dart';
import 'package:shitman/game/components/base.dart';
/// Base class for all level building block components
abstract class LevelComponent extends DecorativeShit with Stationary {
Vector2 gridPosition;
LevelComponent({required this.gridPosition}) {
size = Vector2.all(80.0);
}
/// Convert grid position to world position
Vector2 getWorldPosition(double cellSize) {
return Vector2(gridPosition.x * cellSize, gridPosition.y * cellSize);
}
}
/// Base class for road components
abstract class RoadComponent extends LevelComponent {
static const double roadWidth = 60.0;
RoadComponent({required super.gridPosition});
@override
void render(Canvas canvas) {
final roadPaint = Paint()..color = const Color(0xFF333333);
canvas.drawRect(size.toRect(), roadPaint);
// Draw road markings
final markingPaint = Paint()
..color = const Color(0xFFFFFFFF)
..strokeWidth = 2.0;
renderRoadMarkings(canvas, markingPaint);
}
/// Override in subclasses to render specific road markings
void renderRoadMarkings(Canvas canvas, Paint paint);
@override
Future<void> reset() async {
// Default implementation for road components
}
}
/// Base class for structure components (houses, etc.)
abstract class StructureComponent extends LevelComponent {
StructureComponent({required super.gridPosition});
@override
Future<void> reset() async {
// Default implementation for structure components
}
}
/// Base class for security components
abstract class SecurityComponent extends InteractiveShit {
double detectionRange;
bool isActive;
SecurityComponent({
required Vector2 position,
required this.detectionRange,
this.isActive = true,
}) {
this.position = position;
}
/// Check if player is detected by this security component
bool detectsPlayer(Vector2 playerPosition, double playerStealthLevel);
/// Get the detection radius considering stealth
double getEffectiveDetectionRange(double playerStealthLevel) {
return detectionRange * (1.0 - playerStealthLevel);
}
}