예제 #1
0
 public void TransformMonster(MonsterRenderer renderer, ref Rectangle drawFrom, ref Rectangle drawTo)
 {
     if (currentEffect != null && currentEffect is TransformSprite)
     {
         ((TransformSprite)currentEffect).UpdateSpritePosition(renderer, ref drawFrom, ref drawTo);
     }
 }
예제 #2
0
    public Monster(FightScene fightScene)
    {
        Hitpoint.Val = 30;

        this.fightScene = fightScene;

        GameObject gObject = GameObject.FindGameObjectsWithTag("Placeholder").Single(o => o.name == "Monster");

        this.renderer = gObject.AddComponent <MonsterRenderer> ();
        this.renderer.Register(this);

        Hitpoint.OnChange += (oldVal, newVal) => {
            if (newVal < oldVal)
            {
                this.renderer.Shake();
            }

            if (newVal <= 0)
            {
                onDeath();
            }
        };

        this.States = new StatesBar(gObject);
    }
예제 #3
0
 public Leaves(MonsterRenderer renderer, int delay, int param = 0, int startAt = 0, int stopEarly = int.MaxValue)
     : base(renderer, delay, param, startAt, stopEarly)
 {
     leaves = new List <Leaf>();
     leaves.Add(new Leaf(32, -24, 5));
     leaves.Add(new Leaf(144, -80, 16));
     leaves.Add(new Leaf(192, -128, 10));
 }
예제 #4
0
 public Animation(MonsterRenderer renderer, int delay, int param, int startAt, int stopEarly)
 {
     this.renderer  = renderer;
     this.delay     = delay;
     this.param     = param;
     this.StartAt   = startAt;
     this.StopEarly = stopEarly;
 }
예제 #5
0
        public void UpdateSpritePosition(MonsterRenderer renderer, ref Rectangle drawFrom, ref Rectangle drawTo)
        {
            if (this.renderer != renderer || skip)
            {
                return;
            }

            switch (transformation)
            {
            case SpriteTransformation.SlideDown:
                drawFrom = new Rectangle(drawFrom.X, drawFrom.Y, drawFrom.Width, drawFrom.Height - (int)(((decimal)frameCounter) * 16));
                drawTo   = new Rectangle(drawTo.X, drawTo.Y + ((int)frameCounter) * 16, drawTo.Width, drawFrom.Height);
                break;

            case SpriteTransformation.SlideUp:
                drawFrom = new Rectangle(drawFrom.X, drawFrom.Y, drawFrom.Width, (int)(((decimal)frameCounter) * 16));
                drawTo   = new Rectangle(drawTo.X, drawTo.Y + drawTo.Height - ((int)frameCounter) * 16, drawTo.Width, drawFrom.Height);
                break;

            case SpriteTransformation.Shrink:
                drawTo = new Rectangle(drawTo.X + frameCounter * drawTo.Width / 32, drawTo.Y + frameCounter * drawTo.Height / 16, drawTo.Width - frameCounter * drawTo.Width / 16, drawTo.Height - frameCounter * drawTo.Height / 16);
                break;

            case SpriteTransformation.Stretch:
                drawTo = new Rectangle(drawTo.X + drawTo.Width / 2 - frameCounter * drawTo.Width / 32, drawTo.Y + drawTo.Height - frameCounter * drawTo.Height / 16, frameCounter * drawTo.Width / 16, frameCounter * drawTo.Height / 16);
                break;

            case SpriteTransformation.SlideOff:
                drawTo.Offset(frameCounter * 16 * renderer.ScreenEdgeDirection, 0);
                break;

            case SpriteTransformation.ShiftBackward:
                drawTo.Offset(frameCounter * 12 * renderer.ScreenEdgeDirection, 0);
                break;

            case SpriteTransformation.Flatten:
                drawTo = new Rectangle(drawTo.X + frameCounter * 12, drawTo.Y, drawTo.Width - frameCounter * 24, drawFrom.Height);
                break;

            case SpriteTransformation.SlideOffTop:
                drawFrom = new Rectangle(drawFrom.X, drawFrom.Y + Math.Max(0, frameCounter * 16 - 112), drawFrom.Width, drawFrom.Height - Math.Max(0, frameCounter * 16 - 112));
                drawTo   = new Rectangle(drawTo.X, drawTo.Y - Math.Min(frameCounter * 16, 112), drawTo.Width, drawFrom.Height);
                break;

            case SpriteTransformation.SlideBackDown:
                drawFrom = new Rectangle(drawFrom.X, drawFrom.Y + drawFrom.Height - Math.Min(drawFrom.Height, frameCounter * 16), drawFrom.Width, Math.Min(drawFrom.Height, frameCounter * 16));
                drawTo   = new Rectangle(drawTo.X, Math.Min(drawTo.Y, drawTo.Y - 112 + Math.Min(112, Math.Max(0, frameCounter * 16 - drawTo.Height))), drawTo.Width, drawFrom.Height);
                break;

            case SpriteTransformation.ShakeInPlace:
                if (frameCounter % 6 < 3)
                {
                    drawTo.Offset(64 * renderer.ScreenEdgeDirection, 0);
                }
                break;
            }
        }
