Add shareware support and spawn correctly for difficulty levels

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-14 17:01:01 +01:00
parent 690ac1e7e6
commit 278c73a256
19 changed files with 383 additions and 238 deletions

View File

@@ -23,14 +23,14 @@ import 'package:wolf_dart/sprite_gallery.dart';
class WolfRenderer extends StatefulWidget {
const WolfRenderer({
super.key,
required this.difficulty,
this.difficulty = Difficulty.bringEmOn,
this.showSpriteGallery = false,
this.isDemo = true,
this.isShareware = true,
});
final Difficulty difficulty;
final bool showSpriteGallery;
final bool isDemo;
final bool isShareware;
@override
State<WolfRenderer> createState() => _WolfRendererState();
@@ -60,11 +60,13 @@ class _WolfRendererState extends State<WolfRenderer>
@override
void initState() {
super.initState();
_initGame(demo: widget.isDemo);
_initGame(widget.isShareware);
}
Future<void> _initGame({bool demo = true}) async {
gameMap = demo ? await WolfMap.loadDemo() : await WolfMap.load();
Future<void> _initGame(bool isShareware) async {
gameMap = isShareware
? await WolfMap.loadShareware()
: await WolfMap.loadRetail();
currentLevel = gameMap.levels[0].wallGrid;
doorManager.initDoors(currentLevel);
@@ -77,30 +79,35 @@ class _WolfRendererState extends State<WolfRenderer>
for (int x = 0; x < 64; x++) {
int objId = objectLevel[y][x];
if (objId >= MapObjectId.playerNorth &&
objId <= MapObjectId.playerWest) {
if (!MapObject.shouldSpawn(objId, widget.difficulty)) continue;
if (objId >= MapObject.playerNorth && objId <= MapObject.playerWest) {
double spawnAngle = 0.0;
switch (objId) {
case MapObjectId.playerNorth:
case MapObject.playerNorth:
spawnAngle = 3 * math.pi / 2;
break;
case MapObjectId.playerEast:
case MapObject.playerEast:
spawnAngle = 0.0;
break;
case MapObjectId.playerSouth:
case MapObject.playerSouth:
spawnAngle = math.pi / 2;
break;
case MapObjectId.playerWest:
case MapObject.playerWest:
spawnAngle = math.pi;
break;
}
player = Player(x: x + 0.5, y: y + 0.5, angle: spawnAngle);
player = Player(
x: x + 0.5,
y: y + 0.5,
angle: spawnAngle,
);
} else {
Entity? newEntity = EntityRegistry.spawn(
objId,
x + 0.5,
y + 0.5,
widget.difficulty.level,
widget.difficulty,
gameMap.sprites.length,
);
@@ -342,10 +349,10 @@ class _WolfRendererState extends State<WolfRenderer>
// Map ID 44 is usually the Ammo Clip in the Object Grid/Registry
Entity? droppedAmmo = EntityRegistry.spawn(
MapObjectId.ammoClip,
MapObject.ammoClip,
entity.x,
entity.y,
widget.difficulty.level,
widget.difficulty,
gameMap.sprites.length,
);
@@ -436,28 +443,17 @@ class _WolfRendererState extends State<WolfRenderer>
right: 0,
child: Center(
child: Transform.translate(
offset: Offset(
// Replaced hidden step variables with a direct intention check!
(inputManager.isMovingForward ||
inputManager.isMovingBackward)
? math.sin(
DateTime.now()
.millisecondsSinceEpoch /
100,
) *
12
: 0,
player.weaponAnimOffset,
),
offset: Offset(0, player.weaponAnimOffset),
child: SizedBox(
width: 500,
height: 500,
child: CustomPaint(
painter: WeaponPainter(
sprite:
gameMap.sprites[player
.currentWeapon
.currentSprite],
gameMap.sprites[player.currentWeapon
.getCurrentSpriteIndex(
gameMap.sprites.length,
)],
),
),
),