Пример #1
0
        public static void Target(actors.Character target)
        {
            _lastTarget = (Mob)target;
            _instance.UpdateImage();

            HealthIndicator.Instance.Target(target);
        }
Пример #2
0
        public override bool Proc(Weapon weapon, actors.Character attacker, actors.Character defender, int damage)
        {
            var level = Math.Max(0, weapon.level);

            var dmg = damage;

            for (var i = 1; i <= level + 1; i++)
            {
                dmg = Math.Max(dmg, attacker.DamageRoll() - i);
            }

            if (dmg <= damage)
            {
                return(false);
            }

            defender.Damage(dmg - damage, this);
            return(true);
        }
Пример #3
0
        public virtual bool[] UpdateFieldOfView(actors.Character c)
        {
            var cx = c.pos % Width;
            var cy = c.pos / Width;

            bool sighted = c.Buff <Blindness>() == null && c.Buff <Shadows>() == null && c.IsAlive;

            if (sighted)
            {
                ShadowCaster.CastShadow(cx, cy, fieldOfView, c.viewDistance);
            }
            else
            {
                Arrays.Fill(fieldOfView, false);
            }

            var sense = 1;

            if (c.IsAlive)
            {
                sense = c.Buffs <MindVision>().Select(b => b.Distance).Concat(new[] { sense }).Max();
            }

            if ((sighted && sense > 1) || !sighted)
            {
                var ax = Math.Max(0, cx - sense);
                var bx = Math.Min(cx + sense, Width - 1);
                var ay = Math.Max(0, cy - sense);
                var by = Math.Min(cy + sense, Height - 1);

                var len = bx - ax + 1;
                var pos = ax + ay * Width;
                for (var y = ay; y <= by; y++, pos += Width)
                {
                    Arrays.Fill(fieldOfView, pos, pos + len, true);
                }

                for (var i = 0; i < Length; i++)
                {
                    fieldOfView[i] &= discoverable[i];
                }
            }

            if (!c.IsAlive)
            {
                return(fieldOfView);
            }

            if (c.Buff <MindVision>() != null)
            {
                foreach (var mob in mobs)
                {
                    var p = mob.pos;
                    fieldOfView[p]             = true;
                    fieldOfView[p + 1]         = true;
                    fieldOfView[p - 1]         = true;
                    fieldOfView[p + Width + 1] = true;
                    fieldOfView[p + Width - 1] = true;
                    fieldOfView[p - Width + 1] = true;
                    fieldOfView[p - Width - 1] = true;
                    fieldOfView[p + Width]     = true;
                    fieldOfView[p - Width]     = true;
                }
            }
            else
            if (c == Dungeon.Hero && ((Hero)c).heroClass == HeroClass.Huntress)
            {
                foreach (var mob in mobs)
                {
                    var p = mob.pos;
                    if (Distance(c.pos, p) != 2)
                    {
                        continue;
                    }

                    fieldOfView[p]             = true;
                    fieldOfView[p + 1]         = true;
                    fieldOfView[p - 1]         = true;
                    fieldOfView[p + Width + 1] = true;
                    fieldOfView[p + Width - 1] = true;
                    fieldOfView[p - Width + 1] = true;
                    fieldOfView[p - Width - 1] = true;
                    fieldOfView[p + Width]     = true;
                    fieldOfView[p - Width]     = true;
                }
            }

            if (c.Buff <Awareness>() != null)
            {
                foreach (var heap in heaps.Values)
                {
                    var p = heap.Pos;
                    fieldOfView[p]             = true;
                    fieldOfView[p + 1]         = true;
                    fieldOfView[p - 1]         = true;
                    fieldOfView[p + Width + 1] = true;
                    fieldOfView[p + Width - 1] = true;
                    fieldOfView[p - Width + 1] = true;
                    fieldOfView[p - Width - 1] = true;
                    fieldOfView[p + Width]     = true;
                    fieldOfView[p - Width]     = true;
                }
            }

            return(fieldOfView);
        }
Пример #4
0
        public virtual void Press(int cell, actors.Character ch)
        {
            if (pit[cell] && ch == Dungeon.Hero)
            {
                Chasm.HeroFall(cell);
                return;
            }

            var trap = false;

            switch (map[cell])
            {
            case Terrain.SECRET_TOXIC_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.TOXIC_TRAP;

            case Terrain.TOXIC_TRAP:
                trap = true;
                ToxicTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_FIRE_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.FIRE_TRAP;

            case Terrain.FIRE_TRAP:
                trap = true;
                FireTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_PARALYTIC_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.PARALYTIC_TRAP;

            case Terrain.PARALYTIC_TRAP:
                trap = true;
                ParalyticTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_POISON_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.POISON_TRAP;

            case Terrain.POISON_TRAP:
                trap = true;
                PoisonTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_ALARM_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.ALARM_TRAP;

            case Terrain.ALARM_TRAP:
                trap = true;
                AlarmTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_LIGHTNING_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.LIGHTNING_TRAP;

            case Terrain.LIGHTNING_TRAP:
                trap = true;
                LightningTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_GRIPPING_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.GRIPPING_TRAP;

            case Terrain.GRIPPING_TRAP:
                trap = true;
                GrippingTrap.Trigger(cell, ch);
                break;

            case Terrain.SECRET_SUMMONING_TRAP:
                GLog.Information(TXT_HIDDEN_PLATE_CLICKS);
                goto case Terrain.SUMMONING_TRAP;

            case Terrain.SUMMONING_TRAP:
                trap = true;
                SummoningTrap.Trigger(cell, ch);
                break;

            case Terrain.HIGH_GRASS:
                HighGrass.Trample(this, cell, ch);
                break;

            case Terrain.WELL:
                WellWater.AffectCell(cell);
                break;

            case Terrain.ALCHEMY:
                if (ch == null)
                {
                    Alchemy.Transmute(cell);
                }
                break;

            case Terrain.DOOR:
                Door.Enter(cell);
                break;
            }

            if (trap)
            {
                Sample.Instance.Play(Assets.SND_TRAP);

                if (ch == Dungeon.Hero)
                {
                    Dungeon.Hero.Interrupt();
                }

                Set(cell, Terrain.INACTIVE_TRAP);
                GameScene.UpdateMap(cell);
            }

            var plant = plants[cell];

            if (plant != null)
            {
                plant.Activate(ch);
            }
        }