Move doors to door manager

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-14 00:34:09 +01:00
parent 09c28028ad
commit 5c9dafbbdf
4 changed files with 126 additions and 37 deletions

View File

@@ -6,6 +6,7 @@ import 'package:wolf_dart/classes/linear_coordinates.dart';
import 'package:wolf_dart/classes/matrix.dart';
import 'package:wolf_dart/features/difficulty/difficulty.dart';
import 'package:wolf_dart/features/entities/collectible.dart';
import 'package:wolf_dart/features/entities/door_manager.dart';
import 'package:wolf_dart/features/entities/enemies/enemy.dart';
import 'package:wolf_dart/features/entities/entity.dart';
import 'package:wolf_dart/features/entities/entity_registry.dart';
@@ -36,6 +37,8 @@ class WolfRenderer extends StatefulWidget {
class _WolfRendererState extends State<WolfRenderer>
with SingleTickerProviderStateMixin {
final InputManager inputManager = InputManager();
final DoorManager doorManager = DoorManager();
late Ticker _gameLoop;
final FocusNode _focusNode = FocusNode();
late WolfMap gameMap;
@@ -51,9 +54,6 @@ class _WolfRendererState extends State<WolfRenderer>
List<Entity> entities = [];
Map<String, double> doorOffsets = {};
Map<String, int> doorStates = {};
@override
void initState() {
super.initState();
@@ -64,6 +64,8 @@ class _WolfRendererState extends State<WolfRenderer>
gameMap = demo ? await WolfMap.loadDemo() : await WolfMap.load();
currentLevel = gameMap.levels[0].wallGrid;
doorManager.initDoors(currentLevel);
final Matrix<int> objectLevel = gameMap.levels[0].objectGrid;
for (int y = 0; y < 64; y++) {
@@ -170,10 +172,7 @@ class _WolfRendererState extends State<WolfRenderer>
bool _isWalkable(int x, int y) {
if (currentLevel[y][x] == 0) return true;
if (currentLevel[y][x] >= 90) {
String key = '$x,$y';
if (doorOffsets[key] != null && doorOffsets[key]! > 0.7) {
return true;
}
return doorManager.isDoorOpenEnough(x, y);
}
return false;
}
@@ -183,9 +182,10 @@ class _WolfRendererState extends State<WolfRenderer>
// 1. Process intentions and receive movement vectors
final movement = _processInputs(elapsed);
doorManager.update(elapsed);
// 2. Explicit State Updates
player.updateWeaponSwitch();
_updateDoors();
_applyMovementAndCollision(movement.dx, movement.dy);
_updateEntities(elapsed);
@@ -241,37 +241,16 @@ class _WolfRendererState extends State<WolfRenderer>
if (player.angle > 2 * math.pi) player.angle -= 2 * math.pi;
if (inputManager.isInteracting) {
int targetX = (player.x + math.cos(player.angle)).toInt();
int targetY = (player.y + math.sin(player.angle)).toInt();
if (targetY > 0 &&
targetY < currentLevel.length &&
targetX > 0 &&
targetX < currentLevel[0].length) {
if (currentLevel[targetY][targetX] >= 90) {
String key = '$targetX,$targetY';
if (!doorStates.containsKey(key) || doorStates[key] == 0) {
doorStates[key] = 1;
}
}
}
doorManager.handleInteraction(
player.x,
player.y,
player.angle,
);
}
return (dx: dx, dy: dy);
}
void _updateDoors() {
doorStates.forEach((key, state) {
if (state == 1) {
doorOffsets[key] = (doorOffsets[key] ?? 0.0) + 0.02;
if (doorOffsets[key]! >= 1.0) {
doorOffsets[key] = 1.0;
doorStates[key] = 2;
}
}
});
}
// Now receives dx and dy explicitly
void _applyMovementAndCollision(double dx, double dy) {
const double margin = 0.3;
@@ -364,7 +343,7 @@ class _WolfRendererState extends State<WolfRenderer>
textures: gameMap.textures,
player: player,
fov: fov,
doorOffsets: doorOffsets,
doorOffsets: doorManager.getOffsetsForRenderer(),
entities: entities,
sprites: gameMap.sprites,
),