#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 OpenRA.Mods.RA.Activities; using OpenRA.Mods.RA.Buildings; using OpenRA.Mods.RA.Orders; using OpenRA.Mods.RA.Render; using OpenRA.Traits; namespace OpenRA.Mods.RA { class TransformsInfo : ITraitInfo { [ActorReference] public readonly string IntoActor = null; public readonly int2 Offset = int2.Zero; public readonly int Facing = 96; public readonly string[] TransformSounds = { }; public readonly string[] NoTransformSounds = { }; public virtual object Create(ActorInitializer init) { return new Transforms(init.self, this); } } class Transforms : IIssueOrder, IResolveOrder, IOrderVoice { readonly Actor self; readonly TransformsInfo info; readonly BuildingInfo bi; public Transforms(Actor self, TransformsInfo info) { this.self = self; this.info = info; bi = self.World.Map.Rules.Actors[info.IntoActor].Traits.GetOrDefault(); } public string VoicePhraseForOrder(Actor self, Order order) { return (order.OrderString == "DeployTransform") ? "Move" : null; } bool CanDeploy() { var b = self.TraitOrDefault(); if (b != null && b.Locked) return false; return bi == null || self.World.CanPlaceBuilding(info.IntoActor, bi, self.Location + (CVec)info.Offset, self); } public IEnumerable Orders { get { yield return new DeployOrderTargeter("DeployTransform", 5, () => CanDeploy()); } } public Order IssueOrder(Actor self, IOrderTargeter order, Target target, bool queued) { if (order.OrderID == "DeployTransform") return new Order(order.OrderID, self, queued); return null; } public void DeployTransform(bool queued) { var b = self.TraitOrDefault(); if (!CanDeploy() || (b != null && !b.Lock())) { foreach (var s in info.NoTransformSounds) Sound.PlayToPlayer(self.Owner, s); return; } if (!queued) self.CancelActivity(); if (self.HasTrait()) self.QueueActivity(new Turn(info.Facing)); var rb = self.TraitOrDefault(); if (rb != null && self.Info.Traits.Get().HasMakeAnimation) self.QueueActivity(new MakeAnimation(self, true, () => rb.PlayCustomAnim(self, "make"))); self.QueueActivity(new Transform(self, info.IntoActor) { Offset = (CVec)info.Offset, Facing = info.Facing, Sounds = info.TransformSounds }); } public void ResolveOrder(Actor self, Order order) { if (order.OrderString == "DeployTransform") DeployTransform(order.Queued); } } }