Przeglądaj źródła

random maps can now spawn hidden areas

tags/v0.8.0
Shaun 3 lat temu
rodzic
commit
f862ee0d1e
2 zmienionych plików z 139 dodań i 12 usunięć
  1. +15
    -1
      src/server/world/map.js
  2. +124
    -11
      src/server/world/randomMap.js

+ 15
- 1
src/server/world/map.js Wyświetl plik

@@ -458,7 +458,21 @@ module.exports = {
} else if (layerName === 'hiddenRooms') { } else if (layerName === 'hiddenRooms') {
blueprint.fog = (cell.properties || {}).fog; blueprint.fog = (cell.properties || {}).fog;
blueprint.discoverable = (cell.properties || {}).discoverable; blueprint.discoverable = (cell.properties || {}).discoverable;
this.hiddenRooms.push(blueprint);

if (!mapFile.properties.isRandom)
this.hiddenRooms.push(blueprint);
else {
let room = this.rooms.find(r => {
return !(
blueprint.x < r.x ||
blueprint.y < r.y ||
blueprint.x >= r.x + r.width ||
blueprint.y >= r.y + r.height
);
});

room.objects.push(blueprint);
}
} else if (!clientObj) { } else if (!clientObj) {
if (!mapFile.properties.isRandom) if (!mapFile.properties.isRandom)
spawners.register(blueprint, blueprint.spawnCd || mapFile.properties.spawnCd); spawners.register(blueprint, blueprint.spawnCd || mapFile.properties.spawnCd);


+ 124
- 11
src/server/world/randomMap.js Wyświetl plik

@@ -20,6 +20,7 @@ module.exports = {


generate: function (instance) { generate: function (instance) {
const { map } = instance; const { map } = instance;
map.clientMap.hiddenRooms = [];


this.loadMapProperties(map.mapFile.properties); this.loadMapProperties(map.mapFile.properties);


@@ -52,6 +53,13 @@ module.exports = {
this.offsetRooms(startRoom); this.offsetRooms(startRoom);
this.buildMap(instance, startRoom); this.buildMap(instance, startRoom);
} }

//To spawn in another room
/*const spawnRoom = this.rooms.find(t => t.template.properties.end);
map.spawn = [{
x: spawnRoom.x + ~~(spawnRoom.template.width / 2) - 2,
y: spawnRoom.y + ~~(spawnRoom.template.height / 2) + 6
}];*/
}, },


loadMapProperties: function ({ leafConstraints, endConstraints }) { loadMapProperties: function ({ leafConstraints, endConstraints }) {
@@ -109,7 +117,9 @@ module.exports = {
return true; return true;
}, },


/* eslint-disable-next-line */
setupTemplates: function (map) { setupTemplates: function (map) {
/* eslint-disable-next-line */
this.templates.forEach((r, typeId) => { this.templates.forEach((r, typeId) => {
if (r.properties.mapping) if (r.properties.mapping)
return; return;
@@ -121,6 +131,27 @@ module.exports = {
canFlipX = ~~canFlipX; canFlipX = ~~canFlipX;
canFlipY = ~~canFlipY; canFlipY = ~~canFlipY;


//Fix Polygons
r.objects.forEach(o => {
if (!o.fog)
return;

const newArea = o.area.map(p => {
const [ px, py ] = p;

const hpx = px - r.x;
const hpy = py - r.y;

return [hpx, hpy];
});

Object.assign(o, {
x: o.x - r.x,
y: o.y - r.y,
area: newArea
});
});

//FlipX Loop //FlipX Loop
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
if (i && !canFlipX) if (i && !canFlipX)
@@ -170,14 +201,83 @@ module.exports = {
}); });


flipped.objects.forEach(o => { flipped.objects.forEach(o => {
if (flipped.flipX)
o.x = r.x + r.width - (o.x - r.x) - 1;
if (flipped.flipY)
o.y = r.y + r.height - (o.y - r.y) - 1;
if (flipped.rotate) {
let t = o.x;
o.x = r.x + (o.y - r.y);
o.y = r.y + (t - r.x);
if (!o.fog) {
if (flipped.flipX)
o.x = r.x + r.width - (o.x - r.x) - 1;
if (flipped.flipY)
o.y = r.y + r.height - (o.y - r.y) - 1;
if (flipped.rotate) {
let t = o.x;
o.x = r.x + (o.y - r.y);
o.y = r.y + (t - r.x);
}
} else {
if (flipped.flipX) {
const newArea = o.area.map(p => {
const [ px, py ] = p;

const hpx = r.width - px;

return [hpx, py];
});

Object.assign(o, {
area: newArea
});
}
if (flipped.flipY) {
const newArea = o.area.map(p => {
const [ px, py ] = p;

const hpy = r.height - py;

return [px, hpy];
});

Object.assign(o, {
area: newArea
});
}
if (flipped.rotate) {
const newArea = o.area.map(p => {
const [ px, py ] = p;

const t = px;
const hpx = py;
const hpy = t;

return [hpx, hpy];
});

Object.assign(o, {
area: newArea
});
}

//Fix polygon bounds
let lowX = r.width;
let lowY = r.height;
let highX = 0;
let highY = 0;

o.area.forEach(p => {
const [ px, py ] = p;

if (px < lowX)
lowX = px;
if (px > highX)
highX = px;

if (py < lowY)
lowY = py;
if (py > highY)
highY = py;
});

o.x = lowX;
o.y = lowY;
o.width = highX - lowX;
o.height = highY - lowY;
} }
}); });


@@ -379,10 +479,23 @@ module.exports = {
let spawnCd = instance.map.mapFile.properties.spawnCd; let spawnCd = instance.map.mapFile.properties.spawnCd;


template.objects.forEach(o => { template.objects.forEach(o => {
o.x = o.x - template.x + room.x;
o.y = o.y - template.y + room.y;
if (!o.fog) {
o.x = o.x - template.x + room.x;
o.y = o.y - template.y + room.y;

spawners.register(o, spawnCd);
} else {
o.x += room.x;
o.y += room.y;


spawners.register(o, spawnCd);
o.area = o.area.map(p => {
const [px, py] = p;

return [px + room.x, py + room.y];
});

instance.map.clientMap.hiddenRooms.push(o);
}
}); });


room.connections.forEach(c => this.spawnObjects(instance, c), this); room.connections.forEach(c => this.spawnObjects(instance, c), this);


Ładowanie…
Anuluj
Zapisz