예제 #6
0
        public bool EffectNeedsMonDefaultPalette(MonsterRenderer renderer)
        {
            if (currentEffect != null && currentEffect is Animation)
            {
                return(((Animation)currentEffect).UseMonDefaultPalette(renderer));
            }

            return(false);
        }
예제 #7
0
 public Petals(MonsterRenderer renderer, int delay, int param = 0, int startAt = 0, int stopEarly = int.MaxValue)
     : base(renderer, delay, param, startAt, stopEarly)
 {
     petals = new List <Petal>();
     petals.Add(new Petal(32, -24, 5, 0));
     petals.Add(new Petal(144, -80, 16, 1));
     petals.Add(new Petal(100, 64, 2, 0));
     petals.Add(new Petal(400, 16, 12, 1));
     petals.Add(new Petal(512, 72, 9, 0));
     petals.Add(new Petal(540, 88, 11, 1));
     petals.Add(new Petal(92, 176, 4, 0));
     petals.Add(new Petal(280, 120, 15, 1));
     petals.Add(new Petal(240, 328, 1, 0));
     petals.Add(new Petal(192, -128, 10, 1));
 }
예제 #8
0
        public void QueueSpecialEffects(Sequence sequence, MonsterRenderer self, MonsterRenderer foe)
        {
            foreach (SpecialEffects.Effect effect in sequence.Effects)
            {
                switch (effect.Type)
                {
                case SpecialEffectType.Sequence:
                    QueueSpecialEffects(effect.Sequence, self, foe);
                    break;

                case SpecialEffectType.ScreenTransform:
                    queue.Enqueue(new TransformScreen(parent, effect.ScreenTransformation, effect.Offset, effect.Parallel));
                    break;

                case SpecialEffectType.SpriteTransform:
                    queue.Enqueue(new TransformSprite(effect.SpriteTransformation, effect.Who == Who.Self ? self : foe));
                    break;

                case SpecialEffectType.PaletteSwap:
                    queue.Enqueue(new SwapPalette(effect.Palette));
                    break;

                case SpecialEffectType.Delay:
                    queue.Enqueue(new Delay(effect.DelayFrames));
                    break;

                case SpecialEffectType.Animation:
                    ConstructorInfo constructor = effect.SpriteAnimation.GetConstructor(new Type[] { typeof(MonsterRenderer), typeof(int), typeof(int), typeof(int), typeof(int) });
                    queue.Enqueue((Animation)constructor.Invoke(new object[] { effect.Who == Who.Self ? self : foe, effect.DelayFrames, effect.Param, effect.StartAt, effect.StopEarly }));
                    break;

                case SpecialEffectType.Temporary:
                    break;
                }
            }
        }
예제 #9
0
 public Halo(MonsterRenderer renderer, int delay, int param = 0, int startAt = 0, int stopEarly = int.MaxValue)
     : base(renderer, delay, param, startAt, stopEarly)
 {
 }
예제 #10
0
 public override bool UseMonDefaultPalette(MonsterRenderer renderer)
 {
     return(renderer == this.renderer);
 }
예제 #11
0
 public override bool UseMonDefaultPalette(MonsterRenderer renderer)
 {
     return(param == 0 && renderer != this.renderer);
 }
예제 #12
0
 public TransformSprite(SpriteTransformation transformation, MonsterRenderer renderer)
 {
     this.transformation = transformation;
     this.renderer       = renderer;
     skip = false;
 }
예제 #13
0
 public virtual bool UseMonDefaultPalette(MonsterRenderer renderer)
 {
     return(false);
 }
예제 #14
0
 public ExplosionSingle(MonsterRenderer renderer, int delay, int param = 0, int startAt = 0, int stopEarly = int.MaxValue)
     : base(renderer, delay, param, startAt, stopEarly)
 {
 }
