public static void AD_CastingSkill(ActionDisplay actionDisplay, IMap map, Entity source, Entity target)
        {
            // The maximum life the effects will have. This way, if the entity gets stuck with IsCastingSkill set to true,
            // the effects will at least go away eventually. Make sure that this is not greater than the longest possible
            // time to cast a skill.
            const int maxEffectLife = 1000 * 20;

            var drawableMap = map as IDrawableMap;
            var sourceAsCharacter = source as Character;

            var castingEffects = new List<ITemporaryMapEffect>();

            // Make sure we have a valid source
            if (sourceAsCharacter == null)
            {
                const string errmsg = "AD_CastingSkill requires a Character as the source, but the source ({0}) is type `{1}`.";
                if (log.IsErrorEnabled)
                    log.ErrorFormat(errmsg, source, source.GetType());
                Debug.Fail(string.Format(errmsg, source, source.GetType()));
                return;
            }

            // Play the sound
            PlaySoundSimple(actionDisplay, source);

            // Check if we can properly display the effect
            if (drawableMap != null)
            {
                // Show the graphic going from the source to target
                if (actionDisplay.GrhIndex != GrhIndex.Invalid)
                {
                    var gd = GrhInfo.GetData(actionDisplay.GrhIndex);
                    if (gd != null)
                    {
                        // Make the effect loop indefinitely
                        var grh = new Grh(gd, AnimType.Loop, TickCount.Now);
                        var effect = new MapGrhEffectTimed(grh, source.Center, maxEffectLife) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                        drawableMap.AddTemporaryMapEffect(effect);
                        castingEffects.Add(effect);
                    }
                }

                // Show the particle effect
                var pe = ParticleEffectManager.Instance.TryCreateEffect(actionDisplay.ParticleEffect);
                if (pe != null)
                {
                    // Effect that just takes place on the caster
                    pe.Position = source.Center;
                    pe.Life = maxEffectLife;
                    var effect = new TemporaryMapParticleEffect(pe) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                    drawableMap.AddTemporaryMapEffect(effect);
                    castingEffects.Add(effect);
                }
            }

            // Make sure we have at least one valid effect. If not, there is nothing more to do.
            if (castingEffects.Count <= 0)
                return;

            // Add the list of effects to our local dictionary
            lock (_activeCastingSkillEffectsSync)
            {
                // Make sure they don't already have effects in the dictionary
                RemoveFromActiveCastingSkillEffects(sourceAsCharacter);

                // Add to the dictionary
                _activeCastingSkillEffects.Add(sourceAsCharacter, castingEffects);
            }

            // Attach the listener for the IsCastingSkill
            sourceAsCharacter.IsCastingSkillChanged += AD_CastingSkill_Character_IsCastingSkillChanged;

            // If the source already finished casting the skill, destroy them now since we probably missed the event
            if (!sourceAsCharacter.IsCastingSkill)
                RemoveFromActiveCastingSkillEffects(sourceAsCharacter);
        }
        /// <summary>
        /// Plays the sound for an <see cref="ActionDisplay"/> in a very basic way.
        /// This is intended to be called by the scripts for playing sound instead of handling sound manually.
        /// </summary>
        /// <param name="actionDisplay">The <see cref="ActionDisplay"/>.</param>
        /// <param name="source">The source of the sound.</param>
        static void PlaySoundSimple(ActionDisplay actionDisplay, ISpatial source)
        {
            // Check for valid parameters
            if (actionDisplay == null)
            {
                Debug.Fail("actionDisplay must not be null.");
                return;
            }
            if (source == null)
            {
                Debug.Fail("source must not be null.");
                return;
            }

            // Make sure there is a valid sound
            if (!actionDisplay.Sound.HasValue)
                return;

            // When possible, attach the sound to the source. Otherwise, just play it where the source is currently at
            var attackerAsAudioEmitter = source as IAudioEmitter;
            if (attackerAsAudioEmitter != null)
                _audioManager.SoundManager.Play(actionDisplay.Sound.Value, attackerAsAudioEmitter);
            else
                _audioManager.SoundManager.Play(actionDisplay.Sound.Value, source.Center);
        }
        public static void AD_Projectile(ActionDisplay actionDisplay, IMap map, Entity source, Entity target)
        {
            var drawableMap = map as IDrawableMap;
            var sourceAsCharacter = source as Character;

            // Play the sound
            PlaySoundSimple(actionDisplay, source);

            // Show the attack animation on the attacker
            if (sourceAsCharacter != null)
                sourceAsCharacter.Attack();

            // Check if we can properly display the effect
            if (drawableMap != null && target != null && source != target)
            {
                // Show the graphic going from the attacker to attacked
                if (actionDisplay.GrhIndex != GrhIndex.Invalid)
                {
                    var gd = GrhInfo.GetData(actionDisplay.GrhIndex);
                    if (gd != null)
                    {
                        var grh = new Grh(gd, AnimType.Loop, TickCount.Now);
                        var effect = new MapGrhEffectSeekPosition(grh, source.Center, target.Center, 750f) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                        drawableMap.AddTemporaryMapEffect(effect);
                    }
                }

                // Show the particle effect
                var pe = ParticleEffectManager.Instance.TryCreateEffect(actionDisplay.ParticleEffect);
                if (pe != null)
                {
                    // Effect that just takes place on the target and dies very quickly
                    pe.Position = target.Center;
                    pe.Life = 100;
                    var effect = new TemporaryMapParticleEffect(pe) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                    drawableMap.AddTemporaryMapEffect(effect);
                }
            }
        }
        public static void AD_SkillCasted(ActionDisplay actionDisplay, IMap map, Entity source, Entity target)
        {
            var drawableMap = map as IDrawableMap;

            // Play the sound
            PlaySoundSimple(actionDisplay, source);

            // Check if we can properly display the effect
            if (drawableMap != null && source != null)
            {
                if (actionDisplay.GrhIndex != GrhIndex.Invalid)
                {
                    if (target != null && target != source)
                    {
                        // Show the graphic going from the source to target
                        var gd = GrhInfo.GetData(actionDisplay.GrhIndex);
                        if (gd != null)
                        {
                            var grh = new Grh(gd, AnimType.Loop, TickCount.Now);
                            var effect = new MapGrhEffectSeekPosition(grh, source.Center, target.Center, 750f) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                            drawableMap.AddTemporaryMapEffect(effect);
                        }
                    }
                    else
                    {
                        // Show the graphic at the source
                        var gd = GrhInfo.GetData(actionDisplay.GrhIndex);
                        if (gd != null)
                        {
                            var grh = new Grh(gd, AnimType.Loop, TickCount.Now);
                            var effect = new MapGrhEffectLoopOnce(grh, source.Center) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                            drawableMap.AddTemporaryMapEffect(effect);
                        }
                    }
                }

                // Show the particle effect
                var pe = ParticleEffectManager.Instance.TryCreateEffect(actionDisplay.ParticleEffect);
                if (pe != null)
                {
                    pe.Position = source.Center;
                    ITemporaryMapEffect effect;

                    if (target != null && target != source)
                    {
                        // Effect that seeks out the position of the target
                        effect = new TemporaryMapParticleEffectSeekPosition(pe, target.Center, 250f) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                    }
                    else
                    {
                        // Effect that takes place at the source
                        effect = new TemporaryMapParticleEffect(pe) { MapRenderLayer = MapRenderLayer.SpriteForeground };
                    }

                    // Add the effect to the map
                    if (effect != null)
                        drawableMap.AddTemporaryMapEffect(effect);
                }
            }
        }
Example #5
0
 public static void Test(ActionDisplay actionDisplay, IMap map, Entity source, Entity target)
 {
     i = 50;
 }