fix: revert to Version 1 approach (tiles connected) + just add Y negate
Version 1 (X mirror, Y direct) had correct tile connections but N/S flipped. Previous attempts to fix N/S also changed rotation handling which broke tiles. This commit reverts tile processing (no flip), reverts rotation (exact UB values), and only adds Y negation to Version 1's working coordinates. No other changes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8b605a4cae
commit
203ae0a4fb
1 changed files with 11 additions and 20 deletions
|
|
@ -3607,18 +3607,13 @@ const DUNGEON_DISPLAY_COLORS = {
|
||||||
stairs: { r: 180, g: 160, b: 80 }, // yellowish stairs
|
stairs: { r: 180, g: 160, b: 80 }, // yellowish stairs
|
||||||
};
|
};
|
||||||
|
|
||||||
// Process a tile image: flip horizontally (UB tiles authored for mirrored-X),
|
// Process a tile image: make white transparent, remap UB colors
|
||||||
// make white transparent, remap UB colors
|
|
||||||
function processTileImage(img) {
|
function processTileImage(img) {
|
||||||
const c = document.createElement('canvas');
|
const c = document.createElement('canvas');
|
||||||
c.width = 10;
|
c.width = 10;
|
||||||
c.height = 10;
|
c.height = 10;
|
||||||
const ctx = c.getContext('2d');
|
const ctx = c.getContext('2d');
|
||||||
// Flip horizontally: tiles were designed for UB's mirrored-X coordinate system
|
|
||||||
ctx.translate(10, 0);
|
|
||||||
ctx.scale(-1, 1);
|
|
||||||
ctx.drawImage(img, 0, 0, 10, 10);
|
ctx.drawImage(img, 0, 0, 10, 10);
|
||||||
ctx.setTransform(1, 0, 0, 1, 0, 0);
|
|
||||||
const imageData = ctx.getImageData(0, 0, 10, 10);
|
const imageData = ctx.getImageData(0, 0, 10, 10);
|
||||||
const d = imageData.data;
|
const d = imageData.data;
|
||||||
|
|
||||||
|
|
@ -3862,14 +3857,11 @@ function updateRadarWindow(msg) {
|
||||||
const cellSize = 10 * scale; // each cell is 10 game units
|
const cellSize = 10 * scale; // each cell is 10 game units
|
||||||
const hasTiles = dungeonTileCanvases && Object.keys(dungeonTileCanvases).length > 0;
|
const hasTiles = dungeonTileCanvases && Object.keys(dungeonTileCanvases).length > 0;
|
||||||
|
|
||||||
// Normalize rotation value to radians (from UB's DungeonCell.cs)
|
// Normalize rotation value to radians (exact copy of UB's DungeonCell.cs)
|
||||||
// Negated because tile images are horizontally flipped to compensate
|
|
||||||
// for UB's mirrored-X authoring space
|
|
||||||
function cellRotation(rot) {
|
function cellRotation(rot) {
|
||||||
if (Math.abs(rot - 1) < 0.01) return Math.PI; // 180° = -180°, same
|
if (rot === 1) return Math.PI;
|
||||||
if (Math.abs(rot + 1) < 0.01) return Math.PI;
|
if (rot < -0.70 && rot > -0.8) return Math.PI / 2;
|
||||||
if (rot < -0.70 && rot > -0.8) return -Math.PI / 2; // negated
|
if (rot > 0.70 && rot < 0.8) return -Math.PI / 2;
|
||||||
if (rot > 0.70 && rot < 0.8) return Math.PI / 2; // negated
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3885,9 +3877,8 @@ function updateRadarWindow(msg) {
|
||||||
ctx.globalAlpha = isCurrentFloor ? 0.85 : 0.12;
|
ctx.globalAlpha = isCurrentFloor ? 0.85 : 0.12;
|
||||||
|
|
||||||
(level.cells || []).forEach(cell => {
|
(level.cells || []).forEach(cell => {
|
||||||
// Direct relative position (UB mirrors both cell and player, cancels out)
|
// X mirrored (matches UB's layer rendering), Y negated for north-up
|
||||||
// Y negated for north-up (AC Y+ = north, canvas Y+ = down)
|
const dx = -(cell.x - playerX) * scale;
|
||||||
const dx = (cell.x - playerX) * scale;
|
|
||||||
const dy = -(cell.y - playerY) * scale;
|
const dy = -(cell.y - playerY) * scale;
|
||||||
const tileCanvas = hasTiles ? dungeonTileCanvases[String(cell.env_id)] : null;
|
const tileCanvas = hasTiles ? dungeonTileCanvases[String(cell.env_id)] : null;
|
||||||
|
|
||||||
|
|
@ -3985,8 +3976,8 @@ function updateRadarWindow(msg) {
|
||||||
// Use raw physics coords in dungeons (X mirrored), EW/NS on surface
|
// Use raw physics coords in dungeons (X mirrored), EW/NS on surface
|
||||||
let dX, dY;
|
let dX, dY;
|
||||||
if (isDungeon && obj.raw_x !== undefined) {
|
if (isDungeon && obj.raw_x !== undefined) {
|
||||||
dX = (obj.raw_x - playerX);
|
dX = -(obj.raw_x - playerX); // X mirrored to match tile space
|
||||||
dY = -(obj.raw_y - playerY); // Y flipped for north-up
|
dY = -(obj.raw_y - playerY); // Y negated for north-up
|
||||||
} else {
|
} else {
|
||||||
dX = obj.ew - playerEW;
|
dX = obj.ew - playerEW;
|
||||||
dY = obj.ns - playerNS;
|
dY = obj.ns - playerNS;
|
||||||
|
|
@ -4048,8 +4039,8 @@ function updateRadarWindow(msg) {
|
||||||
const withDist = objects.map(obj => {
|
const withDist = objects.map(obj => {
|
||||||
let distMeters, dX, dY;
|
let distMeters, dX, dY;
|
||||||
if (isDungeon && obj.raw_x !== undefined) {
|
if (isDungeon && obj.raw_x !== undefined) {
|
||||||
dX = (obj.raw_x - playerX);
|
dX = -(obj.raw_x - playerX); // X mirrored
|
||||||
dY = -(obj.raw_y - playerY);
|
dY = -(obj.raw_y - playerY); // Y negated
|
||||||
distMeters = Math.sqrt(dX * dX + dY * dY); // raw coords are ~meters
|
distMeters = Math.sqrt(dX * dX + dY * dY); // raw coords are ~meters
|
||||||
} else {
|
} else {
|
||||||
dX = obj.ew - playerEW;
|
dX = obj.ew - playerEW;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue