Move damage sounds and shaking from Building/RenderBuilding into their own traits. Fix wall damage/death sounds under cnc.

This commit is contained in:
Paul Chote
2011-01-04 13:13:01 +13:00
parent 4a47641656
commit 76216b8dd9
12 changed files with 106 additions and 35 deletions

View File

@@ -29,10 +29,9 @@ namespace OpenRA.Mods.RA.Buildings
public readonly string[] BuildSounds = {"placbldg.aud", "build5.aud"}; public readonly string[] BuildSounds = {"placbldg.aud", "build5.aud"};
public readonly string[] SellSounds = {"cashturn.aud"}; public readonly string[] SellSounds = {"cashturn.aud"};
public readonly string DamagedSound = "kaboom1.aud";
public readonly string DestroyedSound = "kaboom22.aud";
public object Create(ActorInitializer init) { return new Building(init); }
public object Create(ActorInitializer init) { return new Building(init, this); }
public bool IsCloseEnoughToBase(World world, Player p, string buildingName, int2 topLeft) public bool IsCloseEnoughToBase(World world, Player p, string buildingName, int2 topLeft)
{ {
@@ -73,11 +72,11 @@ namespace OpenRA.Mods.RA.Buildings
public int2 PxPosition { get { return ( 2 * topLeft + Info.Dimensions ) * Game.CellSize / 2; } } public int2 PxPosition { get { return ( 2 * topLeft + Info.Dimensions ) * Game.CellSize / 2; } }
public Building(ActorInitializer init) public Building(ActorInitializer init, BuildingInfo info)
{ {
this.self = init.self; this.self = init.self;
this.topLeft = init.Get<LocationInit,int2>(); this.topLeft = init.Get<LocationInit,int2>();
this.Info = self.Info.Traits.Get<BuildingInfo>(); this.Info = info;
this.PlayerPower = init.self.Owner.PlayerActor.Trait<PowerManager>(); this.PlayerPower = init.self.Owner.PlayerActor.Trait<PowerManager>();
} }
@@ -95,12 +94,6 @@ namespace OpenRA.Mods.RA.Buildings
// Power plants lose power with damage // Power plants lose power with damage
if (Info.Power > 0) if (Info.Power > 0)
PlayerPower.UpdateActor(self, GetPowerUsage()); PlayerPower.UpdateActor(self, GetPowerUsage());
if (e.DamageState == DamageState.Dead)
{
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(10, self.CenterLocation, 1);
Sound.Play(Info.DestroyedSound, self.CenterLocation);
}
} }
public void ResolveOrder(Actor self, Order order) public void ResolveOrder(Actor self, Order order)

View File

