Merge pull request #4883 from pchote/concrete

Add buildable concrete to D2K.
This commit is contained in:
Matthias Mailänder
2014-03-18 09:36:15 +01:00
18 changed files with 536 additions and 27 deletions

View File

@@ -34,6 +34,7 @@ NEW:
Removed the build radius restrictions.
Added the BLOXXMAS terrain tiles from the 1.06 patch.
Saboteur can now plant C4 on vehicles.
Added concrete plates and building weathering.
Red Alert:
Chinook rotors now counter-rotate.
Transports will now open their doors when at shore.

View File

@@ -0,0 +1,75 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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.Linq;
using OpenRA.GameRules;
using OpenRA.Mods.RA.Buildings;
using OpenRA.Traits;
namespace OpenRA.Mods.Cnc
{
class DamagedWithoutFoundationInfo : ITraitInfo, Requires<HealthInfo>
{
[WeaponReference]
public readonly string Weapon = "weathering";
public readonly string[] SafeTerrain = { "Concrete" };
public readonly int DamageThreshold = 50;
public object Create(ActorInitializer init) { return new DamagedWithoutFoundation(init.self, this); }
}
class DamagedWithoutFoundation : ITick, ISync, INotifyAddedToWorld
{
readonly DamagedWithoutFoundationInfo info;
readonly Health health;
readonly WeaponInfo weapon;
[Sync] int damageThreshold = 100;
[Sync] int damageTicks;
public DamagedWithoutFoundation(Actor self, DamagedWithoutFoundationInfo info)
{
this.info = info;
health = self.Trait<Health>();
weapon = Rules.Weapons[info.Weapon.ToLowerInvariant()];
}
public void AddedToWorld(Actor self)
{
var safeTiles = 0;
var totalTiles = 0;
foreach (var kv in self.OccupiesSpace.OccupiedCells())
{
totalTiles++;
if (info.SafeTerrain.Contains(self.World.GetTerrainType(kv.First)))
safeTiles++;
}
damageThreshold = (info.DamageThreshold * health.MaxHP + (100 - info.DamageThreshold) * safeTiles * health.MaxHP / totalTiles) / 100;
// Actors start with maximum damage applied
var delta = health.HP - damageThreshold;
if (delta > 0)
health.InflictDamage(self, self.World.WorldActor, delta, null, false);
}
public void Tick(Actor self)
{
if (health.HP <= damageThreshold || --damageTicks > 0)
return;
foreach (var w in weapon.Warheads)
health.InflictDamage(self, self.World.WorldActor, w.Damage, w, false);
damageTicks = weapon.ROF;
}
}
}

View File

@@ -81,6 +81,7 @@
<Compile Include="PaletteFromR8.cs" />
<Compile Include="D2kResourceLayer.cs" />
<Compile Include="FogPaletteFromR8.cs" />
<Compile Include="DamagedWithoutFoundation.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<PropertyGroup>

View File

@@ -23,31 +23,40 @@ namespace OpenRA.Mods.RA.Buildings
public object Create(ActorInitializer init) { return new Bib(init.self, this); }
}
public class Bib : IRender
public class Bib : IRender, INotifyAddedToWorld
{
readonly BibInfo info;
readonly List<AnimationWithOffset> tiles;
List<AnimationWithOffset> tiles;
public Bib(Actor self, BibInfo info)
{
this.info = info;
}
public void AddedToWorld(Actor self)
{
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);
var location = self.Location;
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);
var cellOffset = new CVec(i % width, i / width + bibOffset);
// Some mods may define terrain-specific bibs
var terrain = self.World.GetTerrainType(location + cellOffset);
var testSequence = info.Sequence + "-" + terrain;
var sequence = anim.HasSequence(testSequence) ? testSequence : info.Sequence;
anim.PlayFetchIndex(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;
var offset = cellOffset.ToWVec() - centerOffset;
tiles.Add(new AnimationWithOffset(anim, () => offset, null, -(offset.Y + centerOffset.Y + 512)));
}
}

View File

