Added a WeatherOverlay

This commit is contained in:
TheRaffy
2015-07-07 21:10:33 +02:00
parent 7912e3c7ff
commit 1fc2158f2e
8 changed files with 1022 additions and 1 deletions

View File

@@ -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<IPostRender>())
if (a.Actor.IsInWorld && !a.Actor.Disposed)
a.Trait.RenderAfterWorld(this, a.Actor);

View File

@@ -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<IRenderable> RenderAfterWorld(WorldRenderer wr); }

View File

@@ -522,6 +522,7 @@
<Compile Include="Traits\World\SpawnMPUnits.cs" />
<Compile Include="Traits\World\StartGameNotification.cs" />
<Compile Include="Traits\World\TerrainGeometryOverlay.cs" />
<Compile Include="Traits\World\WeatherOverlay.cs" />
<Compile Include="UtilityCommands\CheckYaml.cs" />
<Compile Include="UtilityCommands\CheckCodeStyle.cs" />
<Compile Include="UtilityCommands\ConvertPngToShpCommand.cs" />

View File

@@ -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<Particle> particleList = new List<Particle>();
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);
}
}
}

View File

@@ -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

Binary file not shown.

Binary file not shown.

View File

@@ -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: