Merge pull request #3665 from pchote/frozen-fog-prereqs

Rework bibs (again).
This commit is contained in:
Matthias Mailänder
2013-08-11 02:14:34 -07:00
62 changed files with 497 additions and 358 deletions

View File

@@ -68,6 +68,10 @@ namespace OpenRA
default: return false;
}
// Propagate sign to fractional part
if (cell < 0)
subcell = -subcell;
result = new WRange(1024*cell + subcell);
return true;
}

View File

@@ -35,12 +35,15 @@ namespace OpenRA.Effects
public IEnumerable<IRenderable> Render(WorldRenderer wr)
{
if (!target.IsInWorld)
yield break;
if (target.IsInWorld && remainingTicks % 2 == 0)
{
var palette = wr.Palette("highlight");
return target.Render(wr)
.Where(r => !r.IsDecoration)
.Select(r => r.WithPalette(palette));
}
if (remainingTicks % 2 == 0)
foreach (var r in target.Render(wr))
yield return r.WithPalette(wr.Palette("highlight"));
return SpriteRenderable.None;
}
}
}

View File

@@ -17,6 +17,7 @@ namespace OpenRA.Graphics
{
string name;
public Sequence CurrentSequence { get; private set; }
public bool IsDecoration = false;
int frame = 0;
bool backwards = false;
bool tickAlways;
@@ -43,10 +44,10 @@ namespace OpenRA.Graphics
if (CurrentSequence.ShadowStart >= 0)
{
var shadow = CurrentSequence.GetShadow(CurrentFrame, facingFunc());
yield return new SpriteRenderable(shadow, pos, offset, CurrentSequence.ShadowZOffset + zOffset, palette, scale);
yield return new SpriteRenderable(shadow, pos, offset, CurrentSequence.ShadowZOffset + zOffset, palette, scale, true);
}
yield return new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale);
yield return new SpriteRenderable(Image, pos, offset, CurrentSequence.ZOffset + zOffset, palette, scale, IsDecoration);
}
public IEnumerable<IRenderable> Render(WPos pos, PaletteReference palette)

View File

@@ -34,11 +34,13 @@ namespace OpenRA.Graphics
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return true; } }
public IRenderable WithScale(float newScale) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable WithPalette(PaletteReference newPalette) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable WithZOffset(int newOffset) { return new BeamRenderable(pos, zOffset, length, width, color); }
public IRenderable OffsetBy(WVec vec) { return new BeamRenderable(pos + vec, zOffset, length, width, color); }
public IRenderable AsDecoration() { return this; }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)

View File

@@ -46,11 +46,13 @@ namespace OpenRA.Graphics
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return true; } }
public IRenderable WithScale(float newScale) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); }
public IRenderable WithPalette(PaletteReference newPalette) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, zOffset); }
public IRenderable WithZOffset(int newOffset) { return new ContrailRenderable(world, (WPos[])trail.Clone(), next, length, skip, color, newOffset); }
public IRenderable OffsetBy(WVec vec) { return new ContrailRenderable(world, trail.Select(pos => pos + vec).ToArray(), next, length, skip, color, zOffset); }
public IRenderable AsDecoration() { return this; }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)

View File

@@ -36,11 +36,14 @@ namespace OpenRA.Graphics
float Scale { get; }
PaletteReference Palette { get; }
int ZOffset { get; }
bool IsDecoration { get; }
IRenderable WithScale(float newScale);
IRenderable WithPalette(PaletteReference newPalette);
IRenderable WithZOffset(int newOffset);
IRenderable OffsetBy(WVec offset);
IRenderable AsDecoration();
void BeforeRender(WorldRenderer wr);
void Render(WorldRenderer wr);
void RenderDebugGeometry(WorldRenderer wr);
@@ -56,8 +59,9 @@ namespace OpenRA.Graphics
readonly int zOffset;
readonly PaletteReference palette;
readonly float scale;
readonly bool isDecoration;
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale)
public SpriteRenderable(Sprite sprite, WPos pos, WVec offset, int zOffset, PaletteReference palette, float scale, bool isDecoration)
{
this.sprite = sprite;
this.pos = pos;
@@ -65,25 +69,21 @@ namespace OpenRA.Graphics
this.zOffset = zOffset;
this.palette = palette;
this.scale = scale;
this.isDecoration = isDecoration;
}
public SpriteRenderable(Sprite sprite, WPos pos, int zOffset, PaletteReference palette, float scale)
: this(sprite, pos, WVec.Zero, zOffset, palette, scale) { }
// Provided for legacy support only - Don't use for new things!
public SpriteRenderable(Sprite sprite, float2 pos, PaletteReference palette, int z)
: this(sprite, new PPos((int)pos.X, (int)pos.Y).ToWPos(0), z, palette, 1f) { }
public WPos Pos { get { return pos + offset; } }
public WVec Offset { get { return offset; } }
public float Scale { get { return scale; } }
public PaletteReference Palette { get { return palette; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return isDecoration; } }
public IRenderable WithScale(float newScale) { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, newScale); }
public IRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, offset, zOffset, newPalette, scale); }
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, offset, newOffset, palette, scale); }
public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale); }
public IRenderable WithScale(float newScale) { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, newScale, isDecoration); }
public IRenderable WithPalette(PaletteReference newPalette) { return new SpriteRenderable(sprite, pos, offset, zOffset, newPalette, scale, isDecoration); }
public IRenderable WithZOffset(int newOffset) { return new SpriteRenderable(sprite, pos, offset, newOffset, palette, scale, isDecoration); }
public IRenderable OffsetBy(WVec vec) { return new SpriteRenderable(sprite, pos + vec, offset, zOffset, palette, scale, isDecoration); }
public IRenderable AsDecoration() { return new SpriteRenderable(sprite, pos, offset, zOffset, palette, scale, true); }
float2 ScreenPosition(WorldRenderer wr)
{

View File

@@ -82,12 +82,20 @@ namespace OpenRA.Graphics
ShadowStart = -1;
if (d.ContainsKey("ShadowZOffset"))
ShadowZOffset = int.Parse(d["ShadowZOffset"].Value);
{
WRange r;
if (WRange.TryParse(d["ShadowZOffset"].Value, out r))
ShadowZOffset = r.Range;
}
else
ShadowZOffset = -5;
if (d.ContainsKey("ZOffset"))
ZOffset = int.Parse(d["ZOffset"].Value);
{
WRange r;
if (WRange.TryParse(d["ZOffset"].Value, out r))
ZOffset = r.Range;
}
if (Length > Stride)
throw new InvalidOperationException(

View File

@@ -35,11 +35,13 @@ namespace OpenRA.Graphics
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return true; } }
public IRenderable WithScale(float newScale) { return new TextRenderable(font, pos, zOffset, color, text); }
public IRenderable WithPalette(PaletteReference newPalette) { return new TextRenderable(font, pos, zOffset, color, text); }
public IRenderable WithZOffset(int newOffset) { return new TextRenderable(font, pos, zOffset, color, text); }
public IRenderable OffsetBy(WVec vec) { return new TextRenderable(font, pos + vec, zOffset, color, text); }
public IRenderable AsDecoration() { return this; }
public void BeforeRender(WorldRenderer wr) {}
public void Render(WorldRenderer wr)

View File

@@ -54,6 +54,7 @@ namespace OpenRA.Graphics
public float Scale { get { return scale; } }
public PaletteReference Palette { get { return palette; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return false; } }
public IRenderable WithScale(float newScale)
{
@@ -83,6 +84,8 @@ namespace OpenRA.Graphics
palette, normalsPalette, shadowPalette);
}
public IRenderable AsDecoration() { return this; }
// This will need generalizing once we support TS/RA2 terrain
static readonly float[] groundNormal = new float[] {0,0,1,1};
public void BeforeRender(WorldRenderer wr)

