293
lib/features/renderer/color_palette.dart
Normal file
293
lib/features/renderer/color_palette.dart
Normal file
@@ -0,0 +1,293 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
extension WolfPaletteMatch on Color {
|
||||
/// Finds the index of the closest color in the wolfPalette
|
||||
int findClosestIndex(List<Color> palette) {
|
||||
int closestIndex = 0;
|
||||
double minDistance = double.infinity;
|
||||
|
||||
for (int i = 0; i < palette.length; i++) {
|
||||
final Color pColor = palette[i];
|
||||
|
||||
// Calculate squared Euclidean distance (skipping sqrt for performance)
|
||||
double distance =
|
||||
pow(r - pColor.r, 2).toDouble() +
|
||||
pow(g - pColor.g, 2).toDouble() +
|
||||
pow(b - pColor.b, 2).toDouble();
|
||||
|
||||
if (distance < minDistance) {
|
||||
minDistance = distance;
|
||||
closestIndex = i;
|
||||
}
|
||||
}
|
||||
return closestIndex;
|
||||
}
|
||||
|
||||
/// Returns the actual Color object from the palette that matches best
|
||||
Color toWolfColor(List<Color> palette) {
|
||||
return palette[findClosestIndex(palette)];
|
||||
}
|
||||
}
|
||||
|
||||
abstract class ColorPalette {
|
||||
static const List<Color> vga = [
|
||||
Color(0xFF000000),
|
||||
Color(0xFF0000AA),
|
||||
Color(0xFF00AA00),
|
||||
Color(0xFF00AAAA),
|
||||
Color(0xFFAA0000),
|
||||
Color(0xFFAA00AA),
|
||||
Color(0xFFAA5500),
|
||||
Color(0xFFAAAAAA),
|
||||
Color(0xFF555555),
|
||||
Color(0xFF5555FF),
|
||||
Color(0xFF55FF55),
|
||||
Color(0xFF55FFFF),
|
||||
Color(0xFFFF5555),
|
||||
Color(0xFFFF55FF),
|
||||
Color(0xFFFFFF55),
|
||||
Color(0xFFFFFFFF),
|
||||
Color(0xFFEEEEEE),
|
||||
Color(0xFFDEDEDE),
|
||||
Color(0xFFD2D2D2),
|
||||
Color(0xFFC2C2C2),
|
||||
Color(0xFFB6B6B6),
|
||||
Color(0xFFAAAAAA),
|
||||
Color(0xFF999999),
|
||||
Color(0xFF8D8D8D),
|
||||
Color(0xFF7D7D7D),
|
||||
Color(0xFF717171),
|
||||
Color(0xFF656565),
|
||||
Color(0xFF555555),
|
||||
Color(0xFF484848),
|
||||
Color(0xFF383838),
|
||||
Color(0xFF2C2C2C),
|
||||
Color(0xFF202020),
|
||||
Color(0xFFFF0000),
|
||||
Color(0xFFEE0000),
|
||||
Color(0xFFE20000),
|
||||
Color(0xFFD60000),
|
||||
Color(0xFFCA0000),
|
||||
Color(0xFFBE0000),
|
||||
Color(0xFFB20000),
|
||||
Color(0xFFA50000),
|
||||
Color(0xFF990000),
|
||||
Color(0xFF890000),
|
||||
Color(0xFF7D0000),
|
||||
Color(0xFF710000),
|
||||
Color(0xFF650000),
|
||||
Color(0xFF590000),
|
||||
Color(0xFF4C0000),
|
||||
Color(0xFF400000),
|
||||
Color(0xFFFFDADA),
|
||||
Color(0xFFFFBABA),
|
||||
Color(0xFFFF9D9D),
|
||||
Color(0xFFFF7D7D),
|
||||
Color(0xFFFF5D5D),
|
||||
Color(0xFFFF4040),
|
||||
Color(0xFFFF2020),
|
||||
Color(0xFFFF0000),
|
||||
Color(0xFFFFAA5D),
|
||||
Color(0xFFFF9940),
|
||||
Color(0xFFFF8920),
|
||||
Color(0xFFFF7900),
|
||||
Color(0xFFE66D00),
|
||||
Color(0xFFCE6100),
|
||||
Color(0xFFB65500),
|
||||
Color(0xFF9D4C00),
|
||||
Color(0xFFFFFFDA),
|
||||
Color(0xFFFFFFBA),
|
||||
Color(0xFFFFFF9D),
|
||||
Color(0xFFFFFF7D),
|
||||
Color(0xFFFFFA5D),
|
||||
Color(0xFFFFF640),
|
||||
Color(0xFFFFF620),
|
||||
Color(0xFFFFF600),
|
||||
Color(0xFFE6DA00),
|
||||
Color(0xFFCEC600),
|
||||
Color(0xFFB6AE00),
|
||||
Color(0xFF9D9D00),
|
||||
Color(0xFF858500),
|
||||
Color(0xFF716D00),
|
||||
Color(0xFF595500),
|
||||
Color(0xFF404000),
|
||||
Color(0xFFD2FF5D),
|
||||
Color(0xFFC6FF40),
|
||||
Color(0xFFB6FF20),
|
||||
Color(0xFFA1FF00),
|
||||
Color(0xFF91E600),
|
||||
Color(0xFF81CE00),
|
||||
Color(0xFF75B600),
|
||||
Color(0xFF619D00),
|
||||
Color(0xFFDAFFDA),
|
||||
Color(0xFFBEFFBA),
|
||||
Color(0xFF9DFF9D),
|
||||
Color(0xFF81FF7D),
|
||||
Color(0xFF61FF5D),
|
||||
Color(0xFF40FF40),
|
||||
Color(0xFF20FF20),
|
||||
Color(0xFF00FF00),
|
||||
Color(0xFF00FF00),
|
||||
Color(0xFF00EE00),
|
||||
Color(0xFF00E200),
|
||||
Color(0xFF00D600),
|
||||
Color(0xFF04CA00),
|
||||
Color(0xFF04BE00),
|
||||
Color(0xFF04B200),
|
||||
Color(0xFF04A500),
|
||||
Color(0xFF049900),
|
||||
Color(0xFF048900),
|
||||
Color(0xFF047D00),
|
||||
Color(0xFF047100),
|
||||
Color(0xFF046500),
|
||||
Color(0xFF045900),
|
||||
Color(0xFF044C00),
|
||||
Color(0xFF044000),
|
||||
Color(0xFFDAFFFF),
|
||||
Color(0xFFBAFFFF),
|
||||
Color(0xFF9DFFFF),
|
||||
Color(0xFF7DFFFA),
|
||||
Color(0xFF5DFFFF),
|
||||
Color(0xFF40FFFF),
|
||||
Color(0xFF20FFFF),
|
||||
Color(0xFF00FFFF),
|
||||
Color(0xFF00E6E6),
|
||||
Color(0xFF00CECE),
|
||||
Color(0xFF00B6B6),
|
||||
Color(0xFF009D9D),
|
||||
Color(0xFF008585),
|
||||
Color(0xFF007171),
|
||||
Color(0xFF005959),
|
||||
Color(0xFF004040),
|
||||
Color(0xFF5DBEFF),
|
||||
Color(0xFF40B2FF),
|
||||
Color(0xFF20AAFF),
|
||||
Color(0xFF009DFF),
|
||||
Color(0xFF008DE6),
|
||||
Color(0xFF007DCE),
|
||||
Color(0xFF006DB6),
|
||||
Color(0xFF005D9D),
|
||||
Color(0xFFDADADA),
|
||||
Color(0xFFBABEFF),
|
||||
Color(0xFF9D9DFF),
|
||||
Color(0xFF7D81FF),
|
||||
Color(0xFF5D61FF),
|
||||
Color(0xFF4040FF),
|
||||
Color(0xFF2024FF),
|
||||
Color(0xFF0004FF),
|
||||
Color(0xFF0000FF),
|
||||
Color(0xFF0000EE),
|
||||
Color(0xFF0000E2),
|
||||
Color(0xFF0000D6),
|
||||
Color(0xFF0000CA),
|
||||
Color(0xFF0000BE),
|
||||
Color(0xFF0000B2),
|
||||
Color(0xFF0000A5),
|
||||
Color(0xFF000099),
|
||||
Color(0xFF000089),
|
||||
Color(0xFF00007D),
|
||||
Color(0xFF000071),
|
||||
Color(0xFF000065),
|
||||
Color(0xFF000059),
|
||||
Color(0xFF00004C),
|
||||
Color(0xFF000040),
|
||||
Color(0xFF282828),
|
||||
Color(0xFFFFE234),
|
||||
Color(0xFFFFD624),
|
||||
Color(0xFFFFCE18),
|
||||
Color(0xFFFFC208),
|
||||
Color(0xFFFFB600),
|
||||
Color(0xFFB620FF),
|
||||
Color(0xFFAA00FF),
|
||||
Color(0xFF9900E6),
|
||||
Color(0xFF8100CE),
|
||||
Color(0xFF7500B6),
|
||||
Color(0xFF61009D),
|
||||
Color(0xFF500085),
|
||||
Color(0xFF440071),
|
||||
Color(0xFF340059),
|
||||
Color(0xFF280040),
|
||||
Color(0xFFFFDAFF),
|
||||
Color(0xFFFFBAFF),
|
||||
Color(0xFFFF9DFF),
|
||||
Color(0xFFFF7DFF),
|
||||
Color(0xFFFF5DFF),
|
||||
Color(0xFFFF40FF),
|
||||
Color(0xFFFF20FF),
|
||||
Color(0xFFFF00FF),
|
||||
Color(0xFFE200E6),
|
||||
Color(0xFFCA00CE),
|
||||
Color(0xFFB600B6),
|
||||
Color(0xFF9D009D),
|
||||
Color(0xFF850085),
|
||||
Color(0xFF6D0071),
|
||||
Color(0xFF590059),
|
||||
Color(0xFF400040),
|
||||
Color(0xFFFFEADE),
|
||||
Color(0xFFFFE2D2),
|
||||
Color(0xFFFFDAC6),
|
||||
Color(0xFFFFD6BE),
|
||||
Color(0xFFFFCEB2),
|
||||
Color(0xFFFFC6A5),
|
||||
Color(0xFFFFBE9D),
|
||||
Color(0xFFFFBA91),
|
||||
Color(0xFFFFB281),
|
||||
Color(0xFFFA571F),
|
||||
Color(0xFFFF9D61),
|
||||
Color(0xFFF2955D),
|
||||
Color(0xFFEA8D59),
|
||||
Color(0xFFDE8955),
|
||||
Color(0xFFD28150),
|
||||
Color(0xFFCA7D4C),
|
||||
Color(0xFFBE7948),
|
||||
Color(0xFFB67144),
|
||||
Color(0xFFAA6940),
|
||||
Color(0xFFA1653C),
|
||||
Color(0xFF9D6138),
|
||||
Color(0xFF915D34),
|
||||
Color(0xFF895930),
|
||||
Color(0xFF81502C),
|
||||
Color(0xFF754C28),
|
||||
Color(0xFF6D4824),
|
||||
Color(0xFF5D4020),
|
||||
Color(0xFF553C1C),
|
||||
Color(0xFF483818),
|
||||
Color(0xFF403018),
|
||||
Color(0xFF382C14),
|
||||
Color(0xFF28200C),
|
||||
Color(0xFF610065),
|
||||
Color(0xFF006565),
|
||||
Color(0xFF006161),
|
||||
Color(0xFF00001C),
|
||||
Color(0xFF00002C),
|
||||
Color(0xFF302410),
|
||||
Color(0xFF480048),
|
||||
Color(0xFF500050),
|
||||
Color(0xFF000034),
|
||||
Color(0xFF1C1C1C),
|
||||
Color(0xFF4C4C4C),
|
||||
Color(0xFF5D5D5D),
|
||||
Color(0xFF404040),
|
||||
Color(0xFF303030),
|
||||
Color(0xFF343434),
|
||||
Color(0xFFDAF6F6),
|
||||
Color(0xFFBAEAEA),
|
||||
Color(0xFF9DDEDE),
|
||||
Color(0xFF75CACA),
|
||||
Color(0xFF48C2C2),
|
||||
Color(0xFF20B6B6),
|
||||
Color(0xFF20B2B2),
|
||||
Color(0xFF00A5A5),
|
||||
Color(0xFF009999),
|
||||
Color(0xFF008D8D),
|
||||
Color(0xFF008585),
|
||||
Color(0xFF007D7D),
|
||||
Color(0xFF007979),
|
||||
Color(0xFF007575),
|
||||
Color(0xFF007171),
|
||||
Color(0xFF006D6D),
|
||||
Color(0xFF990089),
|
||||
];
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:wolf_dart/classes/color_palette.dart';
|
||||
import 'package:wolf_dart/classes/linear_coordinates.dart';
|
||||
import 'package:wolf_dart/classes/matrix.dart';
|
||||
import 'package:wolf_dart/classes/sprite.dart';
|
||||
import 'package:wolf_dart/features/renderer/color_palette.dart';
|
||||
|
||||
class RaycasterPainter extends CustomPainter {
|
||||
final Matrix<int> map;
|
||||
@@ -209,10 +209,8 @@ class RaycasterPainter extends CustomPainter {
|
||||
// THE Z-BUFFER CHECK!
|
||||
// Only draw if the sprite is closer to the camera than the wall at this pixel column
|
||||
if (transformY < zBuffer[stripe]) {
|
||||
int texX = ((stripe - drawStartX) * 64 / spriteWidth).toInt().clamp(
|
||||
0,
|
||||
63,
|
||||
);
|
||||
double texXDouble = (stripe - drawStartX) * 64 / spriteWidth;
|
||||
int texX = texXDouble.toInt().clamp(0, 63);
|
||||
|
||||
double startY = (size.height / 2) - (spriteHeight / 2);
|
||||
double stepY = spriteHeight / 64.0;
|
||||
|
||||
@@ -49,34 +49,18 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_initGame();
|
||||
_initGame(demo: widget.isDemo);
|
||||
}
|
||||
|
||||
Future<void> _initGame() async {
|
||||
// 1. Load the entire WAD/WL1 data
|
||||
gameMap = await WolfMap.load();
|
||||
Future<void> _initGame({bool demo = true}) async {
|
||||
// 1. Load the entire WL1 (demo)/WL6 (retail) data
|
||||
gameMap = demo ? await WolfMap.loadDemo() : await WolfMap.load();
|
||||
|
||||
// 2. Extract Level 1 (E1M1)
|
||||
currentLevel = gameMap.levels[0].wallGrid;
|
||||
|
||||
final Matrix<int> objectLevel = gameMap.levels[0].objectGrid;
|
||||
|
||||
// Adjusted mapping for WL1 Shareware
|
||||
// These numbers represent the delta from the FIRST sprite chunk in VSWAP
|
||||
Map<int, int> staticObjects = {
|
||||
23: widget.isDemo ? 0 : 23, // Water Puddle
|
||||
24: widget.isDemo ? 1 : 24, // Green Barrel
|
||||
25: widget.isDemo ? 2 : 25, // Chairs
|
||||
26: widget.isDemo ? 3 : 26, // Green Plant
|
||||
27: widget.isDemo ? 4 : 27, // Skeleton / Bones
|
||||
28: widget.isDemo ? 5 : 28, // Blue Lamp
|
||||
29: widget.isDemo ? 6 : 29, // Chandelier
|
||||
30: widget.isDemo ? 7 : 30, // Dog food
|
||||
31: widget.isDemo ? 8 : 31, // White pillar
|
||||
32: widget.isDemo ? 9 : 32, // Hanged man
|
||||
50: widget.isDemo ? 42 : 95, // Standing Guard (Front-facing frame)
|
||||
};
|
||||
|
||||
// 1. SCAN FOR PLAYER SPAWN & ENTITIES
|
||||
for (int y = 0; y < 64; y++) {
|
||||
for (int x = 0; x < 64; x++) {
|
||||
@@ -97,12 +81,26 @@ class _WolfRendererState extends State<WolfRenderer>
|
||||
}
|
||||
}
|
||||
// NEW: Populate the Entities!
|
||||
else if (staticObjects.containsKey(objId)) {
|
||||
entities.add((
|
||||
x: x + 0.5,
|
||||
y: y + 0.5,
|
||||
spriteIndex: staticObjects[objId]!,
|
||||
));
|
||||
else if (objId >= 23 && objId <= 70) {
|
||||
int calculatedSpriteIndex = objId - 21;
|
||||
|
||||
// Safety bounds check to prevent crashes on custom/corrupt maps
|
||||
if (calculatedSpriteIndex >= 0 &&
|
||||
calculatedSpriteIndex < gameMap.sprites.length) {
|
||||
entities.add((
|
||||
x: x + 0.5,
|
||||
y: y + 0.5,
|
||||
spriteIndex: calculatedSpriteIndex,
|
||||
));
|
||||
}
|
||||
} else if (objId == 124) {
|
||||
if (95 < gameMap.sprites.length) {
|
||||
entities.add((
|
||||
x: x + 0.5,
|
||||
y: y + 0.5,
|
||||
spriteIndex: 95,
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user