Slowly fixing enemies

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-15 19:36:37 +01:00
parent 0eebf8e4fa
commit 301218a01b
5 changed files with 35 additions and 72 deletions

View File

@@ -186,7 +186,6 @@ abstract class Enemy extends Entity {
required void Function(int damage) onDamagePlayer,
});
/// Centralized factory to handle all enemy spawning logic
static Enemy? spawn(
int objId,
double x,
@@ -194,6 +193,7 @@ abstract class Enemy extends Entity {
Difficulty difficulty, {
bool isSharewareMode = false,
}) {
// 124 (Dead Guard) famously overwrote a patrol ID in the original engine!
if (objId == MapObject.deadGuard || objId == MapObject.deadAardwolf) {
return null;
}
@@ -206,23 +206,20 @@ abstract class Enemy extends Entity {
final mapData = type.mapData;
// 1. Validate Difficulty and Determine State
// ALL enemies have explicit directional angles!
double spawnAngle = CardinalDirection.fromEnemyIndex(objId).radians;
EntityState spawnState;
double spawnAngle = 0.0;
if (mapData.isPatrolForDifficulty(objId, difficulty)) {
spawnState = EntityState.patrolling;
spawnAngle = CardinalDirection.fromEnemyIndex(objId).radians;
} else if (mapData.isStaticForDifficulty(objId, difficulty)) {
spawnState = EntityState.idle; // Faces the player dynamically later
spawnState = EntityState.idle;
} else if (mapData.isAmbushForDifficulty(objId, difficulty)) {
spawnState = EntityState.ambush; // Stays perfectly still until alerted
spawnState = EntityState.ambush;
} else {
// If the ID belongs to this enemy but NOT this difficulty, skip spawning!
return null;
return null; // ID belongs to this enemy, but not on this difficulty
}
// 2. Return the instance
return switch (type) {
EnemyType.guard => Guard(x: x, y: y, angle: spawnAngle, mapId: objId),
EnemyType.dog => Dog(x: x, y: y, angle: spawnAngle, mapId: objId),

View File

@@ -45,7 +45,7 @@ class EnemyAnimationMap {
enum EnemyType {
guard(
mapData: EnemyMapData(baseStaticId: 23, basePatrolId: 108),
mapData: EnemyMapData(108),
animations: EnemyAnimationMap(
idle: SpriteFrameRange(50, 57),
walking: SpriteFrameRange(58, 89),
@@ -56,22 +56,18 @@ enum EnemyType {
),
),
dog(
mapData: EnemyMapData(baseStaticId: 26, basePatrolId: 126),
// Translated from your old offset logic so the game doesn't break
mapData: EnemyMapData(216),
animations: EnemyAnimationMap(
idle: SpriteFrameRange(99, 106),
walking: SpriteFrameRange(107, 130),
attacking: SpriteFrameRange(131, 133),
pain: SpriteFrameRange(
131,
131,
), // Dog shared pain/attack frame in old code
pain: SpriteFrameRange(131, 131),
dying: SpriteFrameRange(134, 136),
dead: SpriteFrameRange(137, 137),
),
),
ss(
mapData: EnemyMapData(baseStaticId: 29, basePatrolId: 144),
mapData: EnemyMapData(180),
animations: EnemyAnimationMap(
idle: SpriteFrameRange(138, 145),
walking: SpriteFrameRange(146, 177),
@@ -82,7 +78,7 @@ enum EnemyType {
),
),
mutant(
mapData: EnemyMapData(baseStaticId: 32, basePatrolId: 162),
mapData: EnemyMapData(252),
animations: EnemyAnimationMap(
idle: SpriteFrameRange(187, 194),
walking: SpriteFrameRange(195, 226),
@@ -93,7 +89,7 @@ enum EnemyType {
),
),
officer(
mapData: EnemyMapData(baseStaticId: 35, basePatrolId: 180),
mapData: EnemyMapData(144),
animations: EnemyAnimationMap(
idle: SpriteFrameRange(238, 245),
walking: SpriteFrameRange(246, 277),