View File

@@ -77,8 +77,11 @@ namespace OpenRA.Graphics
bounds.TopLeftAsCPos(),
bounds.BottomRightAsCPos());
var worldRenderables = actors.SelectMany(a => a.Render(this))
.OrderBy(r => r, comparer);
var worldRenderables = actors.SelectMany(a => a.Render(this));
if (world.OrderGenerator != null)
worldRenderables = worldRenderables.Concat(world.OrderGenerator.Render(this, world));
worldRenderables = worldRenderables.OrderBy(r => r, comparer);
// Effects are drawn on top of all actors
// TODO: Allow effects to be interleaved with actors
@@ -112,16 +115,8 @@ namespace OpenRA.Graphics
foreach (var r in a.Trait.RenderAsTerrain(this, a.Actor))
r.Render(this);
foreach (var a in world.Selection.Actors)
if (!a.Destroyed)
foreach (var t in a.TraitsImplementing<IPreRenderSelection>())
t.RenderBeforeWorld(this, a);
Game.Renderer.Flush();
if (world.OrderGenerator != null)
world.OrderGenerator.RenderBeforeWorld(this, world);
for (var i = 0; i < renderables.Count; i++)
renderables[i].Render(this);

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
@@ -66,7 +66,7 @@ namespace OpenRA.Orders
}
public virtual void Tick(World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi) { return world.Map.IsInMap(xy) ? cursor : "generic-blocked"; }
}

View File

@@ -17,7 +17,7 @@ namespace OpenRA
{
IEnumerable<Order> Order(World world, CPos xy, MouseInput mi);
void Tick(World world);
void RenderBeforeWorld(WorldRenderer wr, World world);
IEnumerable<IRenderable> Render(WorldRenderer wr, World world);
void RenderAfterWorld(WorldRenderer wr, World world);
string GetCursor(World world, CPos xy, MouseInput mi);
}

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Orders
}
public void Tick(World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi)

View File

@@ -84,6 +84,7 @@ namespace OpenRA.Traits
case "DevShroudDisable":
{
DisableShroud ^= true;
self.Owner.Shroud.Disabled = DisableShroud;
if (self.World.LocalPlayer == self.Owner)
self.World.RenderPlayer = DisableShroud ? null : self.Owner;
break;

View File

@@ -83,7 +83,6 @@ namespace OpenRA.Traits
{
string Name();
Player Owner();
Stance Stance();
}
public interface IDisable { bool Disabled { get; } }
@@ -144,6 +143,13 @@ namespace OpenRA.Traits
void SetVisualPosition(Actor self, WPos pos);
}
public interface IMove
{
Activity MoveTo(CPos cell, int nearEnough);
Activity MoveTo(CPos cell, Actor ignoredActor);
Activity MoveWithinRange(Target target, WRange range);
}
public interface INotifyBlockingMove { void OnNotifyBlockingMove(Actor self, Actor blocking); }
public interface IFacing
@@ -187,7 +193,6 @@ namespace OpenRA.Traits
public interface IPostRender { void RenderAfterWorld(WorldRenderer wr, Actor self); }
public interface IPostRenderSelection { void RenderAfterWorld(WorldRenderer wr); }
public interface IPreRenderSelection { void RenderBeforeWorld(WorldRenderer wr, Actor self); }
public interface IRenderAsTerrain { IEnumerable<IRenderable> RenderAsTerrain(WorldRenderer wr, Actor self); }
public interface IBodyOrientation
{

View File

@@ -23,6 +23,8 @@ namespace OpenRA.Traits
public class Shroud
{
[Sync] public bool Disabled = false;
Actor self;
Map map;
@@ -248,7 +250,7 @@ namespace OpenRA.Traits
if (!map.IsInMap(x, y))
return false;
if (!self.World.LobbyInfo.GlobalSettings.Shroud)
if (Disabled || !self.World.LobbyInfo.GlobalSettings.Shroud)
return true;
return explored[x, y] && (generatedShroudCount[x, y] == 0 || visibleCount[x, y] > 0);
@@ -267,7 +269,7 @@ namespace OpenRA.Traits
if (x < 0 || x >= map.MapSize.X || y < 0 || y >= map.MapSize.Y)
return false;
if (!self.World.LobbyInfo.GlobalSettings.Fog)
if (Disabled || !self.World.LobbyInfo.GlobalSettings.Fog)
return true;
return visibleCount[x, y] > 0;

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.RA.Air
public override object Create(ActorInitializer init) { return new Helicopter(init, this); }
}
class Helicopter : Aircraft, ITick, IResolveOrder
class Helicopter : Aircraft, ITick, IResolveOrder, IMove
{
public HelicopterInfo Info;
bool firstTick = true;
@@ -149,5 +149,9 @@ namespace OpenRA.Mods.RA.Air
return (d * 1024 * 8) / (int)distSq;
}
public Activity MoveTo(CPos cell, int nearEnough) { return new HeliFly(cell); }
public Activity MoveTo(CPos cell, Actor ignoredActor) { return new HeliFly(cell); }
public Activity MoveWithinRange(Target target, WRange range) { return new HeliFly(target.CenterPosition); }
}
}

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Air
public override object Create(ActorInitializer init) { return new Plane(init, this); }
}
public class Plane : Aircraft, IResolveOrder, ITick, ISync
public class Plane : Aircraft, IResolveOrder, IMove, ITick, ISync
{
public readonly PlaneInfo Info;
[Sync] public WPos RTBPathHash;
@@ -89,5 +89,9 @@ namespace OpenRA.Mods.RA.Air
UnReserve();
}
}
public Activity MoveTo(CPos cell, int nearEnough) { return Fly.ToCell(cell); }
public Activity MoveTo(CPos cell, Actor ignoredActor) { return Fly.ToCell(cell); }
public Activity MoveWithinRange(Target target, WRange range) { return Fly.ToPos(target.CenterPosition); }
}
}

View File

@@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA
}
foreach (var t in TileSprites[currentTemplate])
yield return new SpriteRenderable(t.Value, t.Key.CenterPosition, 0, terrainPalette, 1f);
yield return new SpriteRenderable(t.Value, t.Key.CenterPosition, WVec.Zero, 0, terrainPalette, 1f, true);
}
void KillUnitsOnBridge()

View File

