Merge pull request #12465 from pchote/shellmap-overhaul

Rework shellmap UX.
This commit is contained in:
Oliver Brakmann
2016-12-23 13:57:37 +01:00
committed by GitHub
78 changed files with 178 additions and 1204 deletions

View File

@@ -533,38 +533,32 @@ namespace OpenRA
if (world == null)
return;
// Don't tick when the shellmap is disabled
if (world.ShouldTick)
var isNetTick = LocalTick % NetTickScale == 0;
if (!isNetTick || orderManager.IsReadyForNextFrame)
{
var isNetTick = LocalTick % NetTickScale == 0;
++orderManager.LocalFrameNumber;
if (!isNetTick || orderManager.IsReadyForNextFrame)
Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local");
if (BenchmarkMode)
Log.Write("cpu", "{0};{1}".F(LocalTick, PerfHistory.Items["tick_time"].LastValue));
if (isNetTick)
orderManager.Tick();
Sync.CheckSyncUnchanged(world, () =>
{
++orderManager.LocalFrameNumber;
world.OrderGenerator.Tick(world);
world.Selection.Tick(world);
});
Log.Write("debug", "--Tick: {0} ({1})", LocalTick, isNetTick ? "net" : "local");
world.Tick();
if (BenchmarkMode)
Log.Write("cpu", "{0};{1}".F(LocalTick, PerfHistory.Items["tick_time"].LastValue));
if (isNetTick)
orderManager.Tick();
Sync.CheckSyncUnchanged(world, () =>
{
world.OrderGenerator.Tick(world);
world.Selection.Tick(world);
});
world.Tick();
PerfHistory.Tick();
}
else if (orderManager.NetFrameNumber == 0)
orderManager.LastTickTime = RunTime;
}
else
PerfHistory.Tick();
}
else if (orderManager.NetFrameNumber == 0)
orderManager.LastTickTime = RunTime;
// Wait until we have done our first world Tick before TickRendering
if (orderManager.LocalFrameNumber > 0)

View File

@@ -132,9 +132,6 @@ namespace OpenRA.Graphics
RefreshPalette();
if (World.Type == WorldType.Shellmap && !Game.Settings.Game.ShowShellmap)
return;
var renderables = GenerateRenderables();
var bounds = Viewport.GetScissorBounds(World.Type != WorldType.Editor);
Game.Renderer.EnableScissor(bounds);

View File

@@ -158,8 +158,6 @@ namespace OpenRA
public string Platform = "Default";
public bool ShowShellmap = true;
public bool ViewportEdgeScroll = true;
public bool LockMouseWindow = false;
public MouseScrollType MiddleMouseScroll = MouseScrollType.Standard;

View File

@@ -32,6 +32,8 @@ namespace OpenRA
Stream GetPCMInputStream();
}
public enum SoundType { World, UI }
public sealed class Sound : IDisposable
{
readonly ISoundEngine soundEngine;
@@ -92,10 +94,11 @@ namespace OpenRA
soundEngine.SetListenerPosition(position);
}
ISound Play(Player player, string name, bool headRelative, WPos pos, float volumeModifier = 1f, bool loop = false)
ISound Play(SoundType type, Player player, string name, bool headRelative, WPos pos, float volumeModifier = 1f, bool loop = false)
{
if (string.IsNullOrEmpty(name))
if (string.IsNullOrEmpty(name) || (DisableWorldSounds && type == SoundType.World))
return null;
if (player != null && player != player.World.LocalPlayer)
return null;
@@ -119,14 +122,15 @@ namespace OpenRA
soundEngine.Volume = 1f;
}
public ISound Play(string name) { return Play(null, name, true, WPos.Zero, 1f); }
public ISound Play(string name, WPos pos) { return Play(null, name, false, pos, 1f); }
public ISound Play(string name, float volumeModifier) { return Play(null, name, true, WPos.Zero, volumeModifier); }
public ISound Play(string name, WPos pos, float volumeModifier) { return Play(null, name, false, pos, volumeModifier); }
public ISound PlayToPlayer(Player player, string name) { return Play(player, name, true, WPos.Zero, 1f); }
public ISound PlayToPlayer(Player player, string name, WPos pos) { return Play(player, name, false, pos, 1f); }
public ISound PlayLooped(string name) { return PlayLooped(name, WPos.Zero); }
public ISound PlayLooped(string name, WPos pos) { return Play(null, name, true, pos, 1f, true); }
public bool DisableWorldSounds { get; set; }
public ISound Play(SoundType type, string name) { return Play(type, null, name, true, WPos.Zero, 1f); }
public ISound Play(SoundType type, string name, WPos pos) { return Play(type, null, name, false, pos, 1f); }
public ISound Play(SoundType type, string name, float volumeModifier) { return Play(type, null, name, true, WPos.Zero, volumeModifier); }
public ISound Play(SoundType type, string name, WPos pos, float volumeModifier) { return Play(type, null, name, false, pos, volumeModifier); }
public ISound PlayToPlayer(SoundType type, Player player, string name) { return Play(type, player, name, true, WPos.Zero, 1f); }
public ISound PlayToPlayer(SoundType type, Player player, string name, WPos pos) { return Play(type, player, name, false, pos, 1f); }
public ISound PlayLooped(SoundType type, string name) { return PlayLooped(type, name, WPos.Zero); }
public ISound PlayLooped(SoundType type, string name, WPos pos) { return Play(type, null, name, true, pos, 1f, true); }
public void PlayVideo(byte[] raw, int channels, int sampleBits, int sampleRate)
{
@@ -300,13 +304,13 @@ namespace OpenRA
}
// Returns true if played successfully
public bool PlayPredefined(Ruleset ruleset, Player p, Actor voicedActor, string type, string definition, string variant,
public bool PlayPredefined(SoundType soundType, Ruleset ruleset, Player p, Actor voicedActor, string type, string definition, string variant,
bool relative, WPos pos, float volumeModifier, bool attenuateVolume)
{
if (ruleset == null)
throw new ArgumentNullException("ruleset");
if (definition == null)
if (definition == null || (DisableWorldSounds && soundType == SoundType.World))
return false;
if (ruleset.Voices == null || ruleset.Notifications == null)
@@ -375,7 +379,7 @@ namespace OpenRA
if (type == null || notification == null)
return false;
return PlayPredefined(rules, player, null, type.ToLowerInvariant(), notification, variant, true, WPos.Zero, 1f, false);
return PlayPredefined(SoundType.UI, rules, player, null, type.ToLowerInvariant(), notification, variant, true, WPos.Zero, 1f, false);
}
public void Dispose()

View File

@@ -307,7 +307,6 @@ namespace OpenRA
public event Action<Actor> ActorAdded = _ => { };
public event Action<Actor> ActorRemoved = _ => { };
public bool ShouldTick { get { return Type != WorldType.Shellmap || Game.Settings.Game.ShowShellmap; } }
public bool Paused { get; internal set; }
public bool PredictedPaused { get; internal set; }
public bool PauseStateLocked { get; set; }

View File

@@ -72,7 +72,6 @@
<Compile Include="Traits\Render\WithReloadingSpriteTurret.cs" />
<Compile Include="Traits\Render\WithRoof.cs" />
<Compile Include="Traits\SupportPowers\IonCannonPower.cs" />
<Compile Include="Widgets\Logic\CncMainMenuLogic.cs" />
<Compile Include="Widgets\Logic\ProductionTabsLogic.cs" />
<Compile Include="ImportTiberianDawnLegacyMapCommand.cs" />
<Compile Include="Projectiles\IonCannon.cs" />

View File

@@ -40,7 +40,7 @@ namespace OpenRA.Mods.Cnc.Effects
anim.PlayThen(sequence, () => Finish(world));
if (weapon.Report != null && weapon.Report.Any())
Game.Sound.Play(weapon.Report.Random(firedBy.World.SharedRandom), launchPos);
Game.Sound.Play(SoundType.World, weapon.Report.Random(firedBy.World.SharedRandom), launchPos);
}
public void Tick(World world)

View File

