Reimplement Bibs

This commit is contained in:
Paul Chote
2010-04-02 19:43:22 +13:00
committed by Bob
parent 25c95982d7
commit fd5539d110
13 changed files with 148 additions and 67 deletions

View File

@@ -1,4 +1,4 @@
#region Copyright & License Information
#region Copyright & License Information
/*
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
* This file is part of OpenRA.
@@ -32,7 +32,8 @@ namespace OpenRA.GameRules
var dim = buildingInfo.Dimensions;
var footprint = buildingInfo.Footprint.Where(x => !char.IsWhiteSpace(x));
if (buildingInfo.Bib)
if (Rules.Info[ name ].Traits.Contains<BibInfo>())
{
dim.Y += 1;
footprint = footprint.Concat(new char[dim.X]);

View File

@@ -292,6 +292,7 @@
<Compile Include="Effects\CrateEffect.cs" />
<Compile Include="Traits\World\GlobalDefaults.cs" />
<Compile Include="Traits\RepairsUnits.cs" />
<Compile Include="Traits\World\BibLayer.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -42,7 +42,6 @@ namespace OpenRA.Traits
public readonly int Power = 0;
public readonly bool BaseNormal = true;
public readonly int Adjacent = 2;
public readonly bool Bib = false;
public readonly bool Capturable = false;
public readonly bool Repairable = true;
public readonly string Footprint = "x";

View File

@@ -31,8 +31,6 @@ namespace OpenRA.Traits
public class RenderBuilding : RenderSimple, INotifyDamage, INotifySold
{
static readonly int[] bibStarts = { 0, 0, 1, 5, 11 };
public RenderBuilding( Actor self )
: this( self, () => 0 )
{
@@ -45,8 +43,6 @@ namespace OpenRA.Traits
Complete( self );
else
anim.PlayThen( "make", () => self.World.AddFrameEndTask( _ => Complete( self ) ) );
DoBib(self, false);
}
void Complete( Actor self )
@@ -56,31 +52,6 @@ namespace OpenRA.Traits
x.BuildingComplete( self );
}
void DoBib(Actor self, bool isRemove)
{
/*
var buildingInfo = self.Info.Traits.Get<BuildingInfo>();
if (buildingInfo.Bib)
{
var size = buildingInfo.Dimensions.X;
var bibOffset = buildingInfo.Dimensions.Y - 1;
var startIndex = bibStarts[size];
for (int i = 0; i < 2 * size; i++)
{
var p = self.Location + new int2(i % size, i / size + bibOffset);
if (isRemove)
{
if (self.World.Map.MapTiles[p.X, p.Y].smudge == (byte)(i + startIndex))
self.World.Map.MapTiles[ p.X, p.Y ].smudge = 0;
}
else
self.World.Map.MapTiles[p.X, p.Y].smudge = (byte)(i + startIndex);
}
}
*/
}
protected string GetPrefix(Actor self)
{
return self.GetDamageState() == DamageState.Half ? "damaged-" : "";
@@ -119,7 +90,6 @@ namespace OpenRA.Traits
Sound.Play(self.Info.Traits.Get<BuildingInfo>().DamagedSound);
break;
case DamageState.Dead:
DoBib(self, true);
self.World.AddFrameEndTask(w => w.Add(new Explosion(w, self.CenterLocation.ToInt2(), 7, false)));
break;
}
@@ -134,6 +104,6 @@ namespace OpenRA.Traits
Sound.PlayToPlayer(self.Owner, s);
}
public void Sold(Actor self) { DoBib(self, true); }
public void Sold(Actor self) {}
}
}

View File

@@ -0,0 +1,108 @@
#region Copyright & License Information
/*
* Copyright 2007,2009,2010 Chris Forbes, Robert Pepperell, Matthew Bowra-Dean, Paul Chote, Alli Witheford.
* This file is part of OpenRA.
*
* OpenRA is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenRA is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenRA. If not, see <http://www.gnu.org/licenses/>.
*/
#endregion
using System;
using System.Linq;
using System.Drawing;
using OpenRA.Graphics;
using OpenRA.FileFormats;
namespace OpenRA.Traits
{
class BibLayerInfo : ITraitInfo
{
public readonly string[] BibTypes = {"bib3", "bib2", "bib1"};
public readonly int[] BibWidths = {2,3,4};
public object Create(Actor self) { return new BibLayer(self, this); }
}
class BibLayer: IRenderOverlay, ILoadWorldHook
{
SpriteRenderer spriteRenderer;
World world;
BibLayerInfo info;
TileReference<byte,byte>[,] tiles;
Sprite[][] bibSprites;
public BibLayer(Actor self, BibLayerInfo info)
{
spriteRenderer = new SpriteRenderer( Game.renderer, true );
this.info = info;
bibSprites = info.BibTypes.Select(x => SpriteSheetBuilder.LoadAllSprites(x)).ToArray();
self.World.ActorAdded +=
a => { if (a.traits.Contains<Bib>()) DoBib(a,true); };
self.World.ActorRemoved +=
a => { if (a.traits.Contains<Bib>()) DoBib(a,false); };
}
public void WorldLoaded(World w)
{
world = w;
tiles = new TileReference<byte,byte>[w.Map.MapSize.X,w.Map.MapSize.Y];
}
public void DoBib(Actor b, bool isAdd)
{
var buildingInfo = b.Info.Traits.Get<BuildingInfo>();
var size = buildingInfo.Dimensions.X;
var bibOffset = buildingInfo.Dimensions.Y - 1;
int bib = Array.IndexOf(info.BibWidths,size);
if (bib < 0)
{
Log.Write("Cannot bib {0}-wide building {1}",size,b.Info.Name);
return;
}
for (int i = 0; i < 2 * size; i++)
{
var p = b.Location + new int2(i % size, i / size + bibOffset);
byte type = (byte)((isAdd) ? bib+1 : 0);
byte index = (byte)i;
tiles[p.X,p.Y] = new TileReference<byte,byte>(type,index);
}
}
public void Render()
{
var shroud = world.LocalPlayer.Shroud;
var tl = world.Map.TopLeft;
var br = world.Map.BottomRight;
for (int x = tl.X; x < br.X; x++)
for (int y = tl.Y; y < br.Y; y++)
{
var t = new int2(x, y);
if (!shroud.IsExplored(t) || tiles[x,y].type == 0) continue;
spriteRenderer.DrawSprite(bibSprites[tiles[x,y].type- 1][tiles[x,y].image],
Game.CellSize * (float2)t, "terrain");
}
spriteRenderer.Flush();
}
}
class BibInfo : StatelessTraitInfo<Bib> { }
public class Bib { }
}

View File

@@ -152,8 +152,10 @@ namespace OpenRA
public static bool IsCloseEnoughToBase(this World world, Player p, string buildingName, BuildingInfo bi, int2 topLeft)
{
var buildingMaxBounds = bi.Dimensions;
if( bi.Bib )
if( Rules.Info[ buildingName ].Traits.Contains<BibInfo>() )
buildingMaxBounds.Y += 1;
var scanStart = world.ClampToWorld( topLeft - new int2( bi.Adjacent, bi.Adjacent ) );