@@ -32,6 +32,7 @@ namespace OpenRA.Mods.RA.Buildings
public readonly string Footprint = "x";
public readonly int2 Dimensions = new int2(1, 1);
public readonly bool RequiresBaseProvider = false;
public readonly bool AllowInvalidPlacement = false;
public readonly string[] BuildSounds = {"placbldg.aud", "build5.aud"};
public readonly string[] SellSounds = {"cashturn.aud"};
@@ -81,7 +82,7 @@ namespace OpenRA.Mods.RA.Buildings
{
var pos = new CPos(x, y);
var at = bi.GetBuildingAt(pos);
if (at == null || !at.HasTrait<GivesBuildableArea>())
if (at == null || !at.IsInWorld || !at.HasTrait<GivesBuildableArea>())
continue;
if (at.Owner == p || (allyBuildRadius && at.Owner.Stances[p] == Stance.Ally))

View File

@@ -1,6 +1,6 @@
#region Copyright & License Information
/*
* Copyright 2007-2011 The OpenRA Developers (see AUTHORS)
* Copyright 2007-2014 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,
@@ -14,7 +14,7 @@ namespace OpenRA.Mods.RA.Buildings
{
public class BuildingInfluenceInfo : ITraitInfo
{
public object Create( ActorInitializer init ) { return new BuildingInfluence( init.world ); }
public object Create(ActorInitializer init) { return new BuildingInfluence(init.world); }
}
public class BuildingInfluence
@@ -22,30 +22,40 @@ namespace OpenRA.Mods.RA.Buildings
Actor[,] influence;
Map map;
public BuildingInfluence( World world )
public BuildingInfluence(World world)
{
map = world.Map;
influence = new Actor[map.MapSize.X, map.MapSize.Y];
world.ActorAdded +=
a => { if (a.HasTrait<Building>())
ChangeInfluence(a, a.Trait<Building>(), true); };
world.ActorRemoved +=
a => { if (a.HasTrait<Building>())
ChangeInfluence(a, a.Trait<Building>(), false); };
}
world.ActorAdded += a =>
{
var b = a.TraitOrDefault<Building>();
if (b == null)
return;
void ChangeInfluence( Actor a, Building building, bool isAdd )
{
foreach( var u in FootprintUtils.Tiles( a.Info.Name, a.Info.Traits.Get<BuildingInfo>(), a.Location ) )
if( map.IsInMap( u ) )
influence[ u.X, u.Y ] = isAdd ? a : null;
foreach (var u in FootprintUtils.Tiles(a.Info.Name, b.Info, a.Location))
if (map.IsInMap(u) && influence[u.X, u.Y] == null)
influence[u.X, u.Y] = a;
};
world.ActorRemoved += a =>
{
var b = a.TraitOrDefault<Building>();
if (b == null)
return;
foreach (var u in FootprintUtils.Tiles(a.Info.Name, b.Info, a.Location))
if (map.IsInMap(u) && influence[u.X, u.Y] == a)
influence[u.X, u.Y] = null;
};
}
public Actor GetBuildingAt(CPos cell)
{
if (!map.IsInMap(cell)) return null;
if (!map.IsInMap(cell))
return null;
return influence[cell.X, cell.Y];
}
}

View File

@@ -0,0 +1,88 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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.FileFormats;
using OpenRA.Graphics;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Buildings
{
public class LaysTerrainInfo : ITraitInfo, Requires<BuildingInfo>, Requires<RenderSpritesInfo>
{
[Desc("The terrain template to place. If the template is PickAny, then" +
"the actor footprint will be filled with this tile.")]
public readonly ushort Template = 0;
[Desc("The terrain types that this template will be placed on")]
public readonly string[] TerrainTypes = {};
[Desc("Offset relative to the actor TopLeft. Not used if the template is PickAny")]
public readonly CVec Offset = CVec.Zero;
public object Create(ActorInitializer init) { return new LaysTerrain(init.self, this); }
}
public class LaysTerrain : INotifyAddedToWorld
{
readonly LaysTerrainInfo info;
readonly BuildableTerrainLayer layer;
readonly BuildingInfluence bi;
readonly TileTemplate template;
public LaysTerrain(Actor self, LaysTerrainInfo info)
{
this.info = info;
layer = self.World.WorldActor.Trait<BuildableTerrainLayer>();
bi = self.World.WorldActor.Trait<BuildingInfluence>();
template = self.World.TileSet.Templates[info.Template];
}
public void AddedToWorld(Actor self)
{
if (template.PickAny)
{
// Fill the footprint with random variants
foreach (var c in FootprintUtils.Tiles(self))
{
// Only place on allowed terrain types
if (!info.TerrainTypes.Contains(self.World.GetTerrainType(c)))
continue;
// Don't place under other buildings or custom terrain
if (bi.GetBuildingAt(c) != self || self.World.Map.CustomTerrain[c.X, c.Y] != null)
continue;
var index = template.Tiles.Keys.Random(Game.CosmeticRandom);
layer.AddTile(c, new TileReference<ushort, byte>(template.Id, index));
}
return;
}
var origin = self.Location + info.Offset;
foreach (var i in template.Tiles.Keys)
{
var c = origin + new CVec(i % template.Size.X, i / template.Size.X);
// Only place on allowed terrain types
if (!info.TerrainTypes.Contains(self.World.GetTerrainType(c)))
continue;
// Don't place under other buildings or custom terrain
if (bi.GetBuildingAt(c) != self || self.World.Map.CustomTerrain[c.X, c.Y] != null)
continue;
layer.AddTile(c, new TileReference<ushort, byte>(template.Id, i));
}
}
}
}

View File

@@ -31,6 +31,9 @@ namespace OpenRA.Mods.RA.Buildings
public static bool CanPlaceBuilding(this World world, string name, BuildingInfo building, CPos topLeft, Actor toIgnore)
{
if (building.AllowInvalidPlacement)
return true;
var res = world.WorldActor.Trait<ResourceLayer>();
return FootprintUtils.Tiles(name, building, topLeft).All(
t => world.Map.IsInMap(t.X, t.Y) && res.GetResource(t) == null &&

View File

@@ -482,6 +482,9 @@
<Compile Include="Widgets\Logic\GameTimerLogic.cs" />
<Compile Include="Immobile.cs" />
<Compile Include="Widgets\Logic\ReplayControlBarLogic.cs" />
<Compile Include="World\BuildableTerrainLayer.cs" />
<Compile Include="Buildings\LaysTerrain.cs" />
<Compile Include="RemoveImmediately.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -90,11 +90,17 @@ namespace OpenRA.Mods.RA.Orders
{
if (!initialized)
{
var rbi = Rules.Info[Building].Traits.Get<RenderBuildingInfo>();
var palette = rbi.Palette ?? (Producer.Owner != null ?
rbi.PlayerPalette + Producer.Owner.InternalName : null);
var rbi = Rules.Info[Building].Traits.GetOrDefault<RenderBuildingInfo>();
if (rbi == null)
preview = new IRenderable[0];
else
{
var palette = rbi.Palette ?? (Producer.Owner != null ?
rbi.PlayerPalette + Producer.Owner.InternalName : null);
preview = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
}
preview = rbi.RenderPreview(Rules.Info[Building], wr.Palette(palette));
initialized = true;
}

View File

@@ -49,6 +49,9 @@ namespace OpenRA.Mods.RA
if (e.Attacker.Owner == self.Owner)
return;
if (e.Attacker == self.World.WorldActor)
return;
if (e.Attacker.Owner.IsAlliedWith(self.Owner) && e.Damage <= 0)
return;

View File

@@ -0,0 +1,22 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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 OpenRA.FileFormats;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
public class RemoveImmediatelyInfo : TraitInfo<RemoveImmediately> {}
public class RemoveImmediately : INotifyAddedToWorld
{
public void AddedToWorld(Actor self) { self.Destroy(); }
}
}

View File

@@ -0,0 +1,82 @@
#region Copyright & License Information
/*
* Copyright 2007-2014 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.Linq;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Mods.RA.Effects;
using OpenRA.Traits;
namespace OpenRA.Mods.RA
{
public class BuildableTerrainLayerInfo : TraitInfo<BuildableTerrainLayer> { }
public class BuildableTerrainLayer : IRenderOverlay, IWorldLoaded, ITickRender
{
Dictionary<CPos, Sprite> tiles;
Dictionary<CPos, Sprite> dirty;
Theater theater;
TileSet tileset;
Map map;
public void WorldLoaded(World w, WorldRenderer wr)
{
theater = wr.Theater;
tileset = w.TileSet;
map = w.Map;
tiles = new Dictionary<CPos, Sprite>();
dirty = new Dictionary<CPos, Sprite>();
}
public void AddTile(CPos cell, TileReference<ushort, byte> tile)
{
map.CustomTerrain[cell.X, cell.Y] = tileset.GetTerrainType(tile);
// Terrain tiles define their origin at the topleft
var s = theater.TileSprite(tile);
dirty[cell] = new Sprite(s.sheet, s.bounds, float2.Zero, s.channel, s.blendMode);
}
public void TickRender(WorldRenderer wr, Actor self)
{
var remove = new List<CPos>();
foreach (var kv in dirty)
{
if (!self.World.FogObscures(kv.Key))
{
tiles[kv.Key] = kv.Value;
remove.Add(kv.Key);
}
}
foreach (var r in remove)
dirty.Remove(r);
}
public void Render(WorldRenderer wr)
{
var cliprect = wr.Viewport.CellBounds;
var pal = wr.Palette("terrain");
foreach (var kv in tiles)
{
if (!cliprect.Contains(kv.Key.X, kv.Key.Y))
continue;
if (wr.world.ShroudObscures(kv.Key))
continue;
new SpriteRenderable(kv.Value, kv.Key.CenterPosition,
WVec.Zero, -511, pal, 1f, true).Render(wr);
}
}
}
}

View File

@@ -263,4 +263,4 @@
Huntable:
LuaScriptEvents:
Demolishable:
DamagedWithoutFoundation:

View File

@@ -1,3 +1,42 @@
^CONCRETE:
Building:
Adjacent: 4
TerrainTypes: Rock
BuildSounds: BUILD1.WAV
AllowInvalidPlacement: true
LaysTerrain:
Template: 88
TerrainTypes: Rock
Tooltip:
Name: Concrete
Description: Provides a strong foundation that prevents\ndamage from the terrain.
RenderSprites:
RemoveImmediately:
CONCRETEA:
Inherits: ^CONCRETE
Building:
Footprint: xx xx
Dimensions: 2,2
Buildable:
Queue: Building
BuildPaletteOrder:10
Owner: atreides, harkonnen, ordos
Valued:
Cost: 20
CONCRETEB:
Inherits: ^CONCRETE
Building:
Footprint: xxx xxx xxx
Dimensions: 3,3
Buildable:
Queue: Building
BuildPaletteOrder: 10
Owner: atreides, harkonnen, ordos
Valued:
Cost: 50
^CONYARD:
Inherits: ^Building
Building:
@@ -5,6 +44,9 @@
Footprint: xxx xxx
Dimensions: 3,2
Adjacent: 4
LaysTerrain:
TerrainTypes: Rock
Template: 88
Bib:
Buildable:
Queue: Building

View File

@@ -88,6 +88,7 @@ World:
Race: ordos
DomainIndex:
PathfinderDebugOverlay:
BuildableTerrainLayer:
D2kResourceLayer:
ResourceClaimLayer:
ResourceType@Spice:

View File

@@ -1,3 +1,13 @@
concretea:
icon: DATA
Start:4050
Offset: -30,-24
concreteb:
icon: DATA
Start:4053
Offset: -30,-24
walla:
idle: DATA
Frames: 2527, 2530, 2528, 2538, 2531, 2532, 2542, 2535, 2529, 2539, 2533, 2534, 2540, 2536, 2537, 2541
@@ -254,6 +264,10 @@ conyarda:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4046
Offset: -30,-24
@@ -388,6 +402,10 @@ starporta:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4092
Offset: -30,-24
@@ -422,6 +440,10 @@ pwra:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4056
Offset: -30,-24
@@ -446,6 +468,10 @@ barra:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4059
Offset: -30,-24
@@ -474,6 +500,10 @@ radara:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4072
Offset: -30,-24
@@ -505,6 +535,10 @@ refa:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4066
Offset: -30,-24
@@ -557,6 +591,10 @@ hightecha:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4078
Offset: -30,-24
@@ -586,6 +624,10 @@ researcha:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4099
Offset: -30,-24
@@ -615,6 +657,10 @@ researchh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4100
Offset: -30,-24
@@ -644,6 +690,10 @@ researcho:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4101
Offset: -30,-24
@@ -668,6 +718,10 @@ palacea:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4102
Offset: -30,-24
@@ -713,6 +767,10 @@ lighta:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4081
Offset: -30,-24
@@ -758,6 +816,10 @@ heavya:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4087
Offset: -30,-24
@@ -790,6 +852,10 @@ conyardh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4047
Offset: -30,-24
@@ -825,6 +891,10 @@ starporth:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4093
Offset: -30,-24
@@ -859,6 +929,10 @@ pwrh:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4057
Offset: -30,-24
@@ -883,6 +957,10 @@ barrh:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4060
Offset: -30,-24
@@ -911,6 +989,10 @@ radarh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4073
Offset: -30,-24
@@ -942,6 +1024,10 @@ refh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4067
Offset: -30,-24
@@ -994,6 +1080,10 @@ hightechh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4079
Offset: -30,-24
@@ -1026,6 +1116,10 @@ palaceh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4103
Offset: -30,-24
@@ -1071,6 +1165,10 @@ lighth:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4082
Offset: -30,-24
@@ -1116,6 +1214,10 @@ heavyh:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4088
Offset: -30,-24
@@ -1148,6 +1250,10 @@ conyardo:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4048
Offset: -30,-24
@@ -1183,6 +1289,10 @@ starporto:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4094
Offset: -30,-24
@@ -1218,6 +1328,10 @@ pwro:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4058
Offset: -30,-24
@@ -1242,6 +1356,10 @@ barro:
Frames: 617, 618, 637, 638
Length: 4
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 649, 650, 669, 670
Length: 4
Offset: -16,-16
icon: DATA
Start: 4061
Offset: -30,-24
@@ -1270,6 +1388,10 @@ radaro:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4074
Offset: -30,-24
@@ -1301,6 +1423,10 @@ refo:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4068
Offset: -30,-24
@@ -1353,6 +1479,10 @@ hightecho:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4080
Offset: -30,-24
@@ -1377,6 +1507,10 @@ palaceo:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4104
Offset: -30,-24
@@ -1422,6 +1556,10 @@ lighto:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4083
Offset: -30,-24
@@ -1467,6 +1605,10 @@ heavyo:
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4089
Offset: -30,-24
@@ -1482,6 +1624,10 @@ palacec: # TODO: unused
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: palacecicon
Start: 0
make: DATA
@@ -1525,6 +1671,10 @@ starportc: # TODO: unused
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA # TODO: blank
Start: 4020
Offset: -30,-24
@@ -1570,6 +1720,10 @@ heavyc: # TODO: unused
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA # TODO: blank
Start: 4020
Offset: -30,-24
@@ -1602,6 +1756,10 @@ conyardc: # TODO: unused
Frames: 611, 612, 613, 631, 632, 633
Length: 6
Offset: -16,-16
bib-Concrete: BLOXBASE
Frames: 643, 644, 645, 663, 664, 665
Length: 6
Offset: -16,-16
icon: DATA
Start: 4049
Offset: -30,-24

View File

@@ -621,3 +621,7 @@ Grenade:
Damage: 60
ImpactSound: EXPLLG5.WAV
Weathering:
ROF: 100
Warhead:
Damage: 5