mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-11 23:04:52 +09:00
177 lines
10 KiB
JavaScript
177 lines
10 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const typescript_collections_1 = require("typescript-collections");
|
|
const Point_1 = require("./Point");
|
|
const TeleportZone_1 = require("./TeleportZone");
|
|
const TeleportZoneDirection_1 = require("./TeleportZoneDirection");
|
|
class Grid {
|
|
constructor() {
|
|
this._nodes = new typescript_collections_1.Dictionary();
|
|
this._minX = 0;
|
|
this._minY = 0;
|
|
this._maxX = 0;
|
|
this._maxY = 0;
|
|
}
|
|
GetNodes() {
|
|
return this._nodes.values();
|
|
}
|
|
/**
|
|
* Adds a node to the grid
|
|
* @param topLeftCoordinate The top left x,y coordinate of the node
|
|
* @param nodeInstance
|
|
*/
|
|
AddNodeToGrid(nodeInstance) {
|
|
let topLeftCoordinate = nodeInstance.TopLeftCoordinate;
|
|
let pointsToSave = new Array();
|
|
// check all points that make up nodeInstance for existing nodes
|
|
for (let x = topLeftCoordinate.X; x < topLeftCoordinate.X + nodeInstance.Width; x++) {
|
|
for (let y = topLeftCoordinate.Y; y < topLeftCoordinate.Y + nodeInstance.Height; y++) {
|
|
let currentPoint = new Point_1.Point(x, y);
|
|
let existingNode = this._nodes.getValue(currentPoint);
|
|
if (existingNode != null) {
|
|
throw new Error("Cannot add node to grid - collision detected with node '" + existingNode.Name + "'");
|
|
}
|
|
pointsToSave.push(currentPoint);
|
|
}
|
|
}
|
|
// no existing nodes found to assign node to these points
|
|
for (let i = 0; i < pointsToSave.length; i++) {
|
|
this._nodes.setValue(pointsToSave[i], nodeInstance);
|
|
}
|
|
//TODO: Refactor
|
|
//#region Set up teleport zones
|
|
// check surrounding points for nodes
|
|
// check north points
|
|
let y = topLeftCoordinate.Y - 1;
|
|
for (let x = topLeftCoordinate.X; x < topLeftCoordinate.X + nodeInstance.Width; x++) {
|
|
let currentPoint = new Point_1.Point(x, y);
|
|
let existingNode = this._nodes.getValue(currentPoint);
|
|
// found a node - set up teleport zone
|
|
if (existingNode != null) {
|
|
// Create/Update teleport node in existing node to new node
|
|
let teleportZoneFromExistingToNew = existingNode.TeleportZones.getValue(nodeInstance.Key);
|
|
if (teleportZoneFromExistingToNew == null) {
|
|
teleportZoneFromExistingToNew = new TeleportZone_1.TeleportZone(existingNode, TeleportZoneDirection_1.TeleportZoneDirection.South, currentPoint, currentPoint, existingNode.TeleportZones.size(), nodeInstance);
|
|
existingNode.TeleportZones.setValue(nodeInstance.Key, teleportZoneFromExistingToNew);
|
|
}
|
|
else {
|
|
teleportZoneFromExistingToNew.BottomRightCoordinate = currentPoint;
|
|
}
|
|
// Create/Update teleport node in new node to existing node
|
|
let teleportZoneFromNewToExisting = nodeInstance.TeleportZones.getValue(existingNode.Key);
|
|
let pointInNewNode = new Point_1.Point(currentPoint.X, currentPoint.Y + 1);
|
|
if (teleportZoneFromNewToExisting == null) {
|
|
teleportZoneFromNewToExisting = new TeleportZone_1.TeleportZone(nodeInstance, TeleportZoneDirection_1.TeleportZoneDirection.North, pointInNewNode, pointInNewNode, nodeInstance.TeleportZones.size(), existingNode);
|
|
nodeInstance.TeleportZones.setValue(existingNode.Key, teleportZoneFromNewToExisting);
|
|
}
|
|
else {
|
|
teleportZoneFromNewToExisting.BottomRightCoordinate = currentPoint;
|
|
}
|
|
}
|
|
}
|
|
// check south points
|
|
y = topLeftCoordinate.Y + nodeInstance.Height + 1;
|
|
for (let x = topLeftCoordinate.X; x < topLeftCoordinate.X + nodeInstance.Width; x++) {
|
|
let currentPoint = new Point_1.Point(x, y);
|
|
let existingNode = this._nodes.getValue(currentPoint);
|
|
// found a node - set up teleport zone
|
|
if (existingNode != null) {
|
|
// Create/Update teleport node in existing node to new node
|
|
let teleportZoneFromExistingToNew = existingNode.TeleportZones.getValue(nodeInstance.Key);
|
|
if (teleportZoneFromExistingToNew == null) {
|
|
teleportZoneFromExistingToNew = new TeleportZone_1.TeleportZone(existingNode, TeleportZoneDirection_1.TeleportZoneDirection.North, currentPoint, currentPoint, existingNode.TeleportZones.size(), nodeInstance);
|
|
existingNode.TeleportZones.setValue(nodeInstance.Key, teleportZoneFromExistingToNew);
|
|
}
|
|
else {
|
|
teleportZoneFromExistingToNew.BottomRightCoordinate = currentPoint;
|
|
}
|
|
// Create/Update teleport node in new node to existing node
|
|
let teleportZoneFromNewToExisting = nodeInstance.TeleportZones.getValue(existingNode.Key);
|
|
let pointInNewNode = new Point_1.Point(currentPoint.X, currentPoint.Y - 1);
|
|
if (teleportZoneFromNewToExisting == null) {
|
|
teleportZoneFromNewToExisting = new TeleportZone_1.TeleportZone(nodeInstance, TeleportZoneDirection_1.TeleportZoneDirection.South, pointInNewNode, pointInNewNode, nodeInstance.TeleportZones.size(), existingNode);
|
|
nodeInstance.TeleportZones.setValue(existingNode.Key, teleportZoneFromNewToExisting);
|
|
}
|
|
else {
|
|
teleportZoneFromNewToExisting.BottomRightCoordinate = currentPoint;
|
|
}
|
|
}
|
|
}
|
|
// check west points
|
|
let x = topLeftCoordinate.X - 1;
|
|
for (let y = topLeftCoordinate.Y; y < topLeftCoordinate.Y + nodeInstance.Height; y++) {
|
|
let currentPoint = new Point_1.Point(x, y);
|
|
let existingNode = this._nodes.getValue(currentPoint);
|
|
// found a node - set up teleport zone
|
|
if (existingNode != null) {
|
|
// Create/Update teleport node in existing node to new node
|
|
let teleportZoneFromExistingToNew = existingNode.TeleportZones.getValue(nodeInstance.Key);
|
|
if (teleportZoneFromExistingToNew == null) {
|
|
teleportZoneFromExistingToNew = new TeleportZone_1.TeleportZone(existingNode, TeleportZoneDirection_1.TeleportZoneDirection.East, currentPoint, currentPoint, existingNode.TeleportZones.size(), nodeInstance);
|
|
existingNode.TeleportZones.setValue(nodeInstance.Key, teleportZoneFromExistingToNew);
|
|
}
|
|
else {
|
|
teleportZoneFromExistingToNew.BottomRightCoordinate = currentPoint;
|
|
}
|
|
// Create/Update teleport node in new node to existing node
|
|
let teleportZoneFromNewToExisting = nodeInstance.TeleportZones.getValue(existingNode.Key);
|
|
let pointInNewNode = new Point_1.Point(currentPoint.X + 1, currentPoint.Y);
|
|
if (teleportZoneFromNewToExisting == null) {
|
|
teleportZoneFromNewToExisting = new TeleportZone_1.TeleportZone(nodeInstance, TeleportZoneDirection_1.TeleportZoneDirection.West, pointInNewNode, pointInNewNode, nodeInstance.TeleportZones.size(), existingNode);
|
|
nodeInstance.TeleportZones.setValue(existingNode.Key, teleportZoneFromNewToExisting);
|
|
}
|
|
else {
|
|
teleportZoneFromNewToExisting.BottomRightCoordinate = currentPoint;
|
|
}
|
|
}
|
|
}
|
|
// check east points
|
|
x = topLeftCoordinate.X + nodeInstance.Width + 1;
|
|
for (let y = topLeftCoordinate.Y; y < topLeftCoordinate.Y + nodeInstance.Height; y++) {
|
|
let currentPoint = new Point_1.Point(x, y);
|
|
let existingNode = this._nodes.getValue(currentPoint);
|
|
// found a node - set up teleport zone
|
|
if (existingNode != null) {
|
|
// Create/Update teleport node in existing node to new node
|
|
let teleportZoneFromExistingToNew = existingNode.TeleportZones.getValue(nodeInstance.Key);
|
|
if (teleportZoneFromExistingToNew == null) {
|
|
teleportZoneFromExistingToNew = new TeleportZone_1.TeleportZone(existingNode, TeleportZoneDirection_1.TeleportZoneDirection.West, currentPoint, currentPoint, existingNode.TeleportZones.size(), nodeInstance);
|
|
existingNode.TeleportZones.setValue(nodeInstance.Key, teleportZoneFromExistingToNew);
|
|
}
|
|
else {
|
|
teleportZoneFromExistingToNew.BottomRightCoordinate = currentPoint;
|
|
}
|
|
// Create/Update teleport node in new node to existing node
|
|
let teleportZoneFromNewToExisting = nodeInstance.TeleportZones.getValue(existingNode.Key);
|
|
let pointInNewNode = new Point_1.Point(currentPoint.X - 1, currentPoint.Y);
|
|
if (teleportZoneFromNewToExisting == null) {
|
|
teleportZoneFromNewToExisting = new TeleportZone_1.TeleportZone(nodeInstance, TeleportZoneDirection_1.TeleportZoneDirection.East, pointInNewNode, pointInNewNode, nodeInstance.TeleportZones.size(), existingNode);
|
|
nodeInstance.TeleportZones.setValue(existingNode.Key, teleportZoneFromNewToExisting);
|
|
}
|
|
else {
|
|
teleportZoneFromNewToExisting.BottomRightCoordinate = currentPoint;
|
|
}
|
|
}
|
|
}
|
|
//#endregion
|
|
this._nodes.setValue(topLeftCoordinate, nodeInstance);
|
|
this._minX = Math.min(this._minX, topLeftCoordinate.X);
|
|
this._minY = Math.min(this._minY, topLeftCoordinate.Y);
|
|
this._maxX = Math.max(this._maxX, topLeftCoordinate.X + nodeInstance.Width);
|
|
this._maxY = Math.max(this._maxY, topLeftCoordinate.Y + nodeInstance.Height);
|
|
}
|
|
get Width() {
|
|
return this._maxX - this._minX;
|
|
}
|
|
get Height() {
|
|
return this._maxY - this._minY;
|
|
}
|
|
get TopLeftCoordinate() {
|
|
return new Point_1.Point(this._minX, this._minY);
|
|
}
|
|
get BottomRightCoordinate() {
|
|
return new Point_1.Point(this._maxX, this._maxY);
|
|
}
|
|
}
|
|
exports.Grid = Grid;
|
|
//# sourceMappingURL=Grid.js.map
|