예제 #15
0
        private void battle_BattleEvent(object sender, BattleEventArgs e)
        {
            HUD             display       = e.Monster == battle.PlayerCurrent ? (HUD)selfHUD : (HUD)foeHUD;
            MonsterRenderer current       = e.Monster == battle.PlayerCurrent ? (MonsterRenderer)selfRenderer : (MonsterRenderer)foeRenderer;
            MonsterRenderer opponent      = current == selfRenderer ? (MonsterRenderer)foeRenderer : (MonsterRenderer)selfRenderer;
            Panel           previousFocus = hasFocus;

            syncronize.Reset();

            if (e.Type == BattleEventType.MonHPChanged)
            {
                hasFocus = display;
                display.AnimateHPChange(e.HPBefore, e.HPAfter);
            }
            else if (e.Type == BattleEventType.MonFainted)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Fainted"], current, opponent);
            }
            else if (e.Type == BattleEventType.MonRecalled)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Recalled"], current, opponent);
            }
            else if (e.Type == BattleEventType.MonSentOut)
            {
                hasFocus = specialEffectManager;
                display.UpdateStatus();
                specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Sent Out"], current, opponent);
            }
            else if (e.Type == BattleEventType.MonSpawned)
            {
                hasFocus = specialEffectManager;
                display.UpdateStatus();
                specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Sent Out"], current, opponent);
            }
            else if (e.Type == BattleEventType.AttackHit || e.Type == BattleEventType.RecurringAttackHit)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new Delay(30));

                if (e.Monster.SubstituteHP > 0 && e.Move.Name != "Substitute")
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Substitute Pre-Attack"], current, opponent);
                }

                Sequence seq = null;
                if (e.Type == BattleEventType.RecurringAttackHit && Sequence.Sequences.ContainsKey(e.Move.Name + " Recurring"))
                {
                    seq = Sequence.Sequences[e.Move.Name + " Recurring"];
                }
                else if (Sequence.Sequences.ContainsKey(e.Move.Name))
                {
                    seq = Sequence.Sequences[e.Move.Name];
                }

                if (seq != null)
                {
                    specialEffectManager.QueueSpecialEffects(seq, current, opponent);
                }
                else
                {
                    specialEffectManager.QueueSpecialEffect(new Delay(30));
                }
                switch (e.Move.AttackType)
                {
                case AttackType.Damaging:
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences[e.Monster == battle.PlayerCurrent ? "Player Damaging" : "Enemy Damaging"], current, opponent);
                    break;

                case AttackType.DamagingWithEffectChance:
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences[e.Monster == battle.PlayerCurrent ? "Player Damaging With Effect Chance" : "Enemy Damaging With Effect Chance"], current, opponent);
                    break;

                case AttackType.NonDamaging:
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences[e.Monster == battle.PlayerCurrent ? "Player Non-Damaging" : "Enemy Non-Damaging"], current, opponent);
                    break;

                default:
                    specialEffectManager.QueueSpecialEffect(new Delay(20));
                    break;
                }

                if (e.Monster.SubstituteHP > 0 && e.Move.Name != "Substitute")
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Substitute Post-Attack"], current, opponent);
                }
            }
            else if (e.Type == BattleEventType.AttackMissed)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new TransformSprite(SpriteTransformation.Show, current));
                specialEffectManager.QueueSpecialEffect(new Delay(50));
            }
            else if (e.Type == BattleEventType.AttackCharged)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new Delay(30));

                if (Sequence.Sequences.ContainsKey(e.Move.Name + " Charge"))
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences[e.Move.Name + " Charge"], current, opponent);
                }
                else
                {
                    specialEffectManager.QueueSpecialEffect(new Delay(30));
                }
            }
            else if (e.Type == BattleEventType.StatusAilment)
            {
                hasFocus = specialEffectManager;
                if (e.Status == StatusCondition.Sleep)
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Asleep"], current, opponent);
                }
                else if (e.Status == StatusCondition.Confusion)
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Confused"], current, opponent);
                }
                else if (e.Status == StatusCondition.Seeded)
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Seeded"], current, opponent);
                }
                else if (e.Status == StatusCondition.Burn)
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Burned"], current, opponent);
                }
                else if (e.Status == StatusCondition.Poison || e.Status == StatusCondition.BadlyPoisoned)
                {
                    specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Poisoned"], current, opponent);
                }
                else
                {
                    throw new Exception();
                }
            }
            else if (e.Type == BattleEventType.MonTransformed)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new TransformSprite(SpriteTransformation.Show, current));
            }
            else if (e.Type == BattleEventType.SubstituteBroke)
            {
                hasFocus = specialEffectManager;
                display.UpdateStatus();
                specialEffectManager.QueueSpecialEffects(Sequence.Sequences["Substitute Broke"], current, opponent);
            }
            else if (e.Type == BattleEventType.MonCrashed)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new TransformScreen(this, ScreenTransformation.ShakeHorizontallyFast, 4, false));
            }
            else if (e.Type == BattleEventType.MonHurtItself)
            {
                hasFocus = specialEffectManager;
                specialEffectManager.QueueSpecialEffect(new Animations.DoublePow(current, 8));
            }
            else if (e.Type == BattleEventType.MonStatusUpdate)
            {
                display.UpdateStatus();
            }
            else
            {
                throw new Exception();
            }

            if (e.Type != BattleEventType.MonStatusUpdate)
            {
                syncronize.WaitOne();
            }

            hasFocus = previousFocus;
        }