public PathfinderConnection(PathfinderConnection SourceConnection) { this.Layer_ConnectionNum = -1; this.NodeA_ConnectionNum = -1; this.NodeB_ConnectionNum = -1; this.Value = 1f; this.CalcValueNum = -1; this.NodeA = SourceConnection.NodeA.ParentNode; this.NodeB = SourceConnection.NodeB.ParentNode; this.NodeA.Connection_Add(this, ref this.NodeA_ConnectionNum); this.NodeB.Connection_Add(this, ref this.NodeB_ConnectionNum); this.NodeA.Layer.Connection_Add(this); this.ValueCalc(); }
public void Connection_Add(PathfinderConnection NewConnection) { if (this.Connections.GetUpperBound(0) < this.ConnectionCount) { this.Connections = (PathfinderConnection[]) Utils.CopyArray((Array) this.Connections, new PathfinderConnection[(((this.ConnectionCount + 1) * 2) - 1) + 1]); } this.Connections[this.ConnectionCount] = NewConnection; this.Connections[this.ConnectionCount].Layer_ConnectionNum = this.ConnectionCount; this.ConnectionCount++; }
public clsResult GenerateRamps() { int num; int num6; int num7; int num9; clsResult result2 = new clsResult("Ramps"); int num13 = this.ConnectionCount - 1; for (num = 0; num <= num13; num++) { this.Connections[num].IsRamp = false; } clsPassageNodeNework nework = this.MakePassageNodeNetwork(); PathfinderNode[,] passageNodePathNodes = nework.PassageNodePathNodes; clsConnection[] connectionArray = new clsConnection[(this.ConnectionCount - 1) + 1]; PathfinderNode[] startNodes = new PathfinderNode[1]; bool[] flagArray = new bool[(this.ConnectionCount - 1) + 1]; int num14 = this.ConnectionCount - 1; int index = 0; while (index <= num14) { if (Math.Abs((int) (this.Connections[index].PassageNodeA.Level - this.Connections[index].PassageNodeB.Level)) == 1) { if ((!(this.Connections[index].PassageNodeA.IsOnBorder | this.Connections[index].PassageNodeB.IsOnBorder) & (this.Connections[index].PassageNodeA.MirrorNum == 0)) & (this.Connections[index].PassageNodeA.Num != this.Connections[index].PassageNodeB.Num)) { flagArray[index] = true; } else { flagArray[index] = false; } } else { flagArray[index] = false; } index++; } clsNodeConnectedness connectedness = new clsNodeConnectedness { NodeConnectedness = new float[(this.PassageNodeCount - 1) + 1], PassageNodeVisited = new bool[(this.SymmetryBlockCount - 1) + 1, (this.PassageNodeCount - 1) + 1], PassageNodePathNodes = passageNodePathNodes, PassageNodePathMap = nework.Network }; PathfinderConnection[] connectionArray2 = new PathfinderConnection[4]; clsUpdateNodeConnectednessArgs args3 = new clsUpdateNodeConnectednessArgs(); clsUpdateNetworkConnectednessArgs args2 = new clsUpdateNetworkConnectednessArgs(); args3.Args = connectedness; args2.Args = connectedness; args2.PassageNodeUpdated = new bool[(this.PassageNodeCount - 1) + 1]; args2.SymmetryBlockCount = this.SymmetryBlockCount; int num15 = this.PassageNodeCount - 1; for (num = 0; num <= num15; num++) { connectedness.NodeConnectedness[num] = 0f; int num16 = this.PassageNodeCount - 1; for (index = 0; index <= num16; index++) { int num17 = this.SymmetryBlockCount - 1; num7 = 0; while (num7 <= num17) { connectedness.PassageNodeVisited[num7, index] = false; num7++; } } args3.OriginalNode = this.PassageNodes[0, num]; this.UpdateNodeConnectedness(args3, this.PassageNodes[0, num]); } Label_0269: num6 = -1; double num4 = 1.0; double num5 = 0.0; int num10 = 0; int num18 = this.ConnectionCount - 1; index = 0; while (index <= num18) { if (flagArray[index] & !this.Connections[index].IsRamp) { if (this.CheckRampAngles(this.Connections[index], 1.3962634015954636, 2.0943951023931953, 0.0)) { modMath.sXY_int _int; startNodes[0] = passageNodePathNodes[this.Connections[index].PassageNodeA.MirrorNum, this.Connections[index].PassageNodeA.Num]; PathfinderNetwork.PathList[] listArray = nework.Network.GetPath(startNodes, passageNodePathNodes[this.Connections[index].PassageNodeB.MirrorNum, this.Connections[index].PassageNodeB.Num], -1, 0); double maxValue = double.MaxValue; _int.X = (int) Math.Round((double) (((double) (this.Connections[index].PassageNodeA.Pos.X + this.Connections[index].PassageNodeB.Pos.X)) / 2.0)); _int.Y = (int) Math.Round((double) (((double) (this.Connections[index].PassageNodeA.Pos.Y + this.Connections[index].PassageNodeB.Pos.Y)) / 2.0)); int num19 = this.TotalPlayerCount - 1; num9 = 0; while (num9 <= num19) { modMath.sXY_int _int2 = this.PlayerBases[num9].Pos - _int; double magnitude = _int2.ToDoubles().GetMagnitude(); if (magnitude < maxValue) { maxValue = magnitude; } num9++; } double num11 = Math.Max((double) (this.MaxDisconnectionDist * Math.Pow(this.RampBase, maxValue / 1024.0)), (double) 1.0); if (listArray == null) { double num12 = connectedness.NodeConnectedness[this.Connections[index].PassageNodeA.Num] + connectedness.NodeConnectedness[this.Connections[index].PassageNodeB.Num]; if (double.MaxValue > num4) { num4 = double.MaxValue; num5 = num12; connectionArray[0] = this.Connections[index]; num10 = 1; } else if (num12 < num5) { num5 = num12; connectionArray[0] = this.Connections[index]; num10 = 1; } else if (num12 == num5) { connectionArray[num10] = this.Connections[index]; num10++; } } else { if (listArray[0].PathCount != 1) { result2.ProblemAdd("Error: Invalid number of routes returned."); goto Label_088A; } if ((((double) listArray[0].Paths[0].Value) / num11) > num4) { num4 = ((double) listArray[0].Paths[0].Value) / num11; connectionArray[0] = this.Connections[index]; num10 = 1; } else if ((((double) listArray[0].Paths[0].Value) / num11) == num4) { connectionArray[num10] = this.Connections[index]; num10++; } else if (listArray[0].Paths[0].Value <= num11) { flagArray[index] = false; } } } else { flagArray[index] = false; } } else { flagArray[index] = false; } index++; } if (num10 > 0) { num6 = (int) Math.Round((double) ((float) (App.Random.Next() * num10))); connectionArray[num6].IsRamp = true; clsPassageNode passageNodeA = connectionArray[num6].PassageNodeA; clsPassageNode passageNodeB = connectionArray[num6].PassageNodeB; PathfinderNode nodeA = passageNodePathNodes[passageNodeA.MirrorNum, passageNodeA.Num]; PathfinderNode otherNode = passageNodePathNodes[passageNodeB.MirrorNum, passageNodeB.Num]; PathfinderConnection connection = nodeA.CreateConnection(otherNode, this.GetNodePosDist(nodeA, otherNode)); int num20 = connectionArray[num6].ReflectionCount - 1; for (num7 = 0; num7 <= num20; num7++) { connectionArray[num6].Reflections[num7].IsRamp = true; passageNodeA = connectionArray[num6].Reflections[num7].PassageNodeA; passageNodeB = connectionArray[num6].Reflections[num7].PassageNodeB; nodeA = passageNodePathNodes[passageNodeA.MirrorNum, passageNodeA.Num]; otherNode = passageNodePathNodes[passageNodeB.MirrorNum, passageNodeB.Num]; connection = nodeA.CreateConnection(otherNode, this.GetNodePosDist(nodeA, otherNode)); } nework.Network.FindCalc(); int num21 = this.PassageNodeCount - 1; for (num9 = 0; num9 <= num21; num9++) { args2.PassageNodeUpdated[num9] = false; } if (connectionArray[num6].PassageNodeA.MirrorNum == 0) { this.UpdateNetworkConnectedness(args2, connectionArray[num6].PassageNodeA); goto Label_0269; } if (connectionArray[num6].PassageNodeB.MirrorNum == 0) { this.UpdateNetworkConnectedness(args2, connectionArray[num6].PassageNodeB); goto Label_0269; } result2.ProblemAdd("Error: Initial ramp not in area 0."); } else { PathfinderNetwork.sFloodProximityArgs args; args.StartNode = nework.PassageNodePathNodes[0, 0]; args.NodeValues = nework.Network.NetworkLargeArrays.Nodes_ValuesA; int num22 = this.PassageNodeCount - 1; for (num = 0; num <= num22; num++) { int num23 = this.SymmetryBlockCount - 1; index = 0; while (index <= num23) { args.NodeValues[nework.PassageNodePathNodes[index, num].Layer_NodeNum] = float.MaxValue; index++; } } nework.Network.FloodProximity(ref args); int num24 = this.PassageNodeCount - 1; for (num = 0; num <= num24; num++) { int num25 = this.SymmetryBlockCount - 1; for (index = 0; index <= num25; index++) { if (!this.PassageNodes[index, num].IsWater && (args.NodeValues[nework.PassageNodePathNodes[index, num].Layer_NodeNum] == float.MaxValue)) { result2.ProblemAdd("Land is unreachable. Reduce variation or retry."); break; } } } } Label_088A: nework.Network.Deallocate(); return result2; }
public void Connection_Add(PathfinderConnection Connection, ref int OutputNum) { OutputNum = this.ConnectionCount; if (this.Connections.GetUpperBound(0) < this.ConnectionCount) { this.Connections = (PathfinderConnection[]) Utils.CopyArray((Array) this.Connections, new PathfinderConnection[((this.ConnectionCount * 2) + 1) + 1]); } this.Connections[this.ConnectionCount] = Connection; this.ConnectionCount++; if (this.ParentNode == null) { this.Layer.Network.FindParentNode_Add(this); } }
public void UnlinkParentDependants() { if (this.DependantConnection != null) { PathfinderConnection dependantConnection = this.DependantConnection; this.DependantConnection = null; dependantConnection.LinkDecrease(); } }
public void RaiseDependant() { if ((this.DependantConnection == null) && ((this.NodeA.ParentNode != this.NodeB.ParentNode) && ((this.NodeA.ParentNode != null) & (this.NodeB.ParentNode != null)))) { PathfinderConnection connection = this.NodeA.ParentNode.FindConnection(this.NodeB.ParentNode); if (connection == null) { this.DependantConnection = new PathfinderConnection(this); this.DependantConnection.LinkIncrease(); this.DependantConnection.RaiseDependant(); } else { this.DependantConnection = connection; this.DependantConnection.LinkIncrease(); } } }
public void ForceDeallocate() { this.DependantConnection = null; this.NodeA = null; this.NodeB = null; }