@@ -24,7 +24,7 @@ namespace OpenRA.Mods.RA.Buildings
public object Create(ActorInitializer init) { return new BaseProvider(init.self, this); }
}
public class BaseProvider : ITick, IPreRenderSelection, ISelectionBar
public class BaseProvider : ITick, IPostRenderSelection, ISelectionBar
{
public readonly BaseProviderInfo Info;
DeveloperMode devMode;
@@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Buildings
}
// Range circle
public void RenderBeforeWorld(WorldRenderer wr, Actor self)
public void RenderAfterWorld(WorldRenderer wr)
{
// Visible to player and allies
if (!self.Owner.IsAlliedWith(self.World.RenderPlayer))

68
OpenRA.Mods.RA/Buildings/Bib.cs Executable file
View File

@@ -0,0 +1,68 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 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.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Buildings
{
public class BibInfo : ITraitInfo, Requires<BuildingInfo>, Requires<RenderSpritesInfo>
{
public readonly string Sequence = "bib";
public readonly string Palette = "terrain";
public object Create(ActorInitializer init) { return new Bib(init.self, this); }
}
public class Bib : IRender
{
readonly BibInfo info;
readonly List<AnimationWithOffset> tiles;
public Bib(Actor self, BibInfo info)
{
this.info = info;
var rs = self.Trait<RenderSprites>();
var building = self.Info.Traits.Get<BuildingInfo>();
var width = building.Dimensions.X;
var bibOffset = building.Dimensions.Y - 1;
var centerOffset = FootprintUtils.CenterOffset(building);
tiles = new List<AnimationWithOffset>();
for (var i = 0; i < 2*width; i++)
{
var index = i;
var anim = new Animation(rs.GetImage(self));
anim.PlayFetchIndex(info.Sequence, () => index);
anim.IsDecoration = true;
// Z-order is one set to the top of the footprint
var offset = new CVec(i % width, i / width + bibOffset).ToWVec() - centerOffset;
tiles.Add(new AnimationWithOffset(anim, () => offset, null, -(offset.Y + centerOffset.Y + 512)));
}
}
bool paletteInitialized;
PaletteReference palette;
public virtual IEnumerable<IRenderable> Render(Actor self, WorldRenderer wr)
{
if (!paletteInitialized)
{
palette = wr.Palette(info.Palette);
paletteInitialized = true;
}
return tiles.SelectMany(t => t.Render(self, wr, palette, 1f));
}
}
}

View File

@@ -1,154 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2013 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.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Buildings
{
class BibLayerInfo : ITraitInfo
{
public object Create(ActorInitializer init) { return new BibLayer(init.self); }
}
struct CachedBib
{
public Dictionary<CPos, Sprite> Tiles;
public IEnumerable<CPos> Footprint;
public bool Visible;
public bool Immediate;
}
class BibLayer : IRenderOverlay, ITickRender
{
World world;
Dictionary<Actor, CachedBib> visible;
Dictionary<Actor, CachedBib> dirty;
Cache<string, Sprite[]> sprites;
public BibLayer(Actor self)
{
world = self.World;
visible = new Dictionary<Actor, CachedBib>();
dirty = new Dictionary<Actor, CachedBib>();
sprites = new Cache<string, Sprite[]>(x => Game.modData.SpriteLoader.LoadAllSprites(x));
}
public void Update(Actor a, CachedBib bib)
{
dirty[a] = bib;
}
public Sprite[] LoadSprites(string bibType)
{
return sprites[bibType];
}
public void TickRender(WorldRenderer wr, Actor self)
{
var remove = new List<Actor>();
foreach (var kv in dirty)
{
if (kv.Value.Immediate || kv.Value.Footprint.Any(c => !self.World.FogObscures(c)))
{
if (kv.Value.Visible)
visible[kv.Key] = kv.Value;
else
visible.Remove(kv.Key);
remove.Add(kv.Key);
}
}
foreach (var r in remove)
dirty.Remove(r);
}
public void Render(WorldRenderer wr)
{
var pal = wr.Palette("terrain");
var cliprect = Game.viewport.WorldBounds(world);
foreach (var bib in visible.Values)
{
foreach (var kv in bib.Tiles)
{
if (!cliprect.Contains(kv.Key.X, kv.Key.Y))
continue;
if (world.ShroudObscures(kv.Key))
continue;
kv.Value.DrawAt(wr.ScreenPxPosition(kv.Key.CenterPosition) - 0.5f * kv.Value.size, pal);
}
}
}
}
public class BibInfo : ITraitInfo, Requires<BuildingInfo>
{
public readonly string Sprite = "bib3";
public object Create(ActorInitializer init) { return new Bib(init.self, this); }
}
public class Bib : INotifyAddedToWorld, INotifyRemovedFromWorld
{
readonly BibInfo info;
readonly BibLayer bibLayer;
bool firstAdd;
public Bib(Actor self, BibInfo info)
{
this.info = info;
bibLayer = self.World.WorldActor.Trait<BibLayer>();
firstAdd = true;
}
void DoBib(Actor self, bool add)
{
var buildingInfo = self.Info.Traits.Get<BuildingInfo>();
var size = buildingInfo.Dimensions.X;
var bibOffset = buildingInfo.Dimensions.Y - 1;
var sprites = bibLayer.LoadSprites(info.Sprite);
if (sprites.Length != 2*size)
throw new InvalidOperationException("{0} is an invalid bib for a {1}-wide building".F(info.Sprite, size));
var immediate = !self.HasTrait<FrozenUnderFog>() ||
(firstAdd && self.Info.Traits.GetOrDefault<FrozenUnderFogInfo>().StartsRevealed);
var dirty = new CachedBib()
{
Footprint = FootprintUtils.Tiles(self),
Tiles = new Dictionary<CPos, Sprite>(),
Visible = add,
Immediate = immediate
};
for (var i = 0; i < 2 * size; i++)
{
var cell = self.Location + new CVec(i % size, i / size + bibOffset);
dirty.Tiles.Add(cell, sprites[i]);
}
firstAdd = false;
bibLayer.Update(self, dirty);
}
public void AddedToWorld(Actor self) { DoBib(self, true); }
public void RemovedFromWorld(Actor self) { DoBib(self, false); }
}
}

View File

@@ -143,8 +143,9 @@ namespace OpenRA.Mods.RA
if (!self.IsInWorld || self.IsDead())
world.CancelInputMode();
}
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world)
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world)
{
if (!self.IsInWorld)
return;

View File

@@ -38,6 +38,7 @@ namespace OpenRA.Mods.RA.Effects
yield break;
foreach (var r in a.Render(wr))
if (!r.IsDecoration)
yield return r.WithPalette(wr.Palette("invuln"));
}
}

View File

@@ -72,7 +72,9 @@ namespace OpenRA.Mods.RA.Effects
var shadow = wr.Palette("shadow");
foreach (var c in rc)
{
yield return c.WithPalette(shadow).WithZOffset(-1);
if (!c.IsDecoration)
yield return c.WithPalette(shadow).WithZOffset(c.ZOffset - 1).AsDecoration();
yield return c.OffsetBy(pos - c.Pos);
}

View File

@@ -118,8 +118,8 @@ namespace OpenRA.Mods.RA
yield break;
var bounds = self.Bounds.Value;
var pos = new float2(bounds.Right, bounds.Bottom - 2);
yield return new SpriteRenderable(RankAnim.Image, pos, wr.Palette("effect"), self.CenterLocation.Y);
var pos = new PPos(bounds.Right, bounds.Bottom - 2).ToWPos(0);
yield return new SpriteRenderable(RankAnim.Image, pos, WVec.Zero, 0, wr.Palette("effect"), 1f, true);
}
}

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2013 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
@@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA
world.CancelInputMode();
}
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi)

View File

@@ -125,6 +125,7 @@ namespace OpenRA.Mods.RA
}
CPos lastMousePos;
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world)
{
if (!minelayer.IsInWorld)
@@ -138,8 +139,6 @@ namespace OpenRA.Mods.RA
wr.DrawLocus(Color.Cyan, minefield);
}
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi) { lastMousePos = xy; return "ability"; } /* TODO */
}

View File

@@ -59,7 +59,10 @@ namespace OpenRA.Mods.RA
}
if (visible)
proxy.SetRenderables(self.Render(wr));
{
var comparer = new RenderableComparer(wr);
proxy.SetRenderables(self.Render(wr).OrderBy(r => r, comparer));
}
}
public IEnumerable<IRenderable> ModifyRender(Actor self, WorldRenderer wr, IEnumerable<IRenderable> r)

View File