@@ -0,0 +1,38 @@
#region Copyright & License Information
/*
* Copyright 2007-2010 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 LICENSE.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Buildings
{
public class ShakeOnDeathInfo : ITraitInfo
{
public readonly int Intensity = 10;
public object Create(ActorInitializer init) { return new ShakeOnDeath(this); }
}
public class ShakeOnDeath : INotifyDamage
{
readonly ShakeOnDeathInfo Info;
public ShakeOnDeath(ShakeOnDeathInfo info)
{
this.Info = info;
}
public void Damaged(Actor self, AttackInfo e)
{
if (e.DamageState == DamageState.Dead)
self.World.WorldActor.Trait<ScreenShaker>().AddEffect(Info.Intensity, self.CenterLocation, 1);
}
}
}

View File

@@ -0,0 +1,48 @@
#region Copyright & License Information
/*
* Copyright 2007-2010 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 LICENSE.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Graphics;
using OpenRA.Mods.RA.Buildings;
using OpenRA.Mods.RA.Effects;
using OpenRA.Traits;
namespace OpenRA.Mods.RA.Render
{
public class SoundOnDamageTransitionInfo : ITraitInfo
{
public readonly string DamagedSound;
public readonly string DestroyedSound;
public object Create(ActorInitializer init) { return new SoundOnDamageTransition(this);}
}
public class SoundOnDamageTransition : INotifyDamage
{
readonly SoundOnDamageTransitionInfo Info;
public SoundOnDamageTransition( SoundOnDamageTransitionInfo info )
{
Info = info;
}
public virtual void Damaged(Actor self, AttackInfo e)
{
if (!e.DamageStateChanged)
return;
if (e.DamageState == DamageState.Dead)
Sound.Play(Info.DestroyedSound, self.CenterLocation);
else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy)
Sound.Play(Info.DamagedSound, self.CenterLocation);
}
}
}

View File

@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup> <PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -326,6 +326,8 @@
<Compile Include="AttackMedic.cs" /> <Compile Include="AttackMedic.cs" />
<Compile Include="Activities\Heal.cs" /> <Compile Include="Activities\Heal.cs" />
<Compile Include="SupportPowers\SupportPowerManager.cs" /> <Compile Include="SupportPowers\SupportPowerManager.cs" />
<Compile Include="Buildings\ShakeOnDeath.cs" />
<Compile Include="Buildings\SoundOnDamageTransition.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj"> <ProjectReference Include="..\OpenRA.FileFormats\OpenRA.FileFormats.csproj">

View File

@@ -107,10 +107,7 @@ namespace OpenRA.Mods.RA.Render
self.World.AddFrameEndTask(w => w.Add(new Explosion(w, Traits.Util.CenterOfCell(cell), "building", false, 0))); self.World.AddFrameEndTask(w => w.Add(new Explosion(w, Traits.Util.CenterOfCell(cell), "building", false, 0)));
} }
else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy) else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy)
{
anim.ReplaceAnim("damaged-idle"); anim.ReplaceAnim("damaged-idle");
Sound.Play(self.Info.Traits.Get<BuildingInfo>().DamagedSound, self.CenterLocation);
}
else if (e.DamageState < DamageState.Heavy) else if (e.DamageState < DamageState.Heavy)
anim.ReplaceAnim("idle"); anim.ReplaceAnim("idle");
} }

View File

@@ -35,10 +35,7 @@ namespace OpenRA.Mods.RA.Render
if (!e.DamageStateChanged) return; if (!e.DamageStateChanged) return;
if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy) if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy)
{
anim.ReplaceAnim("damaged-idle"); anim.ReplaceAnim("damaged-idle");
Sound.Play(self.Info.Traits.Get<BuildingInfo>().DamagedSound, self.CenterLocation);
}
else if (e.DamageState < DamageState.Heavy) else if (e.DamageState < DamageState.Heavy)
anim.ReplaceAnim("idle"); anim.ReplaceAnim("idle");
} }

View File

@@ -35,24 +35,14 @@ namespace OpenRA.Mods.RA.Render
{ {
if (!e.DamageStateChanged) return; if (!e.DamageStateChanged) return;
var bi = self.Info.Traits.Get<BuildingInfo>();
if (e.DamageState == DamageState.Medium && anim.HasSequence("scratched-idle")) if (e.DamageState == DamageState.Medium && anim.HasSequence("scratched-idle"))
seqName = "scratched-idle"; seqName = "scratched-idle";
else if (e.DamageState <= DamageState.Medium) else if (e.DamageState <= DamageState.Medium)
seqName = "idle"; seqName = "idle";
else if (e.DamageState == DamageState.Critical && anim.HasSequence("critical-idle")) else if (e.DamageState == DamageState.Critical && anim.HasSequence("critical-idle"))
{
seqName = "critical-idle"; seqName = "critical-idle";
if (e.DamageState > e.PreviousDamageState)
Sound.Play(bi.DamagedSound, self.CenterLocation);
}
else if (e.DamageState <= DamageState.Critical) else if (e.DamageState <= DamageState.Critical)
{
seqName = "damaged-idle"; seqName = "damaged-idle";
if (e.DamageState > e.PreviousDamageState)
Sound.Play(bi.DamagedSound, self.CenterLocation);
}
anim.PlayFetchIndex(seqName, () => adjacentWalls); anim.PlayFetchIndex(seqName, () => adjacentWalls);
} }

BIN
mods/cnc/bits/sandbag2.aud Normal file

Binary file not shown.

View File

@@ -187,6 +187,7 @@
Footprint: x Footprint: x
BuildSounds: constru2.aud, hvydoor1.aud BuildSounds: constru2.aud, hvydoor1.aud
SellSounds: cashturn.aud SellSounds: cashturn.aud
SoundOnDamageTransition:
DamagedSound: xplos.aud DamagedSound: xplos.aud
DestroyedSound: xplobig4.aud DestroyedSound: xplobig4.aud
Buildable: Buildable:
@@ -208,6 +209,7 @@
Notification: strclost.aud Notification: strclost.aud
EditorAppearance: EditorAppearance:
RelativeToTopLeft: yes RelativeToTopLeft: yes
ShakeOnDeath:
^CivBuilding: ^CivBuilding:
Inherits: ^Building Inherits: ^Building
@@ -243,8 +245,6 @@
BuildSounds: hvydoor1.aud BuildSounds: hvydoor1.aud
Capturable: false Capturable: false
BaseNormal: no BaseNormal: no
DamagedSound:
DestroyedSound:
Adjacent: 7 Adjacent: 7
TargetableBuilding: TargetableBuilding:
TargetTypes: Ground TargetTypes: Ground
@@ -311,8 +311,9 @@
BelowUnits: BelowUnits:
Health: Health:
HP: 1000 HP: 1000
Building: SoundOnDamageTransition:
DamagedSound: xplos.aud DamagedSound: xplos.aud
DestroyedSound: xplobig4.aud DestroyedSound: xplobig4.aud
Building:
Footprint: ______ ______ ______ ______ Footprint: ______ ______ ______ ______
Dimensions: 6,4 Dimensions: 6,4

View File

@@ -569,8 +569,8 @@ BRIK:
Type: Heavy Type: Heavy
Wall: Wall:
CrushClasses: heavywall CrushClasses: heavywall
CrushSound: -CrushSound:
Building: SoundOnDamageTransition:
DestroyedSound: crumble.aud DestroyedSound: crumble.aud
GUN: GUN:

View File

@@ -130,6 +130,9 @@
Building: Building:
Dimensions: 1,1 Dimensions: 1,1
Footprint: x Footprint: x
SoundOnDamageTransition:
DamagedSound: kaboom1.aud
DestroyedSound: kaboom22.aud
RenderBuilding: RenderBuilding:
RepairableBuilding: RepairableBuilding:
EmitInfantryOnSell: EmitInfantryOnSell:
@@ -141,6 +144,7 @@
Notification: strucap1.aud Notification: strucap1.aud
EditorAppearance: EditorAppearance:
RelativeToTopLeft: yes RelativeToTopLeft: yes
ShakeOnDeath:
^Wall: ^Wall:
AppearsOnRadar: AppearsOnRadar:
@@ -150,9 +154,10 @@
BuildSounds: placbldg.aud BuildSounds: placbldg.aud
Capturable: false Capturable: false
BaseNormal: no BaseNormal: no
Adjacent: 7
SoundOnDamageTransition:
DamagedSound: sandbag2.aud DamagedSound: sandbag2.aud
DestroyedSound: sandbag2.aud DestroyedSound: sandbag2.aud
Adjacent: 7
Wall: Wall:
CrushClasses: wall CrushClasses: wall
LineBuild: LineBuild:

View File

@@ -1135,7 +1135,7 @@ BRIK:
Tooltip: Tooltip:
Name: Concrete Wall Name: Concrete Wall
Description: Stop units and blocks enemy fire. Description: Stop units and blocks enemy fire.
Building: SoundOnDamageTransition:
DamagedSound: crmble2.aud DamagedSound: crmble2.aud
DestroyedSound: kaboom30.aud DestroyedSound: kaboom30.aud
Health: Health: