@@ -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),
|
||||
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user