@@ -144,7 +144,7 @@ namespace OpenRA.Mods.RA.Move
public int GetInitialFacing() { return InitialFacing; }
}
public class Mobile : IIssueOrder, IResolveOrder, IOrderVoice, IPositionable, IFacing, ISync
public class Mobile : IIssueOrder, IResolveOrder, IOrderVoice, IPositionable, IMove, IFacing, ISync
{
public readonly Actor self;
public readonly MobileInfo Info;

View File

@@ -154,7 +154,6 @@
<Compile Include="BridgeLayer.cs" />
<Compile Include="Buildable.cs" />
<Compile Include="BuildingCaptureNotification.cs" />
<Compile Include="Buildings\BibLayer.cs" />
<Compile Include="Buildings\Building.cs" />
<Compile Include="Buildings\BuildingInfluence.cs" />
<Compile Include="Buildings\CanPowerDown.cs" />
@@ -462,6 +461,7 @@
<Compile Include="Effects\FrozenActorProxy.cs" />
<Compile Include="Widgets\Logic\WorldTooltipLogic.cs" />
<Compile Include="TeslaZapRenderable.cs" />
<Compile Include="Buildings\Bib.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -68,8 +68,8 @@ namespace OpenRA.Mods.RA.Orders
}
public void Tick(World world) {}
public void RenderAfterWorld(WorldRenderer wr, World world) {}
public void RenderBeforeWorld(WorldRenderer wr, World world)
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world)
{
var position = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var topLeft = position - FootprintUtils.AdjustForBuildingSize(BuildingInfo);
@@ -110,7 +110,10 @@ namespace OpenRA.Mods.RA.Orders
var pal = wr.Palette("terrain");
foreach (var c in cells)
(c.Value ? buildOk : buildBlocked).DrawAt(c.Key.ToPPos().ToFloat2(), pal);
{
var tile = c.Value ? buildOk : buildBlocked;
tile.DrawAt(wr.ScreenPxPosition(c.Key.CenterPosition) - 0.5f * tile.size, pal);
}
}
public string GetCursor(World world, CPos xy, MouseInput mi) { return "default"; }

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
@@ -55,8 +55,8 @@ namespace OpenRA.Mods.RA.Orders
world.CancelInputMode();
}
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi)
{

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
@@ -49,8 +49,8 @@ namespace OpenRA.Mods.RA.Orders
world.CancelInputMode();
}
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi)
{

View File

@@ -38,13 +38,12 @@ namespace OpenRA.Mods.RA.Orders
}
public void Tick( World world ) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld( WorldRenderer wr, World world )
{
wr.DrawSelectionBox(self, Color.White);
}
public void RenderBeforeWorld( WorldRenderer wr, World world ) { }
public string GetCursor(World world, CPos xy, MouseInput mi)
{
if (!world.LocalPlayer.Shroud.IsExplored(xy))

View File

@@ -94,19 +94,11 @@ namespace OpenRA.Mods.RA
if (rp == null)
return exitLocation;
var mobile = newUnit.TraitOrDefault<Mobile>();
if (mobile != null)
var move = newUnit.TraitOrDefault<IMove>();
if (move != null)
{
newUnit.QueueActivity(new AttackMove.AttackMoveActivity(
newUnit, mobile.MoveTo(rp.rallyPoint, rp.nearEnough)));
return rp.rallyPoint;
}
// TODO: don't talk about HeliFly here.
var helicopter = newUnit.TraitOrDefault<Helicopter>();
if (helicopter != null)
{
newUnit.QueueActivity(new HeliFly(rp.rallyPoint));
newUnit, move.MoveTo(rp.rallyPoint, rp.nearEnough)));
return rp.rallyPoint;
}

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Render
return;
foreach (var a in w.ActorsWithTrait<BaseProvider>())
a.Trait.RenderBeforeWorld(wr, a.Actor);
a.Trait.RenderAfterWorld(wr);
}
}
@@ -63,8 +63,10 @@ namespace OpenRA.Mods.RA.Render
foreach (var a in r)
{
yield return a;
if (disabled)
yield return a.WithPalette(wr.Palette("disabled")).WithZOffset(1);
if (disabled && !a.IsDecoration)
yield return a.WithPalette(wr.Palette("disabled"))
.WithZOffset(a.ZOffset + 1)
.AsDecoration();
}
}

View File

@@ -31,9 +31,11 @@ namespace OpenRA.Mods.RA.Render
? (int)Math.Abs((self.ActorID + Game.LocalTick) / 5 % 4 - 1) - 1 : 0;
// Contrails shouldn't cast shadows
var shadowSprites = r.Where(s => !(s is ContrailRenderable))
var shadowSprites = r.Where(s => !s.IsDecoration)
.Select(a => a.WithPalette(wr.Palette("shadow"))
.OffsetBy(new WVec(0, 0, -a.Pos.Z)).WithZOffset(a.ZOffset + a.Pos.Z));
.OffsetBy(new WVec(0, 0, -a.Pos.Z))
.WithZOffset(a.ZOffset + a.Pos.Z)
.AsDecoration());
var worldVisualOffset = new WVec(0,0,-43*visualOffset);
var flyingSprites = !flying ? r :

View File

