public void GenerateCave(int x, int y, int steps, int size, sbyte dir) { int j = x, k = y; var dir2 = Globe.Pick(-1, 1); for (var i = 0; i < steps; i++) { var size2 = (size + Globe.Random(-1, 1)); for (var l = -size2; l < size2; l++) { if ((j + l) < 1) { continue; } if ((j + l) >= (Width - 1)) { break; } for (var m = -size2; m < size2; m++) { if ((k + m) < 1) { break; } if ((k + m) >= (Height - 1)) { break; } Tiles[(j + l), (k + m)].ForeID = 0; } } if (Globe.Chance(60)) { j += ((dir == 0) ? dir2 : dir); k += Globe.Random(1); } if (Globe.Chance(1, 200)) { dir2 = Globe.Pick(-1, 1); } } }
public void GenerateTree(int x, int y) { int height = y - Globe.Random(15, 25), leavesStyle = Globe.Pick(1, 2); for (var k = y; k >= height; k--) { if (k >= 0) { if (Tiles[x, k].ForeID > 0) { break; } if (k == height) { Tiles[x, k].Back = Tile.Types.Log; Tiles[x, k].Fore = Tile.Types.Leaves; if (leavesStyle == 1) { var width = x + 2; for (var j = x - 2; j <= width; j++) { if ((j >= 0) && (j < Tiles.GetLength(0))) { if (Tiles[j, k].Fore == Tile.Types.Log) { Tiles[j, k].Back = Tile.Types.Log; } Tiles[j, k].Fore = Tile.Types.Leaves; } } width = x + 1; k--; if (k >= 0) { for (var j = x - 1; j <= width; j++) { if ((j >= 0) && (j < Tiles.GetLength(0))) { if (Tiles[j, k].Fore == Tile.Types.Log) { Tiles[j, k].Back = Tile.Types.Log; } Tiles[j, k].Fore = Tile.Types.Leaves; } } } k--; if (k >= 0) { Tiles[x, k].Fore = Tile.Types.Leaves; } } else if (leavesStyle == 2) { var width = x + 1; height--; int treeHeight = y - height, leavesCut = Globe.Random(2, treeHeight / 2); for (var l = y - leavesCut; l >= height; l--) { for (var j = x - 1; j <= width; j++) { if ((j >= 0) && (j < Tiles.GetLength(0))) { if (Tiles[j, l].Fore == Tile.Types.Log) { Tiles[j, l].Back = Tile.Types.Log; } Tiles[j, l].Fore = Tile.Types.Leaves; } } } } } else { Tiles[x, k].Fore = Tile.Types.Log; if ((leavesStyle == 1) && (k < y) && (k > height + 1)) { bool left = (x > 0) && (Tiles[x - 1, k + 1].Fore != Tile.Types.Leaves) && Globe.Chance(20), right = (x < Tiles.GetLength(0) - 1) && (Tiles[x + 1, k + 1].Fore != Tile.Types.Leaves) && Globe.Chance(20); if (left && (Tiles[x - 1, k].ForeID == 0)) { Tiles[x - 1, k].Fore = Tile.Types.Leaves; } if (right && (Tiles[x + 1, k].ForeID == 0)) { Tiles[x + 1, k].Fore = Tile.Types.Leaves; } } } } } }
public static World Generate(int width, int height) { var world = new World(width, height); int minSurface = height / 4 - height / 10, maxSurface = height / 4 + height / 10, surface = Globe.Random(minSurface, maxSurface), surfaceLength = 0, treeSpace = width, underground = (surface + Globe.Random(14, 15)), jumpNorm = Globe.Pick(-1, 1), nextJump = -1; for (var x = 0; x < width; x++) { world.Tiles[x, 0].Fore = world.Tiles[x, height - 1].Fore = Tile.Types.Black; } for (var y = 0; y < height; y++) { world.Tiles[0, y].Fore = world.Tiles[width - 1, y].Fore = Tile.Types.Black; } var caves = new List <Cave>(); LoadingText = "Generating Terrain"; for (var x = 1; x < width - 1; x++) { if (x == width / 2) { world.Spawn = new Point(x, surface - 3); } for (var y = surface; y < height - 1; y++) { if (y == surface) { world.Tiles[x, y].Fore = world.Tiles[x, y].Back = Tile.Types.Dirt; world.Tiles[x, y].ForeStyle = 1; if ((treeSpace > 1) && Globe.Chance(20)) { world.GenerateTree(x, (y - 1)); treeSpace = -1; } } else if (y < underground) { world.Tiles[x, y].Fore = world.Tiles[x, y].Back = Tile.Types.Dirt; } else { world.Tiles[x, y].Fore = world.Tiles[x, y].Back = Tile.Types.Stone; if (Globe.Chance(1, (height - y))) { caves.Add(new Cave(x, y, Globe.Random(60, 180), Globe.Random(3, 4))); } } LoadingPercentage = ((((y + 1) + (x * (world.Height - 2))) / (float)((world.Width - 2) * (world.Height - 2))) * 100); } treeSpace++; surfaceLength++; if (nextJump > 0) { nextJump--; } if ((nextJump >= 0) && (nextJump < 15) && (jumpNorm == 1)) { underground += Globe.Pick(0, 1, 1, 2); } else if (underground < (surface + 15)) { underground += Globe.Pick(0, 1, 1, 2); } else if (underground > (surface + 15)) { underground -= Globe.Pick(0, 1, 1, 2); } else if (Globe.Chance(30)) { underground += Globe.Pick(-1, 0, 0, 0, 1); } if (Globe.Chance(30)) { var dif = Globe.Random(-1, 1); if (surfaceLength > 1) { if (nextJump <= 0) { dif = (Globe.Random(10, 20) * jumpNorm); if (dif != 0) { caves.Add(new Cave(x, (surface + (dif / 2)), Globe.Random(85, 195), Globe.Random(2, 4), (sbyte)((jumpNorm > 0) ? -1 : 1))); } nextJump = Globe.Random(40, 340); jumpNorm = Globe.Pick(-1, 1); } } else if (dif == 1) { if ((x > 0) && !world.Tiles[x - 1, surface].Fore.Matches(Tile.Types.Dirt)) { dif = Globe.Pick(-1, 0); } } else if (dif == -1) { if ((x > 0) && world.Tiles[x - 1, surface].Fore.Matches(Tile.Types.Dirt)) { dif = Globe.Pick(0, 1); } } if (dif != 0) { surface += dif; if (surface < minSurface) { surface = minSurface; } if (surface > maxSurface) { surface = maxSurface; } surfaceLength = 0; } } } LoadingText = "Generating Caves"; for (var i = 0; i < caves.Count; i++) { world.GenerateCave(caves[i].X, caves[i].Y, caves[i].Steps, caves[i].Size, caves[i].Dir); LoadingPercentage = (((i + 1) / (float)caves.Count) * 100); } Game.GenDone = true; return(world); }
public Point GetSpawn(byte Team) { return(Spawns[Team][Globe.Random(Spawns[Team].Count - 1)]); }
public Point GetWaypoint(byte Team) { return(Waypoints[Team][Globe.Random(Waypoints[Team].Count - 1)]); }
public static void Read(Packets Packet, NetIncomingMessage I) { switch (Packet) { case Packets.Connection: if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { var ClientVersion = I.ReadUInt64(); if (ClientVersion == Globe.Version) { var Connector = Player.Add(new Player(I.ReadString()) { Connection = I.SenderConnection }); if (Connector != null) { if ((GameType == GameTypes.TeamDeathmatch) || (GameType == GameTypes.TeamStandard)) { Connector.Team = (byte)((TeamCount(1) > TeamCount(2)) ? 2 : ((TeamCount(2) > TeamCount(1)) ? 1 : Globe.Random(1, 2))); } MultiPlayer.Send("Game", MultiPlayer.Construct("Game", Packet, Connector.Slot, Connector.Name, Connector.Team), I.SenderConnection); var Details = new List <object>(); Details.Add((byte)GameType); Details.Add(RespawnTimer); Details.Add(Connector.Team); for (byte i = 0; i < Players.Length; i++) { if ((Players[i] != null) && (Players[i] != Connector)) { Details.Add(true); Details.Add(Players[i].Name); Details.Add(Players[i].Team); } else { Details.Add(false); } } I.SenderConnection.Approve(MultiPlayer.Construct("Game", Packets.Initial, (byte)Players.Length, Connector.Slot, Details)); } else { I.SenderConnection.Deny("Full"); } } else { I.SenderConnection.Deny("Version indifference, Client: " + ClientVersion + " - Server: " + Globe.Version); } } else if (MultiPlayer.Type("Game") == MultiPlayer.Types.Client) { var Slot = I.ReadByte(); Player.Set(Slot, new Player(I.ReadString()) { Team = I.ReadByte() }); } break; case Packets.Disconnection: var Disconnector = ((MultiPlayer.Type("Game") == MultiPlayer.Types.Server) ? Player.Get(I.SenderConnection) : ((MultiPlayer.Type("Game") == MultiPlayer.Types.Client) ? Players[I.ReadByte()] : null)); if (Disconnector != null) { Player.Remove(Disconnector); } if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { MultiPlayer.Send("Game", MultiPlayer.Construct("Game", Packets.Disconnection, Disconnector.Slot), I.SenderConnection); } break; case Packets.Initial: if (MultiPlayer.Type("Game") == MultiPlayer.Types.Client) { Players = new Player[I.ReadByte()]; Self = Player.Set(I.ReadByte(), new Player(MpName)); GameType = (GameTypes)I.ReadByte(); RespawnTimer = I.ReadDouble(); Self.Team = I.ReadByte(); for (byte i = 0; i < Players.Length; i++) { if (I.ReadBoolean()) { Players[i] = new Player(i, I.ReadString()) { Team = I.ReadByte() }; } } State = States.RequestMap; Timers.Add("Positions", (1 / 30d)); } break; case Packets.RequestMap: if (MultiPlayer.Type() == MultiPlayer.Types.Server) { List <object> Details = new List <object>(); Details.AddRange(GetSyncedMap); Details.Add((byte)State); MultiPlayer.SendTo(MultiPlayer.Construct(Packet, Details), I.SenderConnection); } else if (MultiPlayer.Type() == MultiPlayer.Types.Client) { Map = ReadSyncedMap(I); State = (States)I.ReadByte(); } break; case Packets.Position: var Sender = ((MultiPlayer.Type("Game") == MultiPlayer.Types.Server) ? Player.Get(I.SenderConnection) : null); Vector2 Position; float Angle; if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { if (Sender != null) { Sender.Position = I.ReadVector2(); Sender.Angle = I.ReadFloat(); } } else if (MultiPlayer.Type("Game") == MultiPlayer.Types.Client) { var Count = (byte)((I.LengthBytes - 1) / 12); for (byte i = 0; i < Count; i++) { Sender = Players[I.ReadByte()]; Position = I.ReadVector2(); Angle = I.ReadFloat(); if (Sender != null) { Sender.Position = Position; Sender.Angle = Angle; } } } break; case Packets.PlaceFore: byte ID = I.ReadByte(); ushort x = I.ReadUInt16(), y = I.ReadUInt16(); byte TAngle = I.ReadByte(); Map.PlaceFore(ID, x, y, TAngle); if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, ID, x, y, TAngle), I.SenderConnection); } break; case Packets.ClearFore: x = I.ReadUInt16(); y = I.ReadUInt16(); Map.ClearFore(x, y); if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, x, y), I.SenderConnection); } break; case Packets.PlaceBack: ID = I.ReadByte(); x = I.ReadUInt16(); y = I.ReadUInt16(); Map.PlaceBack(ID, x, y); if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, ID, x, y), I.SenderConnection); } break; case Packets.ClearBack: x = I.ReadUInt16(); y = I.ReadUInt16(); Map.ClearBack(x, y); if (MultiPlayer.Type("Game") == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, x, y), I.SenderConnection); } break; case Packets.Fire: Sender = ((MultiPlayer.Type("Game") == MultiPlayer.Types.Server) ? Player.Get(I.SenderConnection) : Players[I.ReadByte()]); Position = I.ReadVector2(); Angle = I.ReadFloat(); Sender.Fire(Position, Angle); if (MultiPlayer.Type() == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, Sender.Slot, Position, Angle), I.SenderConnection); } break; case Packets.Death: Sender = ((MultiPlayer.Type("Game") == MultiPlayer.Types.Server) ? Player.Get(I.SenderConnection) : Players[I.ReadByte()]); Sender.Killer = Players[I.ReadByte()]; Sender.Die(); if (MultiPlayer.Type() == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, Sender.Slot, Sender.Killer.Slot), I.SenderConnection); } break; case Packets.Respawn: Sender = ((MultiPlayer.Type("Game") == MultiPlayer.Types.Server) ? Player.Get(I.SenderConnection) : Players[I.ReadByte()]); Position = I.ReadVector2(); Sender.Respawn(Position); if (MultiPlayer.Type() == MultiPlayer.Types.Server) { MultiPlayer.Send(MultiPlayer.Construct(Packet, Sender.Slot, Position), I.SenderConnection); } break; case Packets.EndRound: VictoryStates VictoryState = (VictoryStates)I.ReadByte(); byte TeamWon = ((VictoryState == VictoryStates.Team) ? I.ReadByte() : (byte)0); byte RoundEndMusicIndex = I.ReadByte(); EndRound(VictoryState, TeamWon, RoundEndMusicIndex); break; case Packets.NewRound: NewRound(); break; } }