@@ -71,7 +71,7 @@ namespace OpenRA.Mods.Cnc.Traits
self.World.AddFrameEndTask(w =>
{
PlayLaunchSounds();
Game.Sound.Play(info.OnFireSound, self.World.Map.CenterOfCell(order.TargetLocation));
Game.Sound.Play(SoundType.World, info.OnFireSound, self.World.Map.CenterOfCell(order.TargetLocation));
w.Add(new IonCannon(self.Owner, info.WeaponInfo, w, self.CenterPosition, order.TargetLocation,
info.Effect, info.EffectSequence, info.EffectPalette, info.WeaponDelay));

View File

@@ -1,32 +0,0 @@
#region Copyright & License Information
/*
* Copyright 2007-2016 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, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using OpenRA.Mods.Common.Widgets;
using OpenRA.Mods.Common.Widgets.Logic;
using OpenRA.Widgets;
namespace OpenRA.Mods.Cnc.Widgets.Logic
{
public class CncMainMenuLogic : MainMenuLogic
{
[ObjectCreator.UseCtor]
public CncMainMenuLogic(Widget widget, World world, ModData modData)
: base(widget, world, modData)
{
var shellmapDecorations = widget.Get("SHELLMAP_DECORATIONS");
shellmapDecorations.IsVisible = () => menuType != MenuType.None && Game.Settings.Game.ShowShellmap;
shellmapDecorations.Get<ImageWidget>("RECBLOCK").IsVisible = () => world.WorldTick / 25 % 2 == 0;
var shellmapDisabledDecorations = widget.Get("SHELLMAP_DISABLED_DECORATIONS");
shellmapDisabledDecorations.IsVisible = () => !Game.Settings.Game.ShowShellmap;
}
}
}

View File

@@ -59,7 +59,7 @@ namespace OpenRA.Mods.Common.Activities
if (!playedSound && helicopter.Info.TakeoffSound != null && self.IsAtGroundLevel())
{
Game.Sound.Play(helicopter.Info.TakeoffSound);
Game.Sound.Play(SoundType.World, helicopter.Info.TakeoffSound);
playedSound = true;
}

View File

@@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Activities
if (!playedSound && helicopter.Info.LandingSound != null && !self.IsAtGroundLevel())
{
Game.Sound.Play(helicopter.Info.LandingSound);
Game.Sound.Play(SoundType.World, helicopter.Info.LandingSound);
playedSound = true;
}

View File

@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Common.Activities
var sound = pool.Info.RearmSound;
if (sound != null)
Game.Sound.PlayToPlayer(self.Owner, sound, self.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, self.Owner, sound, self.CenterPosition);
ammoPoolsReloadTimes[pool] = pool.Info.ReloadDelay;
}

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Activities
self.Dispose();
foreach (var s in Sounds)
Game.Sound.PlayToPlayer(self.Owner, s, self.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, self.Owner, s, self.CenterPosition);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", Notification, self.Owner.Faction.InternalName);

View File

@@ -60,7 +60,7 @@ namespace OpenRA.Mods.Common.Effects
pos = launchPos;
if (weapon.Report != null && weapon.Report.Any())
Game.Sound.Play(weapon.Report.Random(firedBy.World.SharedRandom), pos);
Game.Sound.Play(SoundType.World, weapon.Report.Random(firedBy.World.SharedRandom), pos);
if (skipAscent)
ticks = turn;

View File

@@ -52,7 +52,8 @@ namespace OpenRA.Mods.Common.Scripting
[Desc("Play a sound file")]
public void PlaySound(string file)
{
Game.Sound.Play(file);
// TODO: Investigate how scripts use this function, and think about exposing the UI vs World distinction if needed
Game.Sound.Play(SoundType.World, file);
}
[Desc("Play track defined in music.yaml or map.yaml, or keep track empty for playing a random song.")]

View File

@@ -245,7 +245,7 @@ namespace OpenRA.Mods.Common.Traits
self.World.Add(projectile);
if (args.Weapon.Report != null && args.Weapon.Report.Any())
Game.Sound.Play(args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
foreach (var na in self.TraitsImplementing<INotifyAttack>())
na.Attacking(self, target, this, barrel);

View File

@@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Traits
notify.Charging(self, target);
if (!string.IsNullOrEmpty(attack.info.ChargeAudio))
Game.Sound.Play(attack.info.ChargeAudio, self.CenterPosition);
Game.Sound.Play(SoundType.World, attack.info.ChargeAudio, self.CenterPosition);
return ActivityUtils.SequenceActivities(new Wait(attack.info.InitialChargeDelay), new ChargeFire(attack, target), this);
}

View File

@@ -236,7 +236,7 @@ namespace OpenRA.Mods.Common.Traits
RemoveSmudges();
foreach (var s in Info.UndeploySounds)
Game.Sound.PlayToPlayer(self.Owner, s, self.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, self.Owner, s, self.CenterPosition);
}
void INotifyTransform.OnTransform(Actor self) { }

View File

@@ -62,7 +62,7 @@ namespace OpenRA.Mods.Common.Traits
// Gate was fully open
if (Position == OpenPosition)
{
Game.Sound.Play(info.ClosingSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.ClosingSound, self.CenterPosition);
self.World.ActorMap.AddInfluence(self, this);
}
@@ -72,7 +72,7 @@ namespace OpenRA.Mods.Common.Traits
{
// Gate was fully closed
if (Position == 0)
Game.Sound.Play(info.OpeningSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.OpeningSound, self.CenterPosition);
Position++;

View File

@@ -148,7 +148,7 @@ namespace OpenRA.Mods.Common.Traits
cloakedToken = upgradeManager.GrantCondition(self, Info.CloakedCondition);
if (!self.TraitsImplementing<Cloak>().Any(a => a != this && a.Cloaked))
Game.Sound.Play(Info.CloakSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, Info.CloakSound, self.CenterPosition);
}
else if (!isCloaked && wasCloaked)
{
@@ -156,7 +156,7 @@ namespace OpenRA.Mods.Common.Traits
cloakedToken = upgradeManager.RevokeCondition(self, cloakedToken);
if (!self.TraitsImplementing<Cloak>().Any(a => a != this && a.Cloaked))
Game.Sound.Play(Info.UncloakSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, Info.UncloakSound, self.CenterPosition);
}
wasCloaked = isCloaked;

View File

@@ -73,7 +73,7 @@ namespace OpenRA.Mods.Common.Traits
public virtual void Activate(Actor collector)
{
Game.Sound.PlayToPlayer(collector.Owner, info.Notification);
Game.Sound.PlayToPlayer(SoundType.World, collector.Owner, info.Notification);
if (info.Effect != null)
collector.World.AddFrameEndTask(w => w.Add(new CrateEffect(collector, info.Effect, info.Palette)));

View File

@@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits
if (!CrushableInner(crushClasses, crusher.Owner))
return;
Game.Sound.Play(info.CrushSound, crusher.CenterPosition);
Game.Sound.Play(SoundType.World, info.CrushSound, crusher.CenterPosition);
self.Kill(crusher);
}

View File

@@ -82,7 +82,7 @@ namespace OpenRA.Mods.Common.Traits
w.Add(pilot);
pilot.QueueActivity(new Parachute(pilot, cp));
});
Game.Sound.Play(info.ChuteSound, cp);
Game.Sound.Play(SoundType.World, info.ChuteSound, cp);
}
else
{

View File

@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits
return;
if (weapon.Report != null && weapon.Report.Any())
Game.Sound.Play(weapon.Report.Random(e.Attacker.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, weapon.Report.Random(e.Attacker.World.SharedRandom), self.CenterPosition);
if (info.Type == ExplosionType.Footprint && buildingInfo != null)
{

View File

@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits
w.Add(a);
a.QueueActivity(new Parachute(a, self.CenterPosition));
});
Game.Sound.Play(info.ChuteSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.ChuteSound, self.CenterPosition);
}
static bool IsSuitableCell(Actor actorToDrop, CPos p)

View File

@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits
var onWater = info.WaterTerrainTypes.Contains(self.World.Map.GetTerrainInfo(cell).Type);
var sound = onWater ? info.WaterImpactSound : info.GroundImpactSound;
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
var sequence = onWater ? info.WaterCorpseSequence : info.GroundCorpseSequence;
var palette = onWater ? info.WaterCorpsePalette : info.GroundCorpsePalette;

View File

@@ -86,7 +86,7 @@ namespace OpenRA.Mods.Common.Traits
if (playSounds)
foreach (var s in buildingInfo.BuildSounds)
Game.Sound.PlayToPlayer(order.Player, s, building.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, order.Player, s, building.CenterPosition);
playSounds = false;
}
@@ -110,7 +110,7 @@ namespace OpenRA.Mods.Common.Traits
pluggable.EnablePlug(host, plugInfo.Type);
foreach (var s in buildingInfo.BuildSounds)
Game.Sound.PlayToPlayer(order.Player, s, host.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, order.Player, s, host.CenterPosition);
}
else
{
@@ -126,7 +126,7 @@ namespace OpenRA.Mods.Common.Traits
});
foreach (var s in buildingInfo.BuildSounds)
Game.Sound.PlayToPlayer(order.Player, s, building.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.World, order.Player, s, building.CenterPosition);
}
if (producer.Actor != null)

View File

@@ -86,7 +86,7 @@ namespace OpenRA.Mods.Common.Traits
cargo.Delivered(self);
self.World.AddFrameEndTask(ww => DoProduction(self, producee, exit, factionVariant));
Game.Sound.Play(info.ChuteSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.ChuteSound, self.CenterPosition);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.ReadyAudio, self.Owner.Faction.InternalName);
}));

View File

@@ -58,7 +58,7 @@ namespace OpenRA.Mods.Common.Traits
self.CancelActivity();
foreach (var s in info.SellSounds)
Game.Sound.PlayToPlayer(self.Owner, s, self.CenterPosition);
Game.Sound.PlayToPlayer(SoundType.UI, self.Owner, s, self.CenterPosition);
foreach (var ns in self.TraitsImplementing<INotifySold>())
ns.Selling(self);

View File

@@ -50,9 +50,9 @@ namespace OpenRA.Mods.Common.Traits.Sound
if (wasDisabled && Info.Interval <= 0)
{
if (self.OccupiesSpace != null)
currentSound = Game.Sound.PlayLooped(Info.SoundFile, self.CenterPosition);
currentSound = Game.Sound.PlayLooped(SoundType.World, Info.SoundFile, self.CenterPosition);
else
currentSound = Game.Sound.PlayLooped(Info.SoundFile);
currentSound = Game.Sound.PlayLooped(SoundType.World, Info.SoundFile);
}
wasDisabled = false;
@@ -66,9 +66,9 @@ namespace OpenRA.Mods.Common.Traits.Sound
interval = Info.Interval;
if (self.OccupiesSpace != null)
Game.Sound.Play(Info.SoundFile, self.CenterPosition);
Game.Sound.Play(SoundType.World, Info.SoundFile, self.CenterPosition);
else
Game.Sound.Play(Info.SoundFile);
Game.Sound.Play(SoundType.World, Info.SoundFile);
}
}
}

View File

@@ -43,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits.Sound
void PlaySound(Actor self)
{
if (info.Sounds.Any())
Game.Sound.Play(info.Sounds.Random(self.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, info.Sounds.Random(self.World.SharedRandom), self.CenterPosition);
}
void INotifyAttack.Attacking(Actor self, Target target, Armament a, Barrel barrel)

View File

@@ -40,12 +40,12 @@ namespace OpenRA.Mods.Common.Traits.Sound
if (e.DamageState == DamageState.Dead)
{
var sound = info.DestroyedSounds.RandomOrDefault(rand);
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
}
else if (e.DamageState >= DamageState.Heavy && e.PreviousDamageState < DamageState.Heavy)
{
var sound = info.DamagedSounds.RandomOrDefault(rand);
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
}
}
}

View File

@@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits
public override void SelectTarget(Actor self, string order, SupportPowerManager manager)
{
Game.Sound.PlayToPlayer(manager.Self.Owner, Info.SelectTargetSound);
Game.Sound.PlayToPlayer(SoundType.World, manager.Self.Owner, Info.SelectTargetSound);
self.World.OrderGenerator = new SelectUpgradeTarget(Self.World, order, manager, this);
}
@@ -65,7 +65,7 @@ namespace OpenRA.Mods.Common.Traits
if (wsb != null && wsb.DefaultAnimation.HasSequence(info.Sequence))
wsb.PlayCustomAnimation(self, info.Sequence, () => wsb.CancelCustomAnimation(self));
Game.Sound.Play(info.OnFireSound, self.World.Map.CenterOfCell(order.TargetLocation));
Game.Sound.Play(SoundType.World, info.OnFireSound, self.World.Map.CenterOfCell(order.TargetLocation));
foreach (var a in UnitsInRange(order.TargetLocation))
{

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Mods.Common.Traits
{
var location = self.World.Map.CenterOfCell(order.TargetLocation);
Game.Sound.Play(info.DeploySound, location);
Game.Sound.Play(SoundType.World, info.DeploySound, location);
if (!string.IsNullOrEmpty(info.EffectSequence) && !string.IsNullOrEmpty(info.EffectPalette))
w.Add(new SpriteEffect(location, w, info.EffectImage, info.EffectSequence, info.EffectPalette));

View File

@@ -89,21 +89,21 @@ namespace OpenRA.Mods.Common.Traits
public virtual void Charging(Actor self, string key)
{
Game.Sound.PlayToPlayer(self.Owner, Info.BeginChargeSound);
Game.Sound.PlayToPlayer(SoundType.UI, self.Owner, Info.BeginChargeSound);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech",
Info.BeginChargeSpeechNotification, self.Owner.Faction.InternalName);
}
public virtual void Charged(Actor self, string key)
{
Game.Sound.PlayToPlayer(self.Owner, Info.EndChargeSound);
Game.Sound.PlayToPlayer(SoundType.UI, self.Owner, Info.EndChargeSound);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech",
Info.EndChargeSpeechNotification, self.Owner.Faction.InternalName);
}
public virtual void SelectTarget(Actor self, string order, SupportPowerManager manager)
{
Game.Sound.PlayToPlayer(manager.Self.Owner, Info.SelectTargetSound);
Game.Sound.PlayToPlayer(SoundType.UI, manager.Self.Owner, Info.SelectTargetSound);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech",
Info.SelectTargetSpeechNotification, self.Owner.Faction.InternalName);
self.World.OrderGenerator = new SelectGenericPowerTarget(order, manager, info.Cursor, MouseButton.Left);
@@ -125,7 +125,7 @@ namespace OpenRA.Mods.Common.Traits
{
var renderPlayer = Self.World.RenderPlayer;
var isAllied = Self.Owner.IsAlliedWith(renderPlayer);
Game.Sound.Play(isAllied ? Info.LaunchSound : Info.IncomingSound);
Game.Sound.Play(SoundType.UI, isAllied ? Info.LaunchSound : Info.IncomingSound);
// IsAlliedWith returns true if renderPlayer is null, so we are safe here.
var toPlayer = isAllied ? renderPlayer ?? Self.Owner : renderPlayer;

View File

@@ -85,7 +85,7 @@ namespace OpenRA.Mods.Common.Traits
self.World.Add(projectile);
if (args.Weapon.Report != null && args.Weapon.Report.Any())
Game.Sound.Play(args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
}
});
}

View File

@@ -103,7 +103,7 @@ namespace OpenRA.Mods.Common.Traits
// Only play the "Cannot deploy here" audio
// for non-queued orders
foreach (var s in info.NoTransformSounds)
Game.Sound.PlayToPlayer(self.Owner, s);
Game.Sound.PlayToPlayer(SoundType.World, self.Owner, s);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech", info.NoTransformNotification, self.Owner.Faction.InternalName);

View File

@@ -64,7 +64,7 @@ namespace OpenRA.Mods.Common.Traits
conditionToken = manager.GrantCondition(self, info.Condition);
var sound = info.EnabledSounds.RandomOrDefault(Game.CosmeticRandom);
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
}
void INotifyDamageStateChanged.DamageStateChanged(Actor self, AttackInfo e)
@@ -80,7 +80,7 @@ namespace OpenRA.Mods.Common.Traits
conditionToken = manager.RevokeCondition(self, conditionToken);
var sound = info.DisabledSounds.RandomOrDefault(Game.CosmeticRandom);
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
}
}
}

View File

@@ -204,7 +204,7 @@ namespace OpenRA.Mods.Common.Traits
return;
if (!string.IsNullOrEmpty(info.DeploySound))
Game.Sound.Play(info.DeploySound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.DeploySound, self.CenterPosition);
// Revoke upgrades that are used while undeployed.
if (!init)
@@ -227,7 +227,7 @@ namespace OpenRA.Mods.Common.Traits
return;
if (!string.IsNullOrEmpty(info.UndeploySound))
Game.Sound.Play(info.UndeploySound, self.CenterPosition);
Game.Sound.Play(SoundType.World, info.UndeploySound, self.CenterPosition);
if (!init)
OnUndeployStarted();

View File

@@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Traits
if (cachedDisabled != disabled)
{
Game.Sound.Play(disabled ? info.DisableSound : info.EnableSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, disabled ? info.DisableSound : info.EnableSound, self.CenterPosition);
desiredRange = disabled ? WDist.Zero : info.Range;
desiredVRange = disabled ? WDist.Zero : info.MaximumVerticalOffset;
cachedDisabled = disabled;

View File

@@ -47,7 +47,7 @@ namespace OpenRA.Mods.Common.Traits
var type = Info.VoiceSet.ToLowerInvariant();
var volume = Info.Volume;
return Game.Sound.PlayPredefined(self.World.Map.Rules, null, self, type, phrase, variant, true, WPos.Zero, volume, true);
return Game.Sound.PlayPredefined(SoundType.World, self.World.Map.Rules, null, self, type, phrase, variant, true, WPos.Zero, volume, true);
}
public bool PlayVoiceLocal(Actor self, string phrase, string variant, float volume)
@@ -59,7 +59,7 @@ namespace OpenRA.Mods.Common.Traits
return false;
var type = Info.VoiceSet.ToLowerInvariant();
return Game.Sound.PlayPredefined(self.World.Map.Rules, null, self, type, phrase, variant, false, self.CenterPosition, volume, true);
return Game.Sound.PlayPredefined(SoundType.World, self.World.Map.Rules, null, self, type, phrase, variant, false, self.CenterPosition, volume, true);
}
public bool HasVoice(Actor self, string voice)

View File

@@ -32,6 +32,9 @@ namespace OpenRA.Mods.Common.Traits
"It cannot be paused, but can be overridden by selecting a new track.")]
public readonly string BackgroundMusic = null;
[Desc("Disable all world sounds (combat etc).")]
public readonly bool DisableWorldSounds = false;
public object Create(ActorInitializer init) { return new MusicPlaylist(init.World, this); }
}
@@ -55,6 +58,9 @@ namespace OpenRA.Mods.Common.Traits
this.info = info;
this.world = world;
if (info.DisableWorldSounds)
Game.Sound.DisableWorldSounds = true;
IsMusicInstalled = world.Map.Rules.InstalledMusic.Any();
if (!IsMusicInstalled)
return;
@@ -220,6 +226,8 @@ namespace OpenRA.Mods.Common.Traits
{
if (currentSong != null)
Game.Sound.StopMusic();
Game.Sound.DisableWorldSounds = false;
}
}
}

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Warheads
var impactSound = ImpactSounds.RandomOrDefault(Game.CosmeticRandom);
if (impactSound != null)
Game.Sound.Play(impactSound, pos);
Game.Sound.Play(SoundType.World, impactSound, pos);
}
public bool IsValidImpact(WPos pos, Actor firedBy)

View File

@@ -87,7 +87,7 @@ namespace OpenRA.Mods.Common.Widgets
recentLines.Add(new ChatLine(from, text, Game.LocalTick + RemoveTime, c));
if (Notification != null)
Game.Sound.Play(Notification);
Game.Sound.Play(SoundType.UI, Notification);
while (recentLines.Count > LogLength)
recentLines.RemoveAt(0);

View File

@@ -105,12 +105,19 @@ namespace OpenRA.Mods.Common.Widgets.Logic
if (button.Pause && world.LobbyInfo.IsSinglePlayer)
world.SetPauseState(true);
var cachedDisableWorldSounds = Game.Sound.DisableWorldSounds;
if (button.DisableWorldSounds)
Game.Sound.DisableWorldSounds = true;
widgetArgs = widgetArgs ?? new WidgetArgs();
widgetArgs.Add("onExit", () =>
{
if (button.HideIngameUI)
worldRoot.IsVisible = () => true;
if (button.DisableWorldSounds)
Game.Sound.DisableWorldSounds = cachedDisableWorldSounds;
if (button.Pause && world.LobbyInfo.IsSinglePlayer)
world.SetPauseState(cachedPause);

View File

@@ -154,7 +154,6 @@ namespace OpenRA.Mods.Common.Widgets.Logic
BindCheckboxPref(panel, "PIXELDOUBLE_CHECKBOX", ds, "PixelDouble");
BindCheckboxPref(panel, "CURSORDOUBLE_CHECKBOX", ds, "CursorDouble");
BindCheckboxPref(panel, "FRAME_LIMIT_CHECKBOX", ds, "CapFramerate");
BindCheckboxPref(panel, "SHOW_SHELLMAP", gs, "ShowShellmap");
BindCheckboxPref(panel, "DISPLAY_TARGET_LINES_CHECKBOX", gs, "DrawTargetLine");
BindCheckboxPref(panel, "PLAYER_STANCE_COLORS_CHECKBOX", gs, "UsePlayerStanceColors");
@@ -278,15 +277,11 @@ namespace OpenRA.Mods.Common.Widgets.Logic
Action ResetDisplayPanel(Widget panel)
{
var ds = Game.Settings.Graphics;
var gs = Game.Settings.Game;
var ps = Game.Settings.Player;
var dds = new GraphicSettings();
var dgs = new GameSettings();
var dps = new PlayerSettings();
return () =>
{
gs.ShowShellmap = dgs.ShowShellmap;
ds.CapFramerate = dds.CapFramerate;
ds.MaxFramerate = dds.MaxFramerate;
ds.Language = dds.Language;

View File

@@ -16,6 +16,7 @@ namespace OpenRA.Mods.Common.Widgets
public readonly string MenuContainer = "INGAME_MENU";
public readonly bool Pause = true;
public readonly bool HideIngameUI = true;
public readonly bool DisableWorldSounds = false;
[ObjectCreator.UseCtor]
public MenuButtonWidget(ModData modData)

View File

@@ -218,14 +218,14 @@ namespace OpenRA.Mods.Common.Widgets
{
if (PickUpCompletedBuildingIcon(icon, item))
{
Game.Sound.Play(TabClick);
Game.Sound.Play(SoundType.UI, TabClick);
return true;
}
if (item != null && item.Paused)
{
// Resume a paused item
Game.Sound.Play(TabClick);
Game.Sound.Play(SoundType.UI, TabClick);
World.IssueOrder(Order.PauseProduction(CurrentQueue.Actor, icon.Name, false));
return true;
}
@@ -233,7 +233,7 @@ namespace OpenRA.Mods.Common.Widgets
if (CurrentQueue.BuildableItems().Any(a => a.Name == icon.Name))
{
// Queue a new item
Game.Sound.Play(TabClick);
Game.Sound.Play(SoundType.UI, TabClick);
Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.QueuedAudio, World.LocalPlayer.Faction.InternalName);
World.IssueOrder(Order.StartProduction(CurrentQueue.Actor, icon.Name, handleCount));
return true;
@@ -247,7 +247,7 @@ namespace OpenRA.Mods.Common.Widgets
if (item == null)
return false;
Game.Sound.Play(TabClick);
Game.Sound.Play(SoundType.UI, TabClick);
if (item.Paused || item.Done || item.TotalCost == item.RemainingCost)
{
@@ -271,7 +271,7 @@ namespace OpenRA.Mods.Common.Widgets
return false;
// Directly cancel, skipping "on-hold"
Game.Sound.Play(TabClick);
Game.Sound.Play(SoundType.UI, TabClick);
Game.Sound.PlayNotification(World.Map.Rules, World.LocalPlayer, "Speech", CurrentQueue.Info.CancelledAudio, World.LocalPlayer.Faction.InternalName);
World.IssueOrder(Order.CancelProduction(CurrentQueue.Actor, icon.Name, handleCount));
@@ -289,7 +289,7 @@ namespace OpenRA.Mods.Common.Widgets
: false;
if (!handled)
Game.Sound.Play(DisabledTabClick);
Game.Sound.Play(SoundType.UI, DisabledTabClick);
return true;
}

View File

@@ -333,7 +333,7 @@ namespace OpenRA.Mods.Common.Widgets
// Enable/Disable the radar
var enabled = IsEnabled();
if (enabled != cachedEnabled)
Game.Sound.Play(enabled ? RadarOnlineSound : RadarOfflineSound);
Game.Sound.Play(SoundType.UI, enabled ? RadarOnlineSound : RadarOfflineSound);
cachedEnabled = enabled;
if (enabled)

View File

@@ -115,7 +115,7 @@ namespace OpenRA.Mods.Common.Widgets
{
if (!clicked.Power.Active)
{
Game.Sound.PlayToPlayer(spm.Self.Owner, clicked.Power.Info.InsufficientPowerSound);
Game.Sound.PlayToPlayer(SoundType.UI, spm.Self.Owner, clicked.Power.Info.InsufficientPowerSound);
Game.Sound.PlayNotification(spm.Self.World.Map.Rules, spm.Self.Owner, "Speech",
clicked.Power.Info.InsufficientPowerSpeechNotification, spm.Self.Owner.Faction.InternalName);
}

View File

@@ -76,7 +76,7 @@ namespace OpenRA.Mods.D2k.Activities
var attackPosition = self.CenterPosition;
var affectedPlayers = targets.Select(x => x.Owner).Distinct().ToList();
Game.Sound.Play(swallow.Info.WormAttackSound, self.CenterPosition);
Game.Sound.Play(SoundType.World, swallow.Info.WormAttackSound, self.CenterPosition);
Game.RunAfterDelay(1000, () =>
{

View File

@@ -152,7 +152,7 @@ namespace OpenRA.Mods.D2k.Traits
self.World.Add(projectile);
if (args.Weapon.Report != null && args.Weapon.Report.Any())
Game.Sound.Play(args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, args.Weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
}
});
}

View File

@@ -50,7 +50,7 @@ namespace OpenRA.Mods.RA.Activities
self.Trait<WithInfantryBody>().Attacking(self, Target.FromActor(target), a);
if (weapon.Report != null && weapon.Report.Any())
Game.Sound.Play(weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
Game.Sound.Play(SoundType.World, weapon.Report.Random(self.World.SharedRandom), self.CenterPosition);
}
public override Activity Tick(Actor self)

View File

@@ -60,8 +60,8 @@ namespace OpenRA.Mods.RA.Activities
destination = bestCell.Value;
Game.Sound.Play(sound, self.CenterPosition);
Game.Sound.Play(sound, self.World.Map.CenterOfCell(destination));
Game.Sound.Play(SoundType.World, sound, self.CenterPosition);
Game.Sound.Play(SoundType.World, sound, self.World.Map.CenterOfCell(destination));
self.Trait<IPositionable>().SetPosition(self, destination);
self.Generation++;

View File

@@ -159,9 +159,9 @@ namespace OpenRA.Mods.RA.Traits
wfsb.PlayCustomAnimationRepeating(self, info.ThumpSequence);
deployed = true;
self.QueueActivity(new Wait(info.ChargeDelay, false));
self.QueueActivity(new CallFunc(() => Game.Sound.Play(info.ChargeSound, self.CenterPosition)));
self.QueueActivity(new CallFunc(() => Game.Sound.Play(SoundType.World, info.ChargeSound, self.CenterPosition)));
self.QueueActivity(new Wait(info.DetonationDelay, false));
self.QueueActivity(new CallFunc(() => Game.Sound.Play(info.DetonationSound, self.CenterPosition)));
self.QueueActivity(new CallFunc(() => Game.Sound.Play(SoundType.World, info.DetonationSound, self.CenterPosition)));
self.QueueActivity(new CallFunc(Detonate));
}

View File

@@ -55,7 +55,7 @@ namespace OpenRA.Mods.RA.Traits
public override void SelectTarget(Actor self, string order, SupportPowerManager manager)
{
Game.Sound.PlayToPlayer(manager.Self.Owner, Info.SelectTargetSound);
Game.Sound.PlayToPlayer(SoundType.UI, manager.Self.Owner, Info.SelectTargetSound);
self.World.OrderGenerator = new SelectChronoshiftTarget(Self.World, order, manager, this);
}

View File

@@ -74,7 +74,7 @@ namespace OpenRA.Mods.RA.Traits
self.World.AddFrameEndTask(w =>
{
Game.Sound.PlayToPlayer(self.Owner, Info.LaunchSound);
Game.Sound.PlayToPlayer(SoundType.World, self.Owner, Info.LaunchSound);
Game.Sound.PlayNotification(self.World.Map.Rules, self.Owner, "Speech",
Info.LaunchSpeechNotification, self.Owner.Faction.InternalName);

View File

@@ -37,7 +37,7 @@ namespace OpenRA.Mods.TS.Traits
public override void SelectTarget(Actor self, string order, SupportPowerManager manager)
{
Game.Sound.PlayToPlayer(manager.Self.Owner, Info.SelectTargetSound);
Game.Sound.PlayToPlayer(SoundType.UI, manager.Self.Owner, Info.SelectTargetSound);
self.World.OrderGenerator = new SelectAttackPowerTarget(self, order, manager, info.Cursor, MouseButton.Left, attack);
}

View File

@@ -91,6 +91,7 @@ Container@OBSERVER_WIDGETS:
Height: 25
TooltipText: Menu
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
Children:
Image:
X: 7
@@ -275,6 +276,7 @@ Container@PLAYER_WIDGETS:
Font: Bold
TooltipText: Menu
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
Children:
Image@ICON:
X: 7

View File

@@ -1,35 +1,13 @@
Container@MENU_BACKGROUND:
Width: WINDOW_RIGHT
Height: WINDOW_BOTTOM
Logic: CncMainMenuLogic
Logic: MainMenuLogic
Children:
Container@MUSICBUTTONS:
Logic: MusicControllerLogic
Children:
LogicKeyListener@MUSICCONTROLLER_KEYHANDLER:
Container@SHELLMAP_DECORATIONS:
Children:
Image@RETICLE:
X: (WINDOW_RIGHT-WIDTH)/2
Y: (WINDOW_BOTTOM-HEIGHT)/2
Width: 512
Height: 512
ImageCollection: shellmap
ImageName: reticle
Label@REC:
X: (WINDOW_RIGHT-512)/2+10
Y: (WINDOW_BOTTOM+512)/2-28
Height: 18
Font: Bold
Text: REC
Image@RECBLOCK:
X: (WINDOW_RIGHT-512)/2+40
Y: (WINDOW_BOTTOM+512)/2-25
Width: 16
Height: 16
ImageCollection: shellmapbits
ImageName: record
Container@SHELLMAP_DISABLED_DECORATIONS:
Children:
Image@NOD:
X: WINDOW_RIGHT/2-384

View File

@@ -152,28 +152,21 @@ Container@SETTINGS_PANEL:
Height: 20
Font: Regular
Text: Player Stance Colors
Checkbox@SHOW_SHELLMAP:
X: 15
Y: 185
Width: 200
Height: 20
Font: Regular
Text: Show Shellmap
Label@PLAYER:
Text: Player:
X: 15
Y: 225
Y: 195
TextField@PLAYERNAME:
Text: Name
X: 65
Y: 215
Y: 185
Width: 145
Height: 25
MaxLength: 16
ColorPreviewManager@COLOR_MANAGER:
DropDownButton@PLAYERCOLOR:
X: 215
Y: 215
Y: 185
Width: 70
Height: 25
IgnoreChildMouseOver: true

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 B

View File

@@ -0,0 +1,35 @@
MapFormat: 11
RequiresMod: cnc
Title: Blank Shellmap
Author: Paul Chote
Tileset: DESERT
MapSize: 5,5
Bounds: 1,1,1,1
Visibility: Shellmap
Categories: Shellmap
Players:
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: Random
Actors:
Rules:
World:
-SpawnMPUnits:
-MPStartLocations:
-CrateSpawner:
MusicPlaylist:
BackgroundMusic: map1
DisableWorldSounds: true

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1018 B

View File

@@ -1,961 +0,0 @@
MapFormat: 11
RequiresMod: cnc
Title: shellmap
Author: Chris Forbes
Tileset: WINTER
MapSize: 96,48
Bounds: 8,1,80,45
Visibility: Shellmap
Categories: Shellmap
Players:
PlayerReference@Nod:
Name: Nod
Faction: nod
Color: FE1100
Allies: Nod
Enemies: GDI, Creeps
PlayerReference@GDI:
Name: GDI
Faction: gdi
Color: F5D378
Allies: GDI
Enemies: Nod, Creeps
PlayerReference@Neutral:
Name: Neutral
OwnsWorld: True
NonCombatant: True
Faction: gdi
PlayerReference@Creeps:
Name: Creeps
NonCombatant: True
Faction: Random
Enemies: Nod, GDI
Actors:
Actor4: fix
Location: 59,44
Owner: GDI
Actor5: tran
Location: 60,45
Owner: GDI
Actor6: cycl
Location: 64,44
Owner: GDI
Actor7: cycl
Location: 64,43
Owner: GDI
Actor8: cycl
Location: 63,43
Owner: GDI
Actor9: cycl
Location: 62,43
Owner: GDI
Actor10: cycl
Location: 61,43
Owner: GDI
Actor11: cycl
Location: 60,43
Owner: GDI
Actor12: cycl
Location: 59,43
Owner: GDI
Actor13: cycl
Location: 58,43
Owner: GDI
Actor14: cycl
Location: 57,43
Owner: GDI
Actor15: cycl
Location: 56,43
Owner: GDI
Actor16: cycl
Location: 56,44
Owner: GDI
Actor17: atwr
Location: 55,42
Owner: GDI
Actor18: nuke
Location: 70,45
Owner: GDI
Actor19: nuke
Location: 72,45
Owner: GDI
Actor20: hq
Location: 54,42
Owner: GDI
Actor21: t07
Location: 53,42
Owner: GDI
Actor22: tc01
Location: 53,43
Owner: GDI
Actor23: e1
Location: 57,44
Owner: GDI
Actor24: e2
Location: 65,44
Owner: GDI
Actor25: e2
Location: 64,45
Owner: GDI
Actor26: atwr
Location: 66,42
Owner: GDI
Actor27: tc02
Location: 65,42
Owner: GDI
Actor28: fact
Location: 11,3
Owner: Nod
Actor29: nuke
Location: 14,1
Owner: Nod
Actor30: nuke
Location: 16,1
Owner: Nod
Actor31: silo
Location: 19,1
Owner: Nod
Actor32: silo
Location: 19,2
Owner: Nod
Actor33: proc
Location: 15,3
Owner: Nod
Actor34: tc04
Location: 11,0
Owner: Neutral
Actor37: tc05
Location: 8,0
Owner: Neutral
Actor38: tc02
Location: 8,2
Owner: Neutral
Actor39: tc04
Location: 8,3
Owner: Neutral
Actor40: t06
Location: 8,6
Owner: Neutral
Actor43: afld
Location: 9,7
Owner: Nod
Actor42: hq
Location: 10,4
Owner: Nod
Actor45: sam
Location: 25,6
Owner: Nod
Actor46: sam
Location: 29,6
Owner: Nod
Actor47: sam
Location: 53,2
Owner: Nod
Actor48: sam
Location: 79,5
Owner: Nod
Actor49: hand
Location: 15,8
Owner: Nod
Actor50: cycl
Location: 13,11
Owner: Nod
Actor51: cycl
Location: 13,10
Owner: Nod
Actor52: cycl
Location: 12,10
Owner: Nod
Actor53: cycl
Location: 12,11
Owner: Nod
Actor54: cycl
Location: 11,11
Owner: Nod
Actor55: cycl
Location: 10,11
Owner: Nod
Actor56: cycl
Location: 9,11
Owner: Nod
Actor57: cycl
Location: 8,11
Owner: Nod
Actor58: cycl
Location: 8,10
Owner: Nod
Actor59: cycl
Location: 8,9
Owner: Nod
Actor60: cycl
Location: 8,8
Owner: Nod
Actor61: cycl
Location: 8,7
Owner: Nod
Actor62: brik
Location: 15,14
Owner: Nod
Actor63: brik
Location: 14,14
Owner: Nod
Actor64: brik
Location: 14,13
Owner: Nod
Actor65: brik
Location: 15,13
Owner: Nod
Actor66: brik
Location: 13,14
Owner: Nod
Actor67: brik
Location: 12,14
Owner: Nod
Actor68: brik
Location: 12,15
Owner: Nod
Actor69: brik
Location: 11,15
Owner: Nod
Actor70: brik
Location: 10,15
Owner: Nod
Actor71: brik
Location: 9,15
Owner: Nod
Actor72: brik
Location: 8,15
Owner: Nod
Actor73: brik
Location: 19,9
Owner: Nod
Actor74: brik
Location: 19,10
Owner: Nod
Actor75: brik
Location: 18,10
Owner: Nod
Actor76: brik
Location: 18,9
Owner: Nod
Actor77: brik
Location: 19,8
Owner: Nod
Actor78: brik
Location: 19,7
Owner: Nod
Actor79: brik
Location: 20,7
Owner: Nod
Actor80: brik
Location: 20,6
Owner: Nod
Actor81: brik
Location: 20,5
Owner: Nod
Actor82: brik
Location: 21,5
Owner: Nod
Actor83: brik
Location: 22,5
Owner: Nod
Actor84: brik
Location: 23,5
Owner: Nod
Actor85: brik
Location: 24,5
Owner: Nod
Actor91: brik
Location: 27,5
Owner: Nod
Actor90: brik
Location: 28,5
Owner: Nod
Actor89: brik
Location: 29,5
Owner: Nod
Actor88: brik
Location: 30,5
Owner: Nod
Actor87: brik
Location: 31,5
Owner: Nod
Actor35: gun
Location: 20,11
Owner: Nod
TurretFacing: 160
Actor36: gun
Location: 16,14
Owner: Nod
TurretFacing: 184
Actor41: brik
Location: 32,5
Owner: Nod
Actor44: brik
Location: 32,4
Owner: Nod
Actor86: brik
Location: 31,4
Owner: Nod
Actor96: gun
Location: 33,5
Owner: Nod
TurretFacing: 144
Actor97: gun
Location: 39,3
Owner: Nod
TurretFacing: 128
Actor98: nuke
Location: 22,1
Owner: Nod
Actor99: nuke
Location: 24,1
Owner: Nod
Actor100: tc04
Location: 26,0
Owner: Neutral
Actor101: tc05
Location: 41,0
Owner: Neutral
Actor102: t17
Location: 40,0
Owner: Neutral
Actor103: tc01
Location: 51,1
Owner: Neutral
Actor104: tc03
Location: 55,1
Owner: Neutral
Actor105: tc05
Location: 60,1
Owner: Neutral
Actor106: t08
Location: 61,4
Owner: Neutral
Actor107: tc05
Location: 67,3
Owner: Neutral
Actor109: tc04
Location: 80,0
Owner: Neutral
Actor110: tc04
Location: 83,1
Owner: Neutral
Actor111: tc05
Location: 85,3
Owner: Neutral
Actor112: tc02
Location: 86,6
Owner: Neutral
Actor92: brik
Location: 26,5
Owner: Nod
Actor93: brik
Location: 25,5
Owner: Nod
Actor94: brik
Location: 39,1
Owner: Nod
Actor95: brik
Location: 39,2
Owner: Nod
Actor113: brik
Location: 38,2
Owner: Nod
Actor114: brik
Location: 38,1
Owner: Nod
Actor115: tc02
Location: 36,0
Owner: Neutral
Actor116: proc
Location: 57,4
Owner: Nod
Actor117: silo
Location: 54,5
Owner: Nod
Actor118: silo
Location: 54,6
Owner: Nod
Actor119: e1
Location: 12,5
Owner: Nod
Actor120: e1
Location: 11,6
Owner: Nod
Actor121: e6
Location: 14,4
Owner: Nod
Actor122: e3
Location: 18,4
Owner: Nod
Actor123: e3
Location: 38,3
Owner: Nod
Actor124: e3
Location: 59,8
Owner: Nod
Actor125: e3
Location: 58,9
Owner: Nod
Actor126: ltnk
Location: 21,4
Owner: Nod
Actor127: ltnk
Location: 22,4
Owner: Nod
Actor128: ltnk
Location: 23,4
Owner: Nod
Actor129: bggy
Location: 11,10
Owner: Nod
Actor130: bggy
Location: 10,10
Owner: Nod
Actor131: gun
Location: 13,16
Owner: Nod
TurretFacing: 160
Actor132: gun
Location: 12,16
Owner: Nod
TurretFacing: 160
Actor133: brik
Location: 9,16
Owner: Nod
Actor134: brik
Location: 8,16
Owner: Nod
Actor135: tc01
Location: 10,16
Owner: Neutral
Actor136: v07
Location: 8,17
Owner: Neutral
Actor138: v01
Location: 36,16
Owner: Neutral
Actor139: v02
Location: 37,19
Owner: Neutral
Actor140: v03
Location: 31,18
Owner: Neutral
Actor141: v11
Location: 33,19
Owner: Neutral
Actor142: v04
Location: 34,16
Owner: Neutral
Actor143: v06
Location: 40,17
Owner: Neutral
Actor144: c1
Location: 34,18
Owner: Neutral
Actor145: c4
Location: 37,21
Owner: Neutral
Actor146: c9
Location: 40,15
Owner: Neutral
Actor147: c5
Location: 39,16
Owner: Neutral
Actor148: cycl
Location: 31,20
Owner: Neutral
Actor149: cycl
Location: 32,20
Owner: Neutral
Actor150: cycl
Location: 33,20
Owner: Neutral
Actor151: cycl
Location: 34,20
Owner: Neutral
Actor152: cycl
Location: 34,21
Owner: Neutral
Actor153: cycl
Location: 34,22
Owner: Neutral
Actor154: cycl
Location: 35,22
Owner: Neutral
Actor155: cycl
Location: 35,23
Owner: Neutral
Actor156: gun
Location: 34,23
Owner: Nod
TurretFacing: 96
Actor157: sam
Location: 32,22
Owner: Nod
Actor158: e1
Location: 32,21
Owner: Nod
Actor159: e1
Location: 33,21
Owner: Nod
Actor160: e1
Location: 40,12
Owner: Nod
Actor161: e1
Location: 39,13
Owner: Nod
Actor162: cycl
Location: 50,5
Owner: Nod
Actor163: cycl
Location: 51,5
Owner: Nod
Actor167: cycl
Location: 51,8
Owner: Nod
Actor165: cycl
Location: 51,6
Owner: Nod
Actor166: cycl
Location: 51,7
Owner: Nod
Actor168: cycl
Location: 51,9
Owner: Nod
Actor169: cycl
Location: 51,10
Owner: Nod
Actor170: cycl
Location: 52,10
Owner: Nod
Actor171: cycl
Location: 52,9
Owner: Nod
Actor172: tc04
Location: 47,4
Owner: Neutral
Actor173: v02
Location: 49,6
Owner: Neutral
Actor174: v04
Location: 49,7
Owner: Neutral
Actor175: v10
Location: 47,7
Owner: Neutral
Actor176: v08
Location: 47,10
Owner: Neutral
Actor177: c3
Location: 48,9
Owner: Neutral
Actor178: c4
Location: 44,12
Owner: Neutral
Actor179: v09
Location: 44,10
Owner: Neutral
Actor180: wood
Location: 71,12
Owner: Neutral
Actor181: wood
Location: 71,13
Owner: Neutral
Actor182: wood
Location: 71,14
Owner: Neutral
Actor183: wood
Location: 71,15
Owner: Neutral
Actor184: wood
Location: 71,16
Owner: Neutral
Actor185: wood
Location: 71,17
Owner: Neutral
Actor186: wood
Location: 71,18
Owner: Neutral
Actor187: wood
Location: 71,19
Owner: Neutral
Actor188: wood
Location: 47,16
Owner: Neutral
Actor189: wood
Location: 48,16
Owner: Neutral
Actor190: wood
Location: 49,16
Owner: Neutral
Actor191: wood
Location: 50,16
Owner: Neutral
Actor192: wood
Location: 51,16
Owner: Neutral
Actor193: wood
Location: 52,16
Owner: Neutral
Actor194: wood
Location: 52,15
Owner: Neutral
Actor195: wood
Location: 52,14
Owner: Neutral
Actor196: wood
Location: 52,13
Owner: Neutral
Actor197: v18
Location: 51,15
Owner: Neutral
Actor198: v18
Location: 51,14
Owner: Neutral
Actor199: v18
Location: 50,14
Owner: Neutral
Actor200: v18
Location: 50,15
Owner: Neutral
Actor201: v16
Location: 49,14
Owner: Neutral
Actor202: v16
Location: 49,15
Owner: Neutral
Actor203: v16
Location: 48,15
Owner: Neutral
Actor204: v16
Location: 48,14
Owner: Neutral
Actor205: v16
Location: 47,14
Owner: Neutral
Actor206: v16
Location: 47,15
Owner: Neutral
Actor207: v14
Location: 50,13
Owner: Neutral
Actor208: v14
Location: 51,13
Owner: Neutral
Actor212: v06
Location: 48,13
Owner: Neutral
Actor213: v07
Location: 41,20
Owner: Neutral
Actor211: v15
Location: 47,13
Owner: Neutral
Actor215: c1
Location: 42,21
Owner: Neutral
Actor216: c7
Location: 43,20
Owner: Neutral
Actor217: c10
Location: 45,22
Owner: Neutral
Actor218: c9
Location: 44,21
Owner: Neutral
Actor219: e1
Location: 45,27
Owner: Nod
Actor220: e1
Location: 46,28
Owner: Nod
Actor222: v01
Location: 69,19
Owner: Neutral
Actor223: t03
Location: 72,18
Owner: Neutral
Actor224: tc05
Location: 61,10
Owner: Neutral
Actor225: tc04
Location: 60,12
Owner: Neutral
Actor226: tc01
Location: 59,16
Owner: Neutral
Actor227: tc03
Location: 57,16
Owner: Neutral
Actor228: tc04
Location: 57,17
Owner: Neutral
Actor229: v04
Location: 58,19
Owner: Neutral
Actor230: tc04
Location: 75,10
Owner: Neutral
Actor231: tc02
Location: 75,16
Owner: Neutral
Actor232: tc05
Location: 79,17
Owner: Neutral
Actor233: tc04
Location: 79,12
Owner: Neutral
Actor234: tc01
Location: 83,14
Owner: Neutral
Actor235: wood
Location: 81,20
Owner: Neutral
Actor236: wood
Location: 81,21
Owner: Neutral
Actor237: wood
Location: 81,22
Owner: Neutral
Actor238: t17
Location: 82,22
Owner: Neutral
Actor239: c4
Location: 84,17
Owner: Neutral
Actor240: e1
Location: 79,9
Owner: Nod
Actor241: e1
Location: 78,10
Owner: Nod
Actor242: e3
Location: 58,1
Owner: Nod
Actor243: e3
Location: 52,8
Owner: Nod
Actor244: cycl
Location: 52,27
Owner: Nod
Actor245: cycl
Location: 52,26
Owner: Nod
Actor246: cycl
Location: 51,26
Owner: Nod
Actor247: cycl
Location: 51,27
Owner: Nod
Actor248: cycl
Location: 62,26
Owner: Nod
Actor249: cycl
Location: 62,27
Owner: Nod
Actor250: cycl
Location: 63,27
Owner: Nod
Actor251: cycl
Location: 63,26
Owner: Nod
Actor252: gun
Location: 53,27
Owner: Nod
TurretFacing: 128
Actor253: gun
Location: 50,27
Owner: Nod
TurretFacing: 128
Actor254: gun
Location: 61,27
Owner: Nod
TurretFacing: 128
Actor255: gun
Location: 64,27
Owner: Nod
TurretFacing: 128
Actor256: v03
Location: 68,21
Owner: Neutral
Actor257: v02
Location: 67,19
Owner: Neutral
Actor258: tc05
Location: 70,21
Owner: Neutral
Actor259: v07
Location: 69,23
Owner: Neutral
Actor260: c3
Location: 67,21
Owner: Neutral
Actor262: c9
Location: 65,22
Owner: Neutral
Actor263: c7
Location: 66,20
Owner: Neutral
Actor264: e2
Location: 70,43
Owner: GDI
Actor265: e2
Location: 71,43
Owner: GDI
Actor266: tc04
Location: 47,42
Owner: Neutral
Actor267: tc05
Location: 73,42
Owner: Neutral
Actor268: tc05
Location: 44,42
Owner: Neutral
Actor269: tc01
Location: 75,44
Owner: Neutral
Actor270: t11
Location: 43,44
Owner: Neutral
Actor271: t01
Location: 41,41
Owner: Neutral
Actor272: tc04
Location: 40,41
Owner: Neutral
Actor273: tc04
Location: 38,43
Owner: Neutral
Actor274: tc05
Location: 35,42
Owner: Neutral
Actor275: tc01
Location: 32,44
Owner: Neutral
Actor276: tc04
Location: 30,42
Owner: Neutral
Actor277: tc05
Location: 23,42
Owner: Neutral
Actor278: v03
Location: 26,44
Owner: Neutral
Actor279: tc04
Location: 17,41
Owner: Neutral
Actor280: tc01
Location: 18,44
Owner: Neutral
Actor281: tc04
Location: 14,43
Owner: Neutral
Actor282: tc04
Location: 12,41
Owner: Neutral
Actor283: tc04
Location: 9,43
Owner: Neutral
Actor284: tc04
Location: 77,41
Owner: Neutral
Actor285: tc04
Location: 79,43
Owner: Neutral
Actor286: tc01
Location: 82,42
Owner: Neutral
Actor287: tc05
Location: 82,43
Owner: Neutral
Actor288: tc05
Location: 85,42
Owner: Neutral
Actor289: wood
Location: 72,26
Owner: Neutral
Actor290: wood
Location: 71,26
Owner: Neutral
Actor291: wood
Location: 70,26
Owner: Neutral
Actor292: wood
Location: 69,26
Owner: Neutral
Actor293: wood
Location: 68,26
Owner: Neutral
Actor294: c4
Location: 71,25
Owner: Neutral
Actor295: v05
Location: 72,20
Owner: Neutral
Actor164: nuke
Location: 8,12
Owner: Nod
Actor209: nuke
Location: 10,12
Owner: Nod
Actor210: nuke
Location: 53,45
Owner: GDI
Actor214: nuke
Location: 55,45
Owner: GDI
Actor221: jeep
Location: 57,45
Owner: GDI
boat1: boat
Location: 45,33
Owner: GDI
boat2: boat
Location: 39,37
Owner: GDI
boat3: boat
Location: 70,33
Owner: GDI
boat4: boat
Location: 79,37
Owner: GDI
lst1: lst
Location: 53,35
Owner: GDI
Facing: 64
lst2: lst
Location: 58,35
Owner: GDI
Facing: 64
lst3: lst
Location: 63,35
Owner: GDI
Facing: 64
ftnk1: ftnk
Location: 67,22
Owner: Nod
Facing: 228
ftnk2: ftnk
Location: 65,20
Owner: Nod
Facing: 192
Actor300: split3
Owner: Neutral
Location: 13,21
Actor299: split3
Owner: Neutral
Location: 73,6
Rules: cnc|rules/campaign-palettes.yaml, rules.yaml

View File

@@ -1,18 +0,0 @@
World:
-SpawnMPUnits:
-MPStartLocations:
-CrateSpawner:
MenuPaletteEffect:
Effect: Desaturated
LuaScript:
Scripts: shellmap.lua
MusicPlaylist:
BackgroundMusic: map1
LST:
Mobile:
Speed: 42
BOAT:
Mobile:
Speed: 42

View File

@@ -1,30 +0,0 @@
ticks = 0
speed = 5
Tick = function()
ticks = ticks + 1
local t = (ticks + 45) % (360 * speed) * (math.pi / 180) / speed;
Camera.Position = viewportOrigin + WVec.New(-15360 * math.sin(t), 4096 * math.cos(t), 0)
end
WorldLoaded = function()
viewportOrigin = Camera.Position
LoadTransport(lst1, "htnk")
LoadTransport(lst2, "mcv")
LoadTransport(lst3, "htnk")
local units = { boat1, boat2, boat3, boat4, lst1, lst2, lst3}
for i, unit in ipairs(units) do
LoopTrack(unit, CPos.New(8, unit.Location.Y), CPos.New(87, unit.Location.Y))
end
end
LoopTrack = function(actor, left, right)
actor.ScriptedMove(left)
actor.Teleport(right)
actor.CallFunc(function() LoopTrack(actor, left, right) end)
end
LoadTransport = function(transport, passenger)
transport.LoadPassenger(Actor.Create(passenger, false, { Owner = transport.Owner, Facing = transport.Facing }))
end

View File

@@ -7,6 +7,7 @@ Container@OBSERVER_WIDGETS:
Text: Options (Esc)
Font: Bold
Key: escape
DisableWorldSounds: true
MenuButton@OBSERVER_STATS_BUTTON:
MenuContainer: INGAME_OBSERVERSTATS_BG
HideIngameUI: False

View File

@@ -49,6 +49,7 @@ Container@PLAYER_WIDGETS:
Background:
TooltipText: Debug Menu
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:
@@ -121,6 +122,7 @@ Container@PLAYER_WIDGETS:
Background:
TooltipText: Options
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:

View File

@@ -13,6 +13,7 @@ World:
Maximum: 3
MusicPlaylist:
BackgroundMusic: options
DisableWorldSounds: true
LuaScript:
Scripts: d2k-shellmap.lua

View File

@@ -60,6 +60,7 @@ Container@OBSERVER_WIDGETS:
Background: sidebar-button-observer
TooltipText: Options
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:

View File

@@ -111,6 +111,7 @@ Container@PLAYER_WIDGETS:
Background: sidebar-button
TooltipText: Debug Menu
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:
@@ -127,6 +128,7 @@ Container@PLAYER_WIDGETS:
Background: sidebar-button
TooltipText: Options
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:

View File

@@ -165,28 +165,21 @@ Background@SETTINGS_PANEL:
Height: 20
Font: Regular
Text: Player Stance Colors
Checkbox@SHOW_SHELLMAP:
X: 15
Y: 195
Width: 200
Height: 20
Font: Regular
Text: Show Shellmap
Label@PLAYER:
Text: Player:
X: 15
Y: 240
Y: 205
TextField@PLAYERNAME:
Text: Name
X: 65
Y: 230
Y: 195
Width: 145
Height: 25
MaxLength: 16
ColorPreviewManager@COLOR_MANAGER:
DropDownButton@PLAYERCOLOR:
X: 215
Y: 230
Y: 195
Width: 70
Height: 25
IgnoreChildMouseOver: true

View File

@@ -7,6 +7,7 @@ World:
-MPStartLocations:
MusicPlaylist:
BackgroundMusic: intro
DisableWorldSounds: true
ResourceType@ore:
ValuePerUnit: 0
LuaScript:

View File

@@ -53,6 +53,7 @@ Container@PLAYER_WIDGETS:
Background: sidebar-button
TooltipText: Debug Menu
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:
@@ -130,6 +131,7 @@ Container@PLAYER_WIDGETS:
Background: sidebar-button
TooltipText: Options
TooltipContainer: TOOLTIP_CONTAINER
DisableWorldSounds: true
VisualHeight: 0
Children:
Image@ICON:

View File

@@ -1433,6 +1433,7 @@ Rules:
ValuePerUnit: 0
MusicPlaylist:
BackgroundMusic: intro
DisableWorldSounds: true
GlobalLightingPaletteEffect:
Blue: 0.7
Ambient: 0.7