@@ -14,10 +14,18 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
class RenderDetectionCircleInfo : TraitInfo<RenderDetectionCircle> { }
class RenderDetectionCircle : IPreRenderSelection
class RenderDetectionCircleInfo : ITraitInfo
{
public void RenderBeforeWorld(WorldRenderer wr, Actor self)
public object Create(ActorInitializer init) { return new RenderDetectionCircle(init.self); }
}
class RenderDetectionCircle : IPostRenderSelection
{
Actor self;
public RenderDetectionCircle(Actor self) { this.self = self; }
public void RenderAfterWorld(WorldRenderer wr)
{
if (self.Owner != self.World.LocalPlayer)
return;

View File

@@ -15,7 +15,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
//todo: remove all the Render*Circle duplication
class RenderJammerCircleInfo : TraitInfo<RenderJammerCircle>, IPlaceBuildingDecoration
class RenderJammerCircleInfo : ITraitInfo, IPlaceBuildingDecoration
{
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{
@@ -29,13 +29,19 @@ namespace OpenRA.Mods.RA
foreach (var a in w.ActorsWithTrait<RenderJammerCircle>())
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
a.Trait.RenderBeforeWorld(wr, a.Actor);
a.Trait.RenderAfterWorld(wr);
}
public object Create(ActorInitializer init) { return new RenderJammerCircle(init.self); }
}
public class RenderJammerCircle : IPreRenderSelection
class RenderJammerCircle : IPostRenderSelection
{
public void RenderBeforeWorld(WorldRenderer wr, Actor self)
Actor self;
public RenderJammerCircle(Actor self) { this.self = self; }
public void RenderAfterWorld(WorldRenderer wr)
{
if (self.Owner != self.World.LocalPlayer)
return;

View File

@@ -20,7 +20,7 @@ namespace OpenRA.Mods.RA
void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition);
}
class RenderRangeCircleInfo : TraitInfo<RenderRangeCircle>, IPlaceBuildingDecoration
class RenderRangeCircleInfo : ITraitInfo, IPlaceBuildingDecoration
{
public readonly string RangeCircleType = null;
@@ -36,13 +36,19 @@ namespace OpenRA.Mods.RA
foreach (var a in w.ActorsWithTrait<RenderRangeCircle>())
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
if (a.Actor.Info.Traits.Get<RenderRangeCircleInfo>().RangeCircleType == RangeCircleType)
a.Trait.RenderBeforeWorld(wr, a.Actor);
a.Trait.RenderAfterWorld(wr);
}
public object Create(ActorInitializer init) { return new RenderRangeCircle(init.self); }
}
class RenderRangeCircle : IPreRenderSelection
class RenderRangeCircle : IPostRenderSelection
{
public void RenderBeforeWorld(WorldRenderer wr, Actor self)
Actor self;
public RenderRangeCircle(Actor self) { this.self = self; }
public void RenderAfterWorld(WorldRenderer wr)
{
if (self.Owner != self.World.LocalPlayer)
return;

View File

@@ -14,7 +14,7 @@ using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
class RenderShroudCircleInfo : TraitInfo<RenderShroudCircle>, IPlaceBuildingDecoration
class RenderShroudCircleInfo : ITraitInfo, IPlaceBuildingDecoration
{
public void Render(WorldRenderer wr, World w, ActorInfo ai, WPos centerPosition)
{
@@ -27,13 +27,19 @@ namespace OpenRA.Mods.RA
foreach (var a in w.ActorsWithTrait<RenderShroudCircle>())
if (a.Actor.Owner == a.Actor.World.LocalPlayer)
a.Trait.RenderBeforeWorld(wr, a.Actor);
a.Trait.RenderAfterWorld(wr);
}
public object Create(ActorInitializer init) { return new RenderShroudCircle(init.self); }
}
class RenderShroudCircle : IPreRenderSelection
class RenderShroudCircle : IPostRenderSelection
{
public void RenderBeforeWorld(WorldRenderer wr, Actor self)
Actor self;
public RenderShroudCircle(Actor self) { this.self = self; }
public void RenderAfterWorld(WorldRenderer wr)
{
if (self.Owner != self.World.LocalPlayer)
return;

View File

@@ -51,17 +51,6 @@ namespace OpenRA.Mods.RA
return self.Owner;
}
public Stance Stance()
{
if (spy.Disguised)
{
if (self.Owner == self.World.LocalPlayer)
return self.World.LocalPlayer.Stances[self.Owner];
return self.World.LocalPlayer.Stances[spy.disguisedAsPlayer];
}
return self.World.LocalPlayer.Stances[self.Owner];
}
public SpyToolTip( Actor self, TooltipInfo info )
{
this.self = self;

View File

@@ -140,20 +140,18 @@ namespace OpenRA.Mods.RA
{
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var targetUnits = power.UnitsInRange(xy);
foreach (var unit in targetUnits) {
if (manager.self.Owner.Shroud.IsTargetable(unit) || manager.self.Owner.HasFogVisibility()) {
foreach (var unit in targetUnits)
if (manager.self.Owner.Shroud.IsTargetable(unit) || manager.self.Owner.HasFogVisibility())
wr.DrawSelectionBox(unit, Color.Red);
}
}
}
public void RenderBeforeWorld(WorldRenderer wr, World world)
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world)
{
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var tiles = world.FindTilesInCircle(xy, range);
var pal = wr.Palette("terrain");
foreach (var t in tiles)
tile.DrawAt(t.ToPPos().ToFloat2(), pal);
yield return new SpriteRenderable(tile, t.CenterPosition, WVec.Zero, -511, pal, 1f, true);
}
public string GetCursor(World world, CPos xy, MouseInput mi)
@@ -221,25 +219,23 @@ namespace OpenRA.Mods.RA
public void RenderAfterWorld(WorldRenderer wr, World world)
{
foreach (var unit in power.UnitsInRange(sourceLocation)) {
if (manager.self.Owner.Shroud.IsTargetable(unit) || manager.self.Owner.HasFogVisibility()) {
foreach (var unit in power.UnitsInRange(sourceLocation))
if (manager.self.Owner.Shroud.IsTargetable(unit) || manager.self.Owner.HasFogVisibility())
wr.DrawSelectionBox(unit, Color.Red);
}
}
}
public void RenderBeforeWorld(WorldRenderer wr, World world)
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world)
{
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var pal = wr.Palette("terrain");
// Source tiles
foreach (var t in world.FindTilesInCircle(sourceLocation, range))
sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
yield return new SpriteRenderable(sourceTile, t.CenterPosition, WVec.Zero, -511, pal, 1f, true);
// Destination tiles
foreach (var t in world.FindTilesInCircle(xy, range))
sourceTile.DrawAt(t.ToPPos().ToFloat2(), pal);
yield return new SpriteRenderable(sourceTile, t.CenterPosition, WVec.Zero, -511, pal, 1f, true);
// Unit previews
foreach (var unit in power.UnitsInRange(sourceLocation))
@@ -247,7 +243,7 @@ namespace OpenRA.Mods.RA
var offset = (xy - sourceLocation).ToWVec();
if (manager.self.Owner.Shroud.IsTargetable(unit))
foreach (var r in unit.Render(wr))
r.OffsetBy(offset).Render(wr);
yield return r.OffsetBy(offset);
}
// Unit tiles
@@ -259,7 +255,7 @@ namespace OpenRA.Mods.RA
var canEnter = ((manager.self.Owner.Shroud.IsExplored(targetCell) || manager.self.Owner.HasFogVisibility()) &&
unit.Trait<Chronoshiftable>().CanChronoshiftTo(unit,targetCell));
var tile = canEnter ? validTile : invalidTile;
tile.DrawAt(targetCell.ToPPos().ToFloat2(), pal);
yield return new SpriteRenderable(tile, targetCell.CenterPosition, WVec.Zero, -511, pal, 1f, true);
}
}
}
@@ -276,7 +272,8 @@ namespace OpenRA.Mods.RA
break;
}
}
if (!canTeleport) {
if (!canTeleport)
{
// Check the terrain types. This will allow chronoshifts to occur on empty terrain to terrain of
// a similar type. This also keeps the cursor from changing in non-visible property, alerting the
// chronoshifter of enemy unit presence

View File

@@ -95,12 +95,12 @@ namespace OpenRA.Mods.RA
wr.DrawSelectionBox(unit, Color.Red);
}
public void RenderBeforeWorld(WorldRenderer wr, World world)
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world)
{
var xy = Game.viewport.ViewToWorld(Viewport.LastMousePos);
var pal = wr.Palette("terrain");
foreach (var t in world.FindTilesInCircle(xy, range))
tile.DrawAt(t.ToPPos().ToFloat2(), pal);
yield return new SpriteRenderable(tile, t.CenterPosition, WVec.Zero, -511, pal, 1f, true);
}
public string GetCursor(World world, CPos xy, MouseInput mi)

View File

@@ -221,7 +221,7 @@ namespace OpenRA.Mods.RA
world.CancelInputMode();
}
public void RenderBeforeWorld(WorldRenderer wr, World world) { }
public IEnumerable<IRenderable> Render(WorldRenderer wr, World world) { yield break; }
public void RenderAfterWorld(WorldRenderer wr, World world) { }
public string GetCursor(World world, CPos xy, MouseInput mi) { return world.Map.IsInMap(xy) ? cursor : "generic-blocked"; }
}

View File

@@ -60,11 +60,13 @@ namespace OpenRA.Mods.RA
public float Scale { get { return 1f; } }
public PaletteReference Palette { get { return null; } }
public int ZOffset { get { return zOffset; } }
public bool IsDecoration { get { return true; } }
public IRenderable WithScale(float newScale) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable WithPalette(PaletteReference newPalette) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable WithZOffset(int newOffset) { return new TeslaZapRenderable(pos, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable OffsetBy(WVec vec) { return new TeslaZapRenderable(pos + vec, zOffset, length, image, brightZaps, dimZaps); }
public IRenderable AsDecoration() { return this; }
public void BeforeRender(WorldRenderer wr) { }
public void RenderDebugGeometry(WorldRenderer wr) { }
@@ -132,8 +134,8 @@ namespace OpenRA.Mods.RA
var step = steps.Where(t => (to - (z + new float2(t[0], t[1]))).LengthSquared < (to - z).LengthSquared)
.OrderBy(t => Math.Abs(float2.Dot(z + new float2(t[0], t[1]), q) + c)).First();
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), z + new float2(step[2], step[3]),
wr.Palette("effect"), (int)from.Y));
var pos = new PPos((int)(z.X + step[2]), (int)(z.Y + step[3])).ToWPos(0);
rs.Add(new SpriteRenderable(s.GetSprite(step[4]), pos, WVec.Zero, 0, wr.Palette("effect"), 1f, true));
z += new float2(step[0], step[1]);
if (rs.Count >= 1000)

View File

@@ -40,7 +40,6 @@ namespace OpenRA.Mods.RA
public string Name() { return Info.Name; }
public Player Owner() { return self.Owner; }
public Stance Stance() { return self.World.LocalPlayer.Stances[self.Owner]; }
public Tooltip(Actor self, TooltipInfo info)
{

View File

@@ -23,7 +23,6 @@ FACT:
RevealsShroud:
Range: 10
Bib:
Sprite: bib2
Production:
Produces: Building,Defense
Transforms:
@@ -73,7 +72,6 @@ NUKE:
RevealsShroud:
Range: 4
Bib:
Sprite: bib3
NUK2:
Inherits: ^Building
@@ -98,7 +96,6 @@ NUK2:
RevealsShroud:
Range: 4
Bib:
Sprite: bib3
PROC:
Inherits: ^Building
@@ -121,7 +118,6 @@ PROC:
RevealsShroud:
Range: 6
Bib:
Sprite: bib2
TiberiumRefinery:
DockOffset: 0,2
TickRate: 15
@@ -195,7 +191,6 @@ PYLE:
RevealsShroud:
Range: 5
Bib:
Sprite: bib3
RallyPoint:
Exit@1:
SpawnOffset: -10,2
@@ -235,7 +230,6 @@ HAND:
RevealsShroud:
Range: 5
Bib:
Sprite: bib3
RallyPoint:
Exit@1:
SpawnOffset: 12,24
@@ -272,10 +266,8 @@ AFLD:
RevealsShroud:
Range: 7
Bib:
Sprite: bib1
RallyPoint:
RallyPoint: 4,2
BelowUnits:
Exit@1:
SpawnOffset: -24,0
ExitCell: 3,1
@@ -312,7 +304,6 @@ WEAP:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
-RenderBuilding:
RenderBuildingWarFactory:
RallyPoint:
@@ -353,7 +344,6 @@ HPAD:
SpawnOffset: 0,-6
Production:
Produces: Aircraft
BelowUnits:
Reservable:
RepairsUnits:
RallyPoint:
@@ -389,7 +379,6 @@ HQ:
RevealsShroud:
Range: 10
Bib:
Sprite: bib3
ProvidesRadar:
RenderDetectionCircle:
DetectCloaked:
@@ -424,7 +413,6 @@ FIX:
HP: 400
RevealsShroud:
Range: 5
BelowUnits:
Reservable:
RepairsUnits:
RallyPoint:
@@ -454,7 +442,6 @@ EYE:
RevealsShroud:
Range: 10
Bib:
Sprite: bib3
ProvidesRadar:
RenderDetectionCircle:
DetectCloaked:
@@ -495,7 +482,6 @@ TMPL:
RevealsShroud:
Range: 6
Bib:
Sprite: bib2
NukePower:
Image: atomicnh
ChargeTime: 300

View File

@@ -275,7 +275,6 @@ World:
Race: nod
ProductionQueueFromSelection:
ProductionTabsWidget: PRODUCTION_TABS
BibLayer:
DomainIndex:
ResourceLayer:
ResourceClaimLayer:
@@ -403,7 +402,6 @@ CRATE:
NoBaseSelectionShares: 120
Unit: mcv
RenderSimple:
BelowUnits:
BodyOrientation:
mpspawn:

View File

@@ -165,8 +165,10 @@ allyrepair:
crate:
idle: wcrate
Start: 0
ZOffset: -511
land: wcrate
Start: 0
ZOffset: -511
crate-effects:
airstrike: deviator

View File

@@ -21,6 +21,9 @@ fact:
Start: 0
Length: *
Tick: 80
bib: bib2
Start: 0
Length: *
nuke:
idle:
@@ -38,6 +41,9 @@ nuke:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
proc:
idle:
@@ -62,6 +68,9 @@ proc:
Start: 6
Length: 6
Offset: -32,-21
bib: bib2
Start: 0
Length: *
silo:
idle:
@@ -76,6 +85,9 @@ silo:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
hand:
idle:
@@ -88,6 +100,9 @@ hand:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
pyle:
idle:
@@ -105,6 +120,9 @@ pyle:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
weap:
idle:
@@ -127,28 +145,39 @@ weap:
Start: 0
Length: *
Tick: 80
bib: bib2
Start: 0
Length: *
afld:
idle:
Start: 0
Tick: 120
ZOffset: -1023
active:
Start: 0
Length: 16
Tick: 120
ZOffset: -1023
damaged-idle:
Start: 16
Tick: 120
ZOffset: -1023
damaged-active:
Start: 16
Length: 16
Tick: 120
ZOffset: -1023
dead:
Start: 32
ZOffset: -1023
make: afldmake
Start: 0
Length: *
Tick: 80
bib: bib1
Start: 0
Length: *
hq:
idle:
@@ -165,6 +194,9 @@ hq:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
nuk2:
idle:
@@ -181,22 +213,30 @@ nuk2:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
hpad:
idle:
Start: 0
ZOffset: -1023
damaged-idle:
Start: 7
ZOffset: -1023
active:
Start: 1
Length: 6
Tick: 100
ZOffset: -1023
damaged-active:
Start: 8
Length: 6
Tick: 100
ZOffset: -1023
dead:
Start: 14
ZOffset: -1023
make: hpadmake
Start: 0
Length: *
@@ -205,16 +245,20 @@ hpad:
fix:
idle:
Start: 0
ZOffset: -1c511
damaged-idle:
Start: 7
active:
Start: 0
Length: 7
ZOffset: -1c511
damaged-active:
Start: 7
Length: 7
ZOffset: -1c511
dead:
Start: 14
ZOffset: -1c511
make: fixmake
Start: 0
Length: 14
@@ -235,6 +279,9 @@ eye:
Start: 0
Length: *
Tick: 80
bib: bib3
Start: 0
Length: *
tmpl:
idle:
@@ -253,6 +300,9 @@ tmpl:
Start: 0
Length: *
Tick: 60
bib: bib2
Start: 0
Length: *
obli:
idle:

View File

@@ -6,7 +6,6 @@
Dimensions: 3,2
Adjacent: 4
Bib:
Sprite: bib3x
Buildable:
Queue: Building
BuildPaletteOrder: 1000
@@ -54,7 +53,6 @@
Footprint: xx xx
Dimensions: 2,2
Bib:
Sprite: bib2x
Health:
HP: 400
Armor:
@@ -83,7 +81,6 @@
Footprint: =x xx
Dimensions: 2,2
Bib:
Sprite: bib2x
Health:
HP: 800
Armor:
@@ -126,7 +123,6 @@
Footprint: xxx x==
Dimensions: 3,2
Bib:
Sprite: bib3x
Health:
HP: 900
Armor:
@@ -201,7 +197,6 @@
Footprint: xxx xx=
Dimensions: 3,2
Bib:
Sprite: bib3x
Health:
HP: 750
Armor:
@@ -240,7 +235,6 @@
Footprint: _x_ xxx =xx
Dimensions: 3,3
Bib:
Sprite: bib3x
Health:
HP: 1500
Armor:
@@ -281,7 +275,6 @@
Footprint: xxx xxx
Dimensions: 3,2
Bib:
Sprite: bib3x
Health:
HP: 1000
Armor:
@@ -312,7 +305,6 @@
Footprint: xxx x=x =x=
Dimensions: 3,3
Bib:
Sprite: bib3x
Health:
HP: 1000
Armor:
@@ -321,7 +313,6 @@
Range: 7
RallyPoint:
RallyPoint: 1,3
BelowUnits:
Exit@1:
SpawnOffset: 0,-15
ExitCell: 2,2
@@ -526,7 +517,6 @@ REPAIR:
Type: Concrete
RevealsShroud:
Range: 5
BelowUnits:
Reservable:
RepairsUnits:
Interval: 15
@@ -553,7 +543,6 @@ REPAIR:
Footprint: _x_ xxx xxx
Dimensions: 3,3
Bib:
Sprite: bib3x
Health:
HP: 1500
Armor:
@@ -595,7 +584,6 @@ RESEARCH:
Footprint: xxx xxx
Dimensions: 3,2
Bib:
Sprite: bib3x
Health:
HP: 1000
Armor:
@@ -624,7 +612,6 @@ RESEARCH:
Footprint: _x_ xxx =xx
Dimensions: 3,3
Bib:
Sprite: bib3x
Health:
HP: 2000
Armor:
@@ -672,8 +659,6 @@ PALACEC:
Building:
Footprint: xxx xxx
Dimensions: 3,2
Bib:
Sprite: bib3x
RenderBuilding:
HasMakeAnimation: false
@@ -695,7 +680,6 @@ HEAVYC:
# Building:
# TerrainTypes: Rock
# Footprint: =
# BelowUnits:
# LineBuild:
# Range: 4
# RenderBuildingWall:
@@ -720,7 +704,6 @@ HEAVYC:
# Building:
# TerrainTypes: Rock
# Footprint: =
# BelowUnits:
# LineBuild:
# Range: 6
# RenderBuildingWall:

View File

@@ -354,7 +354,6 @@ World:
Country@Ordos:
Name: Ordos
Race: ordos
BibLayer:
DomainIndex:
ResourceLayer:
ResourceClaimLayer:
@@ -480,7 +479,6 @@ CRATE:
UncloakSound: STEALTH2.WAV
Effect: cloak
RenderSimple:
BelowUnits:
ProximityCaptor:
Types:Crate
Passenger:
@@ -506,7 +504,6 @@ SPICEBLOOM:
RelativeToTopLeft: yes
ProximityCaptor:
Types:Tree
BelowUnits:
Tooltip:
Name: Spice Bloom
SeedsResource:
@@ -547,7 +544,6 @@ SPICEBLOOM:
# AttackLeap:
# CanAttackGround: no
# RenderInfantry:
# BelowUnits:
# GivesExperience:
# GivesBounty:
# DrawLineToTarget:

View File

@@ -1,8 +1,10 @@
crate:
idle: crates
Start: 0
ZOffset: -511
land: crates
Start: 0
ZOffset: -511
spicebloom:
make:
@@ -11,8 +13,10 @@ spicebloom:
active:
Start: 2
Length: 1
ZOffset: -511
idle:
Start: 2
ZOffset: -511
sandworm:
stand: wormsigns1

View File

@@ -54,6 +54,9 @@ conyarda:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
#build: cranea
# Start: 0
# Length: 14
@@ -66,33 +69,44 @@ conyarda:
repair:
idle:
Start: 0
ZOffset: -1c511
active:
Start: 0
Length: 10
Tick: 60
ZOffset: -1c511
damaged-idle:
Start: 10
ZOffset: -1c511
damaged-active:
Start: 10
Length: 10
Tick: 60
ZOffset: -1c511
make: repairmake
Start: 0
Length: *
damaged-idle:
Start: 10
starporta:
idle:
Start: 0
ZOffset: -1c511
active:
Start: 0
Length: 1
ZOffset: -1c511
damaged-idle:
Start: 1
ZOffset: -1c511
damaged-active:
Start: 1
ZOffset: -1c511
make: starportmake
Start: 0
Length: *
bib: bib3x
Start: 0
Length: *
pwra:
idle:
@@ -104,6 +118,9 @@ pwra:
Length: *
damaged-idle:
Start: 6
bib: bib2x
Start: 0
Length: *
barra:
idle:
@@ -113,6 +130,9 @@ barra:
Length: *
damaged-idle:
Start: 1
bib: bib2x
Start: 0
Length: *
radara:
idle:
@@ -122,6 +142,9 @@ radara:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
refa:
idle:
@@ -142,6 +165,9 @@ refa:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
siloa:
idle:
@@ -162,6 +188,9 @@ hightecha:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
research:
idle:
@@ -175,6 +204,9 @@ research:
Start: 20
Length: 20
Tick: 80
bib: bib3x
Start: 0
Length: *
palacea:
idle:
@@ -184,7 +216,9 @@ palacea:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
lighta:
idle:
@@ -205,6 +239,9 @@ lighta:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
heavya:
idle:
@@ -225,6 +262,9 @@ heavya:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
conyardh:
idle:
@@ -234,20 +274,30 @@ conyardh:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
starporth:
idle:
Start: 0
ZOffset: -1c511
active:
Start: 0
Length: 1
ZOffset: -1c511
damaged-idle:
Start: 1
ZOffset: -1c511
damaged-active:
Start: 1
ZOffset: -1c511
make: starportmake
Start: 0
Length: *
bib: bib3x
Start: 0
Length: *
pwrh:
idle:
@@ -259,6 +309,9 @@ pwrh:
Length: *
damaged-idle:
Start: 6
bib: bib2x
Start: 0
Length: *
barrh:
idle:
@@ -268,6 +321,9 @@ barrh:
Length: *
damaged-idle:
Start: 1
bib: bib2x
Start: 0
Length: *
radarh:
idle:
@@ -277,6 +333,9 @@ radarh:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
refh:
idle:
@@ -297,6 +356,9 @@ refh:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
siloh:
idle:
@@ -317,6 +379,9 @@ hightechh:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
palaceh:
idle:
@@ -334,6 +399,9 @@ palaceh:
Start: 8
Length: 6
Tick: 160
bib: bib3x
Start: 0
Length: *
lighth:
idle:
@@ -354,6 +422,9 @@ lighth:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
heavyh:
idle:
@@ -374,6 +445,9 @@ heavyh:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
conyardo:
idle:
@@ -383,20 +457,30 @@ conyardo:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
starporto:
idle:
Start: 0
ZOffset: -1c511
active:
Start: 0
Length: 1
ZOffset: -1c511
damaged-idle:
Start: 1
ZOffset: -1c511
damaged-active:
Start: 1
ZOffset: -1c511
make: starportmake
Start: 0
Length: *
bib: bib3x
Start: 0
Length: *
pwro:
idle:
@@ -408,6 +492,9 @@ pwro:
Length: *
damaged-idle:
Start: 6
bib: bib2x
Start: 0
Length: *
barro:
idle:
@@ -417,6 +504,9 @@ barro:
Length: *
damaged-idle:
Start: 1
bib: bib2x
Start: 0
Length: *
radaro:
idle:
@@ -426,6 +516,9 @@ radaro:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
refo:
idle:
@@ -446,6 +539,9 @@ refo:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
siloo:
idle:
@@ -466,6 +562,9 @@ hightecho:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
palaceo:
idle:
@@ -475,7 +574,9 @@ palaceo:
Length: *
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
lighto:
idle:
@@ -496,6 +597,9 @@ lighto:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
heavyo:
idle:
@@ -516,26 +620,39 @@ heavyo:
Start: 1
damaged-idle-top:
Start: 2
bib: bib3x
Start: 0
Length: *
palacec:
idle:
Start: 0
damaged-idle:
Start: 1
bib: bib3x
Start: 0
Length: *
starportc:
idle:
Start: 0
ZOffset: -1c511
active:
Start: 0
Length: 1
ZOffset: -1c511
damaged-idle:
Start: 1
ZOffset: -1c511
damaged-active:
Start: 1
ZOffset: -1c511
make: starportmake
Start: 0
Length: *
bib: bib3x
Start: 0
Length: *
heavyc:
idle:
@@ -555,4 +672,7 @@ heavyc:
idle-top:
Start: 1
damaged-idle-top:
Start: 2
Start: 2
bib: bib3x
Start: 0
Length: *

View File

@@ -521,7 +521,6 @@ Rules:
Armor:
Type: Wood
Bib:
Sprite: bib3
RevealsShroud:
Range: 3
Capturable:

View File

@@ -69,7 +69,6 @@ FCOM:
RevealsShroud:
Range: 10
Bib:
Sprite: bib3
HOSP:
Inherits: ^TechBuilding
@@ -301,7 +300,6 @@ MISS:
Tooltip:
Name: Technology Center
Bib:
Sprite: bib2
BIO:
Inherits: ^TechBuilding
@@ -321,7 +319,6 @@ OILB:
Health:
HP: 1000
Bib:
Sprite: bib3
RevealsShroud:
Range: 3
Capturable:

View File

@@ -378,7 +378,6 @@ DOME:
RevealsShroud:
Range: 10
Bib:
Sprite: bib3
ProvidesRadar:
IronCurtainable:
Infiltratable:
@@ -853,7 +852,6 @@ ATEK:
RevealsShroud:
Range: 10
Bib:
Sprite: bib3
IronCurtainable:
GpsPower:
Image: gpssicon
@@ -890,7 +888,6 @@ WEAP:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
-RenderBuilding:
RenderBuildingWarFactory:
RallyPoint:
@@ -920,7 +917,6 @@ FACT:
RevealsShroud:
Range: 5
Bib:
Sprite: bib2
Production:
Produces: Building,Defense
IronCurtainable:
@@ -964,7 +960,6 @@ PROC:
RevealsShroud:
Range: 6
Bib:
Sprite: bib2
OreRefinery:
StoresOre:
PipCount: 17
@@ -1040,13 +1035,11 @@ HPAD:
RevealsShroud:
Range: 5
Bib:
Sprite: bib3
Exit@1:
SpawnOffset: 0,-6
ExitCell: 0,0
Production:
Produces: Helicopter
BelowUnits:
Reservable:
IronCurtainable:
ProductionBar:
@@ -1081,7 +1074,6 @@ AFLD:
Facing:192
Production:
Produces: Plane
BelowUnits:
Reservable:
IronCurtainable:
SpyPlanePower:
@@ -1128,7 +1120,6 @@ POWR:
RevealsShroud:
Range: 4
Bib:
Sprite: bib3
IronCurtainable:
DeadBuildingState:
@@ -1158,7 +1149,6 @@ APWR:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
IronCurtainable:
DeadBuildingState:
@@ -1188,7 +1178,6 @@ STEK:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
IronCurtainable:
BARR:
@@ -1215,7 +1204,6 @@ BARR:
RevealsShroud:
Range: 5
Bib:
Sprite: bib3
RallyPoint:
Exit@1:
SpawnOffset: -4,19
@@ -1253,7 +1241,6 @@ TENT:
RevealsShroud:
Range: 5
Bib:
Sprite: bib3
RallyPoint:
Exit@1:
SpawnOffset: -1,19
@@ -1307,7 +1294,6 @@ FIX:
Type: Wood
RevealsShroud:
Range: 5
BelowUnits:
Reservable:
RallyPoint:
IronCurtainable:
@@ -1336,7 +1322,6 @@ FACF:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
RenderBuilding:
Image: FACT
Fake:
@@ -1366,7 +1351,6 @@ WEAF:
RevealsShroud:
Range: 4
Bib:
Sprite: bib2
-RenderBuilding:
RenderBuildingWarFactory:
Image: WEAP
@@ -1459,7 +1443,6 @@ DOMF:
RevealsShroud:
Range: 4
Bib:
Sprite: bib3
RenderBuilding:
Image: DOME
Fake:

View File

@@ -610,7 +610,6 @@ World:
Country@1:
Name: Soviet
Race: soviet
BibLayer:
DomainIndex:
ResourceLayer:
ResourceClaimLayer:
@@ -796,7 +795,6 @@ CRATE:
SelectionShares: 3
Unit: 4tnk
RenderSimple:
BelowUnits:
ProximityCaptor:
Types:Crate
Passenger:

View File

@@ -221,12 +221,15 @@ fb4:
crate:
idle: scrate
Start: 0
ZOffset: -511
water: wwcrate
Start: 0
Length: *
Tick: 500
ZOffset: -511
land: sh-crate
Start: 0
ZOffset: -511
crate-effects:
speed: speed

View File

@@ -6,6 +6,9 @@ fcom:
make: fcommake
Start: 0
Length: *
bib: bib3
Start: 0
Length: *
hosp:
idle:
@@ -35,7 +38,9 @@ oilb:
Length: *
make:
Start: 0
bib: bib3
Start: 0
Length: *
fact:
idle:
Start: 0
@@ -52,6 +57,9 @@ fact:
Length: 25
dead: factdead
Start: 0
bib: bib2
Start: 0
Length: *
proc:
idle:
@@ -63,6 +71,9 @@ proc:
Length: *
dead: procdead
Start: 0
bib: bib2
Start: 0
Length: *
silo:
idle: silo2
@@ -85,6 +96,9 @@ powr:
Length: *
dead: powrdead
Start: 0
bib: bib3
Start: 0
Length: *
apwr:
idle:
@@ -96,6 +110,9 @@ apwr:
Length: *
dead: apwrdead
Start: 0
bib: bib2
Start: 0
Length: *
barr:
idle:
@@ -107,6 +124,9 @@ barr:
make: barrmake
Start: 0
Length: *
bib: bib3
Start: 0
Length: *
tent:
idle:
@@ -118,6 +138,9 @@ tent:
make: tentmake
Start: 0
Length: *
bib: bib3
Start: 0
Length: *
kenn:
idle:
@@ -136,6 +159,9 @@ dome:
make: domemake
Start: 0
Length: *
bib: bib3
Start: 0
Length: *
atek:
idle:
@@ -149,6 +175,9 @@ atek:
Start: 0
Length: *
Offset: -4,0
bib: bib3
Start: 0
Length: *
stek:
idle:
@@ -158,6 +187,9 @@ stek:
make: stekmake
Start: 0
Length: *
bib: bib2
Start: 0
Length: *
weap:
idle:
@@ -177,42 +209,56 @@ weap:
Start: 0
damaged-idle-top: weap2
Start: 4
bib: bib2
Start: 0
Length: *
hpad:
idle:
Start: 0
ZOffset: -1023
damaged-idle:
Start: 7
make: hpadmake
Start: 0
Length: *
ZOffset: -1023
active:
Start: 1
Length: 6
ZOffset: -1023
damaged-active:
Start: 8
Length: 6
ZOffset: -1023
make: hpadmake
Start: 0
Length: *
bib: bib3
Start: 0
Length: *
afld:
idle: afldidle
Start: 0
Length: 8
Tick: 160
ZOffset: -1023
damaged-idle: afldidle
Start: 8
Length: 8
Tick: 160
make: afldmake
Start: 0
Length: *
ZOffset: -1023
active:
Start: 0
Length: 8
Tick: 160
ZOffset: -1023
damaged-active:
Start: 8
Length: 8
Tick: 160
ZOffset: -1023
make: afldmake
Start: 0
Length: *
spen:
idle:
@@ -235,17 +281,21 @@ syrd:
fix:
idle:
Start: 0
ZOffset: -1c511
damaged-idle:
Start: 7
make: fixmake
Start: 0
Length: *
ZOffset: -1c511
active:
Start: 1
Length: 6
ZOffset: -1c511
damaged-active:
Start: 8
Length: 6
ZOffset: -1c511
make: fixmake
Start: 0
Length: *
gun:
idle:
@@ -424,6 +474,9 @@ miss:
make: missmake
Start: 0
Length: *
bib: bib2
Start: 0
Length: *
brik:
idle: