diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index 80eaad3a3f..e274de0557 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -145,7 +145,6 @@ namespace OpenRA.Graphics for (var i = 0; i < renderables.Count; i++) renderables[i].Render(this); - // added for contrails foreach (var a in World.ActorsWithTrait()) if (a.Actor.IsInWorld && !a.Actor.Disposed) a.Trait.RenderAfterWorld(this, a.Actor); diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 01677cfd03..2ee5cfb76c 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -304,6 +304,7 @@ namespace OpenRA.Traits } public interface IPostRender { void RenderAfterWorld(WorldRenderer wr, Actor self); } + public interface IRenderShroud { void RenderShroud(WorldRenderer wr, Shroud shroud); } public interface IPostRenderSelection { IEnumerable RenderAfterWorld(WorldRenderer wr); } diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj index 4fbdae0ae0..7ff12e31dc 100644 --- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj +++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj @@ -522,6 +522,7 @@ + diff --git a/OpenRA.Mods.Common/Traits/World/WeatherOverlay.cs b/OpenRA.Mods.Common/Traits/World/WeatherOverlay.cs new file mode 100644 index 0000000000..4b43e24a4d --- /dev/null +++ b/OpenRA.Mods.Common/Traits/World/WeatherOverlay.cs @@ -0,0 +1,310 @@ +#region Copyright & License Information +/* + * Copyright 2007-2015 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation. For more information, + * see COPYING. + */ +#endregion + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using OpenRA.Graphics; +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + [Desc("Adds a particle-based overlay.")] + public class WeatherOverlayInfo : ITraitInfo + { + [Desc("Factor for particle density. As higher as more particles will get spawned.")] + public readonly float ParticleDensityFactor = 0.0007625f; + + [Desc("Should the level of the wind change over time, or just stick to the first value of WindLevels?")] + public readonly bool ChangingWindLevel = true; + + [Desc("The levels of wind intensity (particles x-axis movement in px/tick).")] + public readonly int[] WindLevels = { -5, -3, -2, 0, 2, 3, 5 }; + + [Desc("Works only if ChangingWindLevel is enabled. Min. and max. ticks needed to change the WindLevel.")] + public readonly int[] WindTick = { 150, 750 }; + + [Desc("Hard or soft fading between the WindLevels.")] + public readonly bool InstantWindChanges = false; + + [Desc("Particles are drawn in squares when enabled, else with lines.")] + public readonly bool UseSquares = true; + + [Desc("Works only with squares enabled. Size min. and max. value in pixels.")] + public readonly int[] PaticleSize = { 1, 3 }; + + [Desc("Scatters falling direction on the x-axis. Scatter min. and max. value in px/tick.")] + public readonly int[] ScatterDirection = { -1, 1 }; + + [Desc("Min. and max. speed at which particles fall in px/tick.")] + public readonly float[] Gravity = { 1.00f, 2.00f }; + + [Desc("The current offset value for the swing movement. SwingOffset min. and max. value in px/tick.")] + public readonly float[] SwingOffset = { 1.0f, 1.5f }; + + [Desc("The value that particles swing to the side each update. SwingSpeed min. and max. value in px/tick.")] + public readonly float[] SwingSpeed = { 0.001f, 0.025f }; + + [Desc("The value range that can be swung to the left or right. SwingAmplitude min. and max. value in px/tick.")] + public readonly float[] SwingAmplitude = { 1.0f, 1.5f }; + + [Desc("The randomly selected ArgbColors for the particles. Use this order: a,r,g,b, a,r,g,b, a,...")] + public readonly Color[] ParticleColors = { + Color.FromArgb(255, 236, 236, 236), + Color.FromArgb(255, 228, 228, 228), + Color.FromArgb(255, 208, 208, 208), + Color.FromArgb(255, 188, 188, 188) + }; + + [Desc("Works only with line enabled and can get used to fade out the tail of the line like a contrail.")] + public readonly byte LineTailAlphaValue = 200; + + public object Create(ActorInitializer init) { return new WeatherOverlay(init.World, this); } + } + + public class WeatherOverlay : ITick, IPostRender + { + readonly WeatherOverlayInfo info; + readonly World world; + struct Particle + { + public float PosX; + public float PosY; + public int Size; + public float DirectionScatterX; + public float Gravity; + public float SwingOffset; + public float SwingSpeed; + public int SwingDirection; + public float SwingAmplitude; + public Color Color; + public Color TailColor; + } + + readonly List particleList = new List(); + readonly int maxParticleCount; + + enum ParticleCountFaderType { Hold, FadeIn, FadeOut } + ParticleCountFaderType particleCountFader = ParticleCountFaderType.FadeIn; + + float targetWindXOffset = 0f; + float currentWindXOffset = 0f; + int currentWindIndex = 0; + long windTickCountdown = 1500; + float2 antiScrollPrevTopLeft; + + public WeatherOverlay(World world, WeatherOverlayInfo info) + { + this.info = info; + this.world = world; + currentWindIndex = info.WindLevels.Length / 2; + targetWindXOffset = info.WindLevels[0]; + maxParticleCount = CalculateParticleCount(Game.Renderer.Resolution.Width, Game.Renderer.Resolution.Height); + } + + int CalculateParticleCount(int x, int y) + { + return (int)(x * y * info.ParticleDensityFactor); + } + + void SpawnParticles(int count, int rangeY, int spawnChancePercent) + { + for (var i = 0; i < count; i++) + { + if (Game.CosmeticRandom.Next(100) < spawnChancePercent) + { + var tempColor = info.ParticleColors.Random(Game.CosmeticRandom); + var tempColorTail = Color.FromArgb(info.LineTailAlphaValue, tempColor.R, tempColor.G, tempColor.B); + var tempSwingDirection = Game.CosmeticRandom.Next(2) == 0 ? 1 : -1; + + particleList.Add( + new Particle + { + PosX = Game.CosmeticRandom.Next(Game.Renderer.Resolution.Width), + PosY = Game.CosmeticRandom.Next(rangeY), + Size = Game.CosmeticRandom.Next(info.PaticleSize[0], info.PaticleSize[1] + 1), + DirectionScatterX = info.ScatterDirection[0] + Game.CosmeticRandom.Next(info.ScatterDirection[1] - info.ScatterDirection[0]), + Gravity = float2.Lerp(info.Gravity[0], info.Gravity[1], Game.CosmeticRandom.NextFloat()), + SwingOffset = float2.Lerp(info.SwingOffset[0], info.SwingOffset[1], Game.CosmeticRandom.NextFloat()), + SwingSpeed = float2.Lerp(info.SwingSpeed[0], info.SwingSpeed[1], Game.CosmeticRandom.NextFloat()), + SwingDirection = tempSwingDirection, + SwingAmplitude = float2.Lerp(info.SwingAmplitude[0], info.SwingAmplitude[1], Game.CosmeticRandom.NextFloat()), + Color = tempColor, + TailColor = tempColorTail + }); + } + } + } + + void ParticlesCountLogic(WorldRenderer wr) + { + // Logic to switch between the states of the particleCountFader + if (particleCountFader == ParticleCountFaderType.Hold && particleList.Count < maxParticleCount) + particleCountFader = ParticleCountFaderType.FadeIn; + else if (particleCountFader == ParticleCountFaderType.FadeIn && particleList.Count >= maxParticleCount) + particleCountFader = ParticleCountFaderType.Hold; + else if (particleCountFader == ParticleCountFaderType.FadeOut && particleList.Count == 0) + particleCountFader = ParticleCountFaderType.Hold; + + // Do the fade functions + if (particleCountFader == ParticleCountFaderType.FadeIn) + FadeInParticleCount(wr); + else if (particleCountFader == ParticleCountFaderType.FadeOut) + FadeOutParticleCount(wr); + } + + void FadeInParticleCount(WorldRenderer wr) + { + SpawnParticles(1, 0, 100); + + // Remove Particles, which are getting replaced from the top to the bottom by the "EdgeCheckReplace", + // when scrolling down, as long as the FadeIn is not completed, + // to avoid having particles at the top and bottom, but not in the middle of the screen. + for (var i = 0; i < particleList.Count; i++) + if (particleList[i].PosY < 0) + particleList.RemoveAt(i); + + // Add Particles when the weather is fading in and scrolling up, to fill areas above + if (antiScrollPrevTopLeft.Y > wr.Viewport.TopLeft.Y) + { + // Get delta Y and limit to the max value + var tempRangeY = antiScrollPrevTopLeft.Y - wr.Viewport.TopLeft.Y; + var tempParticleCount = CalculateParticleCount(Game.Renderer.Resolution.Width, (int)tempRangeY); + if (particleList.Count + tempParticleCount > maxParticleCount) + tempParticleCount = maxParticleCount - particleList.Count; + + SpawnParticles(tempParticleCount, (int)tempRangeY, 50); + } + } + + void FadeOutParticleCount(WorldRenderer wr) + { + for (var i = 0; i < particleList.Count; i++) + if (particleList[i].PosY > (Game.Renderer.Resolution.Height - particleList[i].Gravity)) + particleList.RemoveAt(i); + } + + void XAxisSwing(ref Particle tempParticle) + { + // Direction turn + if (tempParticle.SwingOffset < -tempParticle.SwingAmplitude || tempParticle.SwingOffset > tempParticle.SwingAmplitude) + tempParticle.SwingDirection *= -1; + + // Perform the X-Axis-Swing + tempParticle.SwingOffset += tempParticle.SwingDirection * tempParticle.SwingSpeed; + } + + public void Tick(Actor self) + { + windTickCountdown--; + } + + void WindLogic(ref Particle tempParticle) + { + if (!info.ChangingWindLevel) + targetWindXOffset = info.WindLevels[0]; + else if (windTickCountdown <= 0) + { + windTickCountdown = Game.CosmeticRandom.Next(info.WindTick[0], info.WindTick[1]); + if (Game.CosmeticRandom.Next(2) == 1 && currentWindIndex > 0) + { + currentWindIndex--; + targetWindXOffset = info.WindLevels[currentWindIndex]; + } + else if (currentWindIndex < info.WindLevels.Length - 1) + { + currentWindIndex++; + targetWindXOffset = info.WindLevels[currentWindIndex]; + } + } + + // Fading the wind in little steps towards the TargetWindOffset + if (info.InstantWindChanges) + currentWindXOffset = targetWindXOffset; + else if (currentWindXOffset != targetWindXOffset) + { + if (currentWindXOffset > targetWindXOffset) + currentWindXOffset -= 0.00001f; + else if (currentWindXOffset < targetWindXOffset) + currentWindXOffset += 0.00001f; + } + } + + void Movement(ref Particle tempParticle) + { + tempParticle.PosX += tempParticle.DirectionScatterX + tempParticle.SwingOffset + currentWindXOffset; + tempParticle.PosY += tempParticle.Gravity; + } + + // AntiScroll keeps the particles in place when scrolling the viewport + void AntiScroll(ref Particle tempParticle, WorldRenderer wr) + { + tempParticle.PosX += antiScrollPrevTopLeft.X - wr.Viewport.TopLeft.X; + tempParticle.PosY += antiScrollPrevTopLeft.Y - wr.Viewport.TopLeft.Y; + } + + void EdgeCheckReplace(ref Particle tempParticle, WorldRenderer wr) + { + tempParticle.PosX %= Game.Renderer.Resolution.Width; + if (tempParticle.PosX < 0) + tempParticle.PosX += Game.Renderer.Resolution.Width; + + tempParticle.PosY %= Game.Renderer.Resolution.Height; + if (tempParticle.PosY < 0 && particleCountFader != ParticleCountFaderType.FadeIn) + tempParticle.PosY += Game.Renderer.Resolution.Height; + } + + void UpdateWeatherOverlay(WorldRenderer wr) + { + ParticlesCountLogic(wr); + + for (var i = 0; i < particleList.Count; i++) + { + Particle tempParticle = particleList[i]; + + XAxisSwing(ref tempParticle); + WindLogic(ref tempParticle); + Movement(ref tempParticle); + AntiScroll(ref tempParticle, wr); + EdgeCheckReplace(ref tempParticle, wr); + + particleList[i] = tempParticle; + } + + antiScrollPrevTopLeft = wr.Viewport.TopLeft; + } + + void DrawWeatherOverlay(WorldRenderer wr) + { + var topLeft = wr.Viewport.TopLeft; + foreach (var item in particleList) + { + var tempPos = new float2(item.PosX + topLeft.X, item.PosY + topLeft.Y); + + if (info.UseSquares) + Game.Renderer.WorldQuadRenderer.FillRect(new RectangleF(tempPos.X, tempPos.Y, item.Size, item.Size), item.Color); + else + { + var tempPosTail = new float2(topLeft.X + item.PosX - currentWindXOffset, item.PosY - (item.Gravity * 2 / 3) + topLeft.Y); + Game.Renderer.WorldLineRenderer.DrawLine(tempPos, tempPosTail, item.Color, item.TailColor); + } + } + } + + public void RenderAfterWorld(WorldRenderer wr, Actor self) + { + if (!world.Paused) + UpdateWeatherOverlay(wr); + + DrawWeatherOverlay(wr); + } + } +} diff --git a/mods/ra/maps/fort-lonestar/map.yaml b/mods/ra/maps/fort-lonestar/map.yaml index 5a122b4ceb..c32d4787c9 100644 --- a/mods/ra/maps/fort-lonestar/map.yaml +++ b/mods/ra/maps/fort-lonestar/map.yaml @@ -501,6 +501,21 @@ Rules: CrateActors: fortcrate -SpawnMPUnits: -MPStartLocations: + WeatherOverlay: + ParticleDensityFactor: 0.0007625 + ChangingWindLevel: true + WindLevels: -5, -3, -2, 0, 2, 3, 5 + WindTick: 150, 550 + InstantWindChanges: false + UseSquares: false + PaticleSize: 0, 0 + ScatterDirection: 0, 0 + Gravity: 8.00, 12.00 + SwingOffset: 0, 0 + SwingSpeed: 0, 0 + SwingAmplitude: 0, 0 + ParticleColors: 255,48,64,116, 255,40,56,108, 255,32,44,96, 255,24,44,84 + LineTailAlphaValue: 150 GlobalLightingPaletteEffect: Red: 0.75 Green: 0.85 diff --git a/mods/ra/maps/snow town.oramap b/mods/ra/maps/snow town.oramap deleted file mode 100644 index b99cb56e82..0000000000 Binary files a/mods/ra/maps/snow town.oramap and /dev/null differ diff --git a/mods/ra/maps/snow town/map.bin b/mods/ra/maps/snow town/map.bin new file mode 100644 index 0000000000..7decc8ecd8 Binary files /dev/null and b/mods/ra/maps/snow town/map.bin differ diff --git a/mods/ra/maps/snow town/map.yaml b/mods/ra/maps/snow town/map.yaml new file mode 100644 index 0000000000..5fd4fca9f1 --- /dev/null +++ b/mods/ra/maps/snow town/map.yaml @@ -0,0 +1,695 @@ +MapFormat: 7 + +RequiresMod: ra + +Title: Snow Town + +Description: 3v3 + +Author: MicroBit + +Tileset: SNOW + +MapSize: 128,128 + +Bounds: 16,16,96,96 + +Visibility: Lobby + +Type: Conquest + +Videos: + +Options: + +Players: + PlayerReference@Neutral: + Name: Neutral + OwnsWorld: True + NonCombatant: True + Faction: allies + PlayerReference@Multi0: + Name: Multi0 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi1: + Name: Multi1 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi2: + Name: Multi2 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi3: + Name: Multi3 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi4: + Name: Multi4 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Multi5: + Name: Multi5 + Playable: True + Faction: Random + Enemies: Creeps + PlayerReference@Creeps: + Name: Creeps + NonCombatant: True + Faction: allies + Enemies: Multi0, Multi1, Multi2, Multi3, Multi4, Multi5 + +Actors: + Actor12: v10 + Location: 63,62 + Owner: Neutral + Actor20: v04 + Location: 61,66 + Owner: Neutral + Actor21: v12 + Location: 67,62 + Owner: Neutral + Actor22: v13 + Location: 65,60 + Owner: Neutral + Actor23: v05 + Location: 67,59 + Owner: Neutral + Actor24: t07 + Location: 65,57 + Owner: Neutral + Actor25: t05 + Location: 65,66 + Owner: Neutral + Actor13: v11 + Location: 65,65 + Owner: Neutral + Actor47: ice01 + Location: 22,107 + Owner: Neutral + Actor32: v06 + Location: 59,61 + Owner: Neutral + Actor50: tanktrap2 + Location: 46,75 + Owner: Neutral + Actor31: v03 + Location: 58,63 + Owner: Neutral + Actor30: v01 + Location: 65,62 + Owner: Neutral + Actor26: t02 + Location: 61,60 + Owner: Neutral + Actor0: v08 + Location: 63,63 + Owner: Neutral + Actor8: tc04 + Location: 69,54 + Owner: Neutral + Actor138: mine + Location: 45,24 + Owner: Neutral + Actor7: tc04 + Location: 54,58 + Owner: Neutral + Actor5: mine + Location: 45,48 + Owner: Neutral + Actor4: mine + Location: 106,103 + Owner: Neutral + Actor3: mine + Location: 82,79 + Owner: Neutral + Actor14: v17 + Location: 66,65 + Owner: Neutral + Actor18: v18 + Location: 67,66 + Owner: Neutral + Actor17: v18 + Location: 67,65 + Owner: Neutral + Actor19: brl3 + Location: 63,65 + Owner: Neutral + Actor16: v11 + Location: 59,69 + Owner: Neutral + Actor45: ice05 + Location: 106,26 + Owner: Neutral + Actor15: v17 + Location: 66,66 + Owner: Neutral + Actor11: t07 + Location: 72,70 + Owner: Neutral + Actor10: t07 + Location: 59,74 + Owner: Neutral + Actor9: t05 + Location: 55,75 + Owner: Neutral + Actor41: mpspawn + Location: 104,59 + Owner: Neutral + Actor43: mpspawn + Location: 63,103 + Owner: Neutral + Actor29: t06 + Location: 58,61 + Owner: Neutral + Actor28: tc05 + Location: 59,58 + Owner: Neutral + Actor27: t02 + Location: 62,59 + Owner: Neutral + Actor44: ice02 + Location: 99,22 + Owner: Neutral + Actor49: ice03 + Location: 19,107 + Owner: Neutral + Actor46: ice03 + Location: 102,27 + Owner: Neutral + Actor48: ice04 + Location: 18,99 + Owner: Neutral + Actor42: mpspawn + Location: 94,91 + Owner: Neutral + Actor40: mpspawn + Location: 65,24 + Owner: Neutral + Actor1: mpspawn + Location: 21,68 + Owner: Neutral + Actor2: mpspawn + Location: 33,36 + Owner: Neutral + Actor39: ice04 + Location: 98,24 + Owner: Neutral + Actor38: t10 + Location: 101,21 + Owner: Neutral + Actor35: oilb + Location: 103,22 + Owner: Neutral + Actor36: t03 + Location: 104,20 + Owner: Neutral + Actor37: t06 + Location: 105,21 + Owner: Neutral + Actor34: t07 + Location: 21,101 + Owner: Neutral + Actor33: oilb + Location: 19,102 + Owner: Neutral + Actor51: tanktrap2 + Location: 43,77 + Owner: Neutral + Actor52: tanktrap2 + Location: 51,74 + Owner: Neutral + Actor53: tanktrap2 + Location: 53,70 + Owner: Neutral + Actor54: utilpol1 + Location: 57,64 + Owner: Neutral + Actor55: utilpol2 + Location: 63,57 + Owner: Neutral + Actor56: utilpol2 + Location: 66,68 + Owner: Neutral + Actor57: utilpol2 + Location: 62,68 + Owner: Neutral + Actor58: utilpol1 + Location: 69,71 + Owner: Neutral + Actor59: tc03 + Location: 67,71 + Owner: Neutral + Actor60: tc03 + Location: 71,56 + Owner: Neutral + Actor61: fenc + Location: 41,77 + Owner: Neutral + Actor62: fenc + Location: 42,77 + Owner: Neutral + Actor63: fenc + Location: 48,75 + Owner: Neutral + Actor64: fenc + Location: 45,75 + Owner: Neutral + Actor65: fenc + Location: 52,69 + Owner: Neutral + Actor66: fenc + Location: 52,70 + Owner: Neutral + Actor67: fenc + Location: 55,73 + Owner: Neutral + Actor68: fenc + Location: 54,74 + Owner: Neutral + Actor69: fenc + Location: 55,74 + Owner: Neutral + Actor70: tc05 + Location: 67,51 + Owner: Neutral + Actor71: tc04 + Location: 68,48 + Owner: Neutral + Actor72: tc01 + Location: 74,46 + Owner: Neutral + Actor73: tc02 + Location: 75,52 + Owner: Neutral + Actor74: tc02 + Location: 71,51 + Owner: Neutral + Actor75: tc03 + Location: 73,45 + Owner: Neutral + Actor76: tc04 + Location: 78,49 + Owner: Neutral + Actor77: tc04 + Location: 77,47 + Owner: Neutral + Actor78: t11 + Location: 74,42 + Owner: Neutral + Actor79: v11 + Location: 82,51 + Owner: Neutral + Actor80: utilpol1 + Location: 81,51 + Owner: Neutral + Actor81: v04 + Location: 75,47 + Owner: Neutral + Actor82: t06 + Location: 80,54 + Owner: Neutral + Actor83: t06 + Location: 76,57 + Owner: Neutral + Actor84: tc02 + Location: 78,55 + Owner: Neutral + Actor85: t03 + Location: 74,53 + Owner: Neutral + Actor86: t03 + Location: 72,59 + Owner: Neutral + Actor87: t10 + Location: 61,55 + Owner: Neutral + Actor88: t13 + Location: 67,55 + Owner: Neutral + Actor89: t14 + Location: 64,55 + Owner: Neutral + Actor90: v17 + Location: 61,70 + Owner: Neutral + Actor91: v18 + Location: 60,71 + Owner: Neutral + Actor92: v17 + Location: 59,71 + Owner: Neutral + Actor93: v14 + Location: 61,71 + Owner: Neutral + Actor94: v09 + Location: 63,69 + Owner: Neutral + Actor95: v08 + Location: 65,69 + Owner: Neutral + Actor96: v07 + Location: 62,71 + Owner: Neutral + Actor97: mine + Location: 65,84 + Owner: Neutral + Actor99: tc02 + Location: 56,75 + Owner: Neutral + Actor101: mine + Location: 45,64 + Owner: Neutral + Actor103: barl + Location: 66,70 + Owner: Neutral + Actor104: barl + Location: 102,25 + Owner: Neutral + Actor105: tc03 + Location: 41,33 + Owner: Neutral + Actor106: tc05 + Location: 38,32 + Owner: Neutral + Actor107: tc04 + Location: 36,29 + Owner: Neutral + Actor108: tc03 + Location: 37,16 + Owner: Neutral + Actor109: tc02 + Location: 37,18 + Owner: Neutral + Actor110: tc02 + Location: 34,20 + Owner: Neutral + Actor111: tc04 + Location: 35,25 + Owner: Neutral + Actor112: tc04 + Location: 18,38 + Owner: Neutral + Actor113: tc05 + Location: 24,39 + Owner: Neutral + Actor114: tc03 + Location: 28,44 + Owner: Neutral + Actor115: tc01 + Location: 28,41 + Owner: Neutral + Actor116: tc01 + Location: 30,57 + Owner: Neutral + Actor117: tc02 + Location: 33,61 + Owner: Neutral + Actor118: tc01 + Location: 37,72 + Owner: Neutral + Actor119: tc02 + Location: 35,71 + Owner: Neutral + Actor120: t07 + Location: 34,64 + Owner: Neutral + Actor121: t05 + Location: 33,67 + Owner: Neutral + Actor122: tc01 + Location: 31,78 + Owner: Neutral + Actor123: t07 + Location: 34,75 + Owner: Neutral + Actor124: tc04 + Location: 50,34 + Owner: Neutral + Actor125: tc05 + Location: 53,33 + Owner: Neutral + Actor126: tc02 + Location: 56,35 + Owner: Neutral + Actor127: tc02 + Location: 60,37 + Owner: Neutral + Actor128: tc03 + Location: 58,36 + Owner: Neutral + Actor129: t16 + Location: 66,40 + Owner: Neutral + Actor130: t05 + Location: 48,42 + Owner: Neutral + Actor131: tc03 + Location: 42,56 + Owner: Neutral + Actor132: tc02 + Location: 40,55 + Owner: Neutral + Actor133: mine + Location: 83,103 + Owner: Neutral + Actor134: mine + Location: 106,79 + Owner: Neutral + Actor135: mine + Location: 43,103 + Owner: Neutral + Actor136: mine + Location: 106,39 + Owner: Neutral + Actor137: mine + Location: 85,24 + Owner: Neutral + Actor6: mine + Location: 21,24 + Owner: Neutral + Actor139: mine + Location: 21,88 + Owner: Neutral + Actor140: mine + Location: 21,48 + Owner: Neutral + Actor141: mine + Location: 26,89 + Owner: Neutral + Actor142: mine + Location: 39,108 + Owner: Neutral + Actor143: mine + Location: 110,42 + Owner: Neutral + Actor144: mine + Location: 84,19 + Owner: Neutral + Actor145: tc02 + Location: 46,92 + Owner: Neutral + Actor146: tc02 + Location: 48,93 + Owner: Neutral + Actor147: tc05 + Location: 57,94 + Owner: Neutral + Actor148: tc01 + Location: 53,94 + Owner: Neutral + Actor149: tc02 + Location: 61,94 + Owner: Neutral + Actor150: tc03 + Location: 63,94 + Owner: Neutral + Actor151: tc01 + Location: 65,92 + Owner: Neutral + Actor152: t16 + Location: 43,87 + Owner: Neutral + Actor153: t02 + Location: 42,88 + Owner: Neutral + Actor154: t01 + Location: 46,82 + Owner: Neutral + Actor155: tc03 + Location: 90,110 + Owner: Neutral + Actor156: tc03 + Location: 84,96 + Owner: Neutral + Actor157: tc05 + Location: 86,95 + Owner: Neutral + Actor158: tc05 + Location: 90,101 + Owner: Neutral + Actor159: t05 + Location: 91,104 + Owner: Neutral + Actor160: t07 + Location: 90,108 + Owner: Neutral + Actor161: tc04 + Location: 90,105 + Owner: Neutral + Actor162: t08 + Location: 89,99 + Owner: Neutral + Actor163: t08 + Location: 93,82 + Owner: Neutral + Actor164: t17 + Location: 92,83 + Owner: Neutral + Actor165: tc02 + Location: 93,84 + Owner: Neutral + Actor166: tc02 + Location: 109,85 + Owner: Neutral + Actor167: tc04 + Location: 106,86 + Owner: Neutral + Actor168: tc02 + Location: 95,85 + Owner: Neutral + Actor169: tc02 + Location: 100,85 + Owner: Neutral + Actor170: t06 + Location: 98,86 + Owner: Neutral + Actor171: t16 + Location: 104,87 + Owner: Neutral + Actor172: tc03 + Location: 94,64 + Owner: Neutral + Actor173: tc01 + Location: 84,64 + Owner: Neutral + Actor174: t05 + Location: 92,64 + Owner: Neutral + Actor175: t06 + Location: 87,66 + Owner: Neutral + Actor176: t11 + Location: 81,61 + Owner: Neutral + Actor177: tc04 + Location: 85,65 + Owner: Neutral + Actor178: tc04 + Location: 88,65 + Owner: Neutral + Actor179: tc01 + Location: 84,53 + Owner: Neutral + Actor180: tc03 + Location: 86,53 + Owner: Neutral + Actor181: t01 + Location: 92,56 + Owner: Neutral + Actor182: t14 + Location: 88,54 + Owner: Neutral + Actor183: t17 + Location: 90,55 + Owner: Neutral + Actor184: t02 + Location: 99,45 + Owner: Neutral + Actor185: t07 + Location: 110,63 + Owner: Neutral + Actor186: t07 + Location: 92,77 + Owner: Neutral + Actor188: t07 + Location: 55,109 + Owner: Neutral + Actor189: t07 + Location: 51,94 + Owner: Neutral + Actor190: t07 + Location: 95,108 + Owner: Neutral + Actor191: t07 + Location: 105,88 + Owner: Neutral + Actor192: t07 + Location: 18,56 + Owner: Neutral + Actor193: t07 + Location: 17,76 + Owner: Neutral + Actor194: t13 + Location: 32,52 + Owner: Neutral + Actor195: t07 + Location: 54,23 + Owner: Neutral + Actor196: t07 + Location: 75,19 + Owner: Neutral + Actor197: t05 + Location: 74,20 + Owner: Neutral + Actor198: tc02 + Location: 25,17 + Owner: Neutral + Actor98: snowhut + Location: 58,65 + Owner: Neutral + Actor100: snowhut + Location: 75,43 + Owner: Neutral + +Smudges: + +Rules: + World: + WeatherOverlay: + ParticleDensityFactor: 0.0007625 + ChangingWindLevel: true + WindLevels: -5, -3, -2, 0, 2, 3, 5 + WindTick: 150, 550 + InstantWindChanges: false + UseSquares: true + PaticleSize: 1, 3 + ScatterDirection: -1, 1 + Gravity: 1.00, 2.00 + SwingOffset: 1.0, 1.5 + SwingSpeed: 0.001, 0.025 + SwingAmplitude: 1.0, 1.5 + ParticleColors: 255,236,236,236, 255,228,228,228, 255,208,208,208, 255,188,188,188 + LineTailAlphaValue: 0 + GlobalLightingPaletteEffect: + Red: 0.9 + Green: 0.9 + Blue: 1.0 + Ambient: 1.2 + +Sequences: + +VoxelSequences: + +Weapons: + +Voices: + +Notifications: + +Translations: