Can now open secret walls and pick up machine gun
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -10,6 +10,7 @@ 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';
|
||||
import 'package:wolf_dart/features/entities/pushwall_manager.dart';
|
||||
import 'package:wolf_dart/features/input/input_manager.dart';
|
||||
import 'package:wolf_dart/features/map/wolf_map.dart';
|
||||
import 'package:wolf_dart/features/player/player.dart';
|
||||
@@ -38,6 +39,7 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final InputManager inputManager = InputManager();
|
||||
final DoorManager doorManager = DoorManager();
|
||||
final PushwallManager pushwallManager = PushwallManager();
|
||||
|
||||
late Ticker _gameLoop;
|
||||
final FocusNode _focusNode = FocusNode();
|
||||
@@ -68,6 +70,8 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
|
||||
final Matrix<int> objectLevel = gameMap.levels[0].objectGrid;
|
||||
|
||||
pushwallManager.initPushwalls(currentLevel, objectLevel);
|
||||
|
||||
for (int y = 0; y < 64; y++) {
|
||||
for (int x = 0; x < 64; x++) {
|
||||
int objId = objectLevel[y][x];
|
||||
@@ -180,6 +184,7 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
final inputResult = _processInputs(elapsed);
|
||||
|
||||
doorManager.update(elapsed);
|
||||
pushwallManager.update(elapsed, currentLevel);
|
||||
|
||||
// 2. Explicit State Updates
|
||||
player.updateWeaponSwitch();
|
||||
@@ -214,11 +219,6 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
setState(() {});
|
||||
}
|
||||
|
||||
void _takeDamage(int damage) {
|
||||
player.takeDamage(damage);
|
||||
damageFlashOpacity = 0.5;
|
||||
}
|
||||
|
||||
// Returns a Record containing both movement delta and rotation delta
|
||||
({Coordinate2D movement, double dAngle}) _processInputs(Duration elapsed) {
|
||||
inputManager.update();
|
||||
@@ -235,6 +235,8 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
|
||||
if (inputManager.isFiring) {
|
||||
player.fire(elapsed.inMilliseconds);
|
||||
} else {
|
||||
player.releaseTrigger();
|
||||
}
|
||||
|
||||
// Calculate intended rotation
|
||||
@@ -260,6 +262,12 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
player.y,
|
||||
player.angle,
|
||||
);
|
||||
pushwallManager.handleInteraction(
|
||||
player.x,
|
||||
player.y,
|
||||
player.angle,
|
||||
currentLevel,
|
||||
);
|
||||
}
|
||||
|
||||
return (movement: movement, dAngle: dAngle);
|
||||
@@ -301,37 +309,50 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
return Coordinate2D(newX, newY);
|
||||
}
|
||||
|
||||
// renderer.dart
|
||||
void _updateEntities(Duration elapsed) {
|
||||
List<Entity> itemsToRemove = [];
|
||||
List<Entity> itemsToAdd = []; // NEW: Buffer for dropped items
|
||||
|
||||
for (Entity entity in entities) {
|
||||
if (entity is Enemy) {
|
||||
// 1. Get Intent
|
||||
// 1. Get Intent (Now passing tryOpenDoor!)
|
||||
final intent = entity.update(
|
||||
elapsedMs: elapsed.inMilliseconds,
|
||||
playerPosition: player.position,
|
||||
isWalkable: _isWalkable,
|
||||
onDamagePlayer: _takeDamage,
|
||||
tryOpenDoor: doorManager.tryOpenDoor,
|
||||
onDamagePlayer: (int damage) {
|
||||
player.takeDamage(damage);
|
||||
damageFlashOpacity = 0.5;
|
||||
},
|
||||
);
|
||||
|
||||
// 2. Update Angle
|
||||
entity.angle = intent.newAngle;
|
||||
|
||||
// 3. Resolve Movement & Collision
|
||||
// We reuse the same logic we used for the player!
|
||||
Coordinate2D validatedPos = _calculateValidatedPosition(
|
||||
entity.position,
|
||||
intent.movement,
|
||||
);
|
||||
// 3. Resolve Movement
|
||||
// We NO LONGER use _calculateValidatedPosition here!
|
||||
// The enemy's internal getValidMovement already did the math perfectly.
|
||||
entity.x += intent.movement.x;
|
||||
entity.y += intent.movement.y;
|
||||
|
||||
entity.position = validatedPos;
|
||||
// 4. Handle Item Drops & Score (Matches KillActor in C code)
|
||||
// Check if they just died this exact frame
|
||||
if (entity.state == EntityState.dead &&
|
||||
entity.isDying &&
|
||||
!entity.hasDroppedItem) {
|
||||
entity.hasDroppedItem = true; // Make sure we only drop once!
|
||||
|
||||
// 4. Handle Attacking (if the enemy logic decides to)
|
||||
// You can move 'onDamagePlayer' calls into the enemy's
|
||||
// internal state check here if preferred.
|
||||
// You will need to add a `bool hasDroppedItem = false;` to your base Enemy class.
|
||||
|
||||
if (entity.runtimeType.toString() == 'BrownGuard') {
|
||||
// Example: Spawn an ammo clip where the guard died
|
||||
// itemsToAdd.add(Collectible(x: entity.x, y: entity.y, type: CollectibleType.ammoClip));
|
||||
} else if (entity.runtimeType.toString() == 'Dog') {
|
||||
// Dogs don't drop items, but maybe they give different points!
|
||||
}
|
||||
}
|
||||
} else if (entity is Collectible) {
|
||||
// Collectible pickup logic remains the same
|
||||
if (player.position.distanceTo(entity.position) < 0.5) {
|
||||
if (player.tryPickup(entity)) {
|
||||
itemsToRemove.add(entity);
|
||||
@@ -340,9 +361,13 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up dead items and add new drops
|
||||
if (itemsToRemove.isNotEmpty) {
|
||||
entities.removeWhere((e) => itemsToRemove.contains(e));
|
||||
}
|
||||
if (itemsToAdd.isNotEmpty) {
|
||||
entities.addAll(itemsToAdd);
|
||||
}
|
||||
}
|
||||
|
||||
// Takes an input and returns a value instead of implicitly changing state
|
||||
@@ -392,6 +417,7 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
doorOffsets: doorManager.getOffsetsForRenderer(),
|
||||
entities: entities,
|
||||
sprites: gameMap.sprites,
|
||||
activePushwall: pushwallManager.activePushwall,
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
|
||||
Reference in New Issue
Block a user