Refactor adjacent-tile checks
This commit is contained in:
parent
2b37385439
commit
4d2596fe33
1 changed files with 22 additions and 21 deletions
|
@ -105,10 +105,7 @@ export class IslandGrid {
|
||||||
|
|
||||||
// try to roll in cardinal directions
|
// try to roll in cardinal directions
|
||||||
|
|
||||||
check((pos - this.width) % this.data.length);
|
this.forCardinals(pos, check);
|
||||||
check((pos - 1) % this.data.length);
|
|
||||||
check((pos + 1) % this.data.length);
|
|
||||||
check((pos + this.width) % this.data.length);
|
|
||||||
|
|
||||||
if (lowerNeighbors.length > 0) {
|
if (lowerNeighbors.length > 0) {
|
||||||
const downhill = lowerNeighbors[this.rng() % lowerNeighbors.length];
|
const downhill = lowerNeighbors[this.rng() % lowerNeighbors.length];
|
||||||
|
@ -117,10 +114,7 @@ export class IslandGrid {
|
||||||
|
|
||||||
// try to roll in diagonal directions
|
// try to roll in diagonal directions
|
||||||
|
|
||||||
check((pos - this.width - 1) % this.data.length);
|
this.forDiagonals(pos, check);
|
||||||
check((pos - this.width + 1) % this.data.length);
|
|
||||||
check((pos + this.width - 1) % this.data.length);
|
|
||||||
check((pos + this.width + 1) % this.data.length);
|
|
||||||
|
|
||||||
if (lowerNeighbors.length > 0) {
|
if (lowerNeighbors.length > 0) {
|
||||||
const downhill = lowerNeighbors[this.rng() % lowerNeighbors.length];
|
const downhill = lowerNeighbors[this.rng() % lowerNeighbors.length];
|
||||||
|
@ -134,22 +128,13 @@ export class IslandGrid {
|
||||||
public sinkhole(pos: number): void {
|
public sinkhole(pos: number): void {
|
||||||
const higherNeighbors: number[] = [];
|
const higherNeighbors: number[] = [];
|
||||||
|
|
||||||
const check = (adjPos: number) => {
|
// try to pull from neighbors
|
||||||
|
|
||||||
|
this.forNeighbors(pos, (adjPos: number) => {
|
||||||
if (this.data[adjPos] > this.data[pos]) {
|
if (this.data[adjPos] > this.data[pos]) {
|
||||||
higherNeighbors.push(adjPos);
|
higherNeighbors.push(adjPos);
|
||||||
}
|
}
|
||||||
};
|
});
|
||||||
|
|
||||||
// try to pull from neighbors
|
|
||||||
|
|
||||||
check((pos - this.width - 1) % this.data.length);
|
|
||||||
check((pos - this.width) % this.data.length);
|
|
||||||
check((pos - this.width + 1) % this.data.length);
|
|
||||||
check((pos - 1) % this.data.length);
|
|
||||||
check((pos + 1) % this.data.length);
|
|
||||||
check((pos + this.width - 1) % this.data.length);
|
|
||||||
check((pos + this.width) % this.data.length);
|
|
||||||
check((pos + this.width + 1) % this.data.length);
|
|
||||||
|
|
||||||
if (higherNeighbors.length > 0) {
|
if (higherNeighbors.length > 0) {
|
||||||
const uphill = higherNeighbors[this.rng() % higherNeighbors.length];
|
const uphill = higherNeighbors[this.rng() % higherNeighbors.length];
|
||||||
|
@ -160,6 +145,22 @@ export class IslandGrid {
|
||||||
this.data[pos] = Math.max(this.data[pos] - 1, -3);
|
this.data[pos] = Math.max(this.data[pos] - 1, -3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public forCardinals(pos: number, action: (adjPos: number) => void) {
|
||||||
|
action((pos - this.width) % this.data.length);
|
||||||
|
action((pos - 1) % this.data.length);
|
||||||
|
action((pos + 1) % this.data.length);
|
||||||
|
action((pos + this.width) % this.data.length);
|
||||||
|
}
|
||||||
|
public forDiagonals(pos: number, action: (adjPos: number) => void) {
|
||||||
|
action((pos - this.width - 1) % this.data.length);
|
||||||
|
action((pos - this.width + 1) % this.data.length);
|
||||||
|
action((pos + this.width - 1) % this.data.length);
|
||||||
|
action((pos + this.width + 1) % this.data.length);
|
||||||
|
}
|
||||||
|
public forNeighbors(pos: number, action: (adjPos: number) => void) {
|
||||||
|
this.forCardinals(pos, action);
|
||||||
|
this.forDiagonals(pos, action);
|
||||||
|
}
|
||||||
public choose<T>(list: T[]) {
|
public choose<T>(list: T[]) {
|
||||||
if (list.length == 0) {
|
if (list.length == 0) {
|
||||||
throw new Error("Picking from empty list");
|
throw new Error("Picking from empty list");
|
||||||
|
|
Loading…
Add table
Reference in a new issue