Add shareware support and spawn correctly for difficulty levels
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -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,
|
||||
)],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:wolf_dart/classes/sprite.dart';
|
||||
import 'package:wolf_dart/features/renderer/color_palette.dart';
|
||||
|
||||
class WeaponPainter extends CustomPainter {
|
||||
final List<List<int>> sprite;
|
||||
final Sprite? sprite;
|
||||
|
||||
// Initialize a reusable Paint object and disable anti-aliasing to keep the
|
||||
// pixels perfectly sharp and chunky.
|
||||
@@ -14,6 +15,8 @@ class WeaponPainter extends CustomPainter {
|
||||
|
||||
@override
|
||||
void paint(Canvas canvas, Size size) {
|
||||
if (sprite == null) return;
|
||||
|
||||
// Calculate width and height separately in case the container isn't a
|
||||
// perfect square
|
||||
double pixelWidth = size.width / 64;
|
||||
@@ -21,7 +24,7 @@ class WeaponPainter extends CustomPainter {
|
||||
|
||||
for (int x = 0; x < 64; x++) {
|
||||
for (int y = 0; y < 64; y++) {
|
||||
int colorByte = sprite[x][y];
|
||||
int colorByte = sprite![x][y];
|
||||
|
||||
if (colorByte != 255) {
|
||||
// 255 is our transparent magenta
|
||||
|
||||
Reference in New Issue
Block a user