Beispiel #1
0
        public new void AimShot(Entity target)
        {
            //TODO: throw whatever is being held by the player at the target, according to their Throwing skill and the total distance.
            //If it's a gun they're holding, fire it instead, according to their Shooting skill.
            //MessageBox.Message("Can't shoot yet, sorry.", true);

            if (target is Player)
            {
                MessageBox.Notice("Don't shoot yourself in the foot!", true);
                return;
            }

            var weapon = Character.CanShoot();
            var weap   = weapon.GetToken("weapon");
            var skill  = weap.GetToken("skill");

            if (new[] { "throwing", "small_firearm", "large_firearm", "huge_firearm" }.Contains(skill.Text))
            {
                if (weap.HasToken("ammo"))
                {
                    var ammoName    = weap.GetToken("ammo").Text;
                    var carriedAmmo = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == ammoName);
                    if (carriedAmmo == null)
                    {
                        return;
                    }
                    var knownAmmo = NoxicoGame.KnownItems.Find(ki => ki.ID == ammoName);
                    if (knownAmmo == null)
                    {
                        return;
                    }
                    knownAmmo.Consume(Character, carriedAmmo);
                }
                else if (weapon.HasToken("charge"))
                {
                    var carriedGun = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == weapon.ID && ci.HasToken("equipped"));
                    weapon.Consume(Character, carriedGun);
                }
                if (weapon != null)
                {
                    FireLine(weapon.Path("effect"), target);
                }
            }
            else
            {
                MessageBox.Notice("Can't throw yet, sorry.", true);
                return;
            }
            var aimSuccess = true;             //TODO: make this skill-relevant.

            if (aimSuccess)
            {
                if (target is BoardChar)
                {
                    var hit    = target as BoardChar;
                    var damage = weap.Path("damage").Value *GetDefenseFactor(weap, hit.Character);

                    var overallArmor = 0f;
                    foreach (var targetArmor in hit.Character.GetToken("items").Tokens.Where(t => t.HasToken("equipped")))
                    {
                        var targetArmorItem = NoxicoGame.KnownItems.FirstOrDefault(i => i.Name == targetArmor.Name);
                        if (targetArmorItem == null)
                        {
                            continue;
                        }
                        if (!targetArmorItem.HasToken("armor"))
                        {
                            continue;
                        }
                        if (targetArmorItem.GetToken("armor").Value > overallArmor)
                        {
                            overallArmor = Math.Max(1.5f, targetArmorItem.GetToken("armor").Value);
                        }
                    }
                    if (overallArmor != 0)
                    {
                        damage /= overallArmor;
                    }

                    NoxicoGame.AddMessage(i18n.Format("youhitxfory", hit.Character.GetKnownName(false, false, true), damage, i18n.Pluralize("point", (int)damage)));
                    hit.Hurt(damage, "death_shot", this, false);
                }
                this.Character.IncreaseSkill(skill.Text);
            }

            NoxicoGame.Mode = UserMode.Walkabout;
            Energy         -= 500;
            EndTurn();
        }
Beispiel #2
0
        public void QuickFire(Direction targetDirection)
        {
            NoxicoGame.Modifiers[0] = false;
            if (this.ParentBoard.BoardType == BoardType.Town && !this.ParentBoard.HasToken("combat"))
            {
                return;
            }
            var weapon = Character.CanShoot();

            if (weapon == null)
            {
                return;                 //Don't whine about it.
            }
            var weap = weapon.GetToken("weapon");

            if (weap.HasToken("ammo"))
            {
                var ammoName    = weap.GetToken("ammo").Text;
                var carriedAmmo = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == ammoName);
                if (carriedAmmo == null)
                {
                    return;
                }
                var knownAmmo = NoxicoGame.KnownItems.Find(ki => ki.ID == ammoName);
                if (knownAmmo == null)
                {
                    return;
                }
                knownAmmo.Consume(Character, carriedAmmo);
            }
            else if (weapon.HasToken("charge"))
            {
                var carriedGun = this.Character.GetToken("items").Tokens.Find(ci => ci.Name == weapon.ID && ci.HasToken("equipped"));
                weapon.Consume(Character, carriedGun);
            }

            if (weapon == null)
            {
                return;
            }

            Energy -= 500;

            var x        = this.XPosition;
            var y        = this.YPosition;
            var distance = 0;
            var range    = (int)weapon.Path("weapon/range").Value;
            //var damage = (int)weapon.Path("weapon/damage").Value;
            var skill = weap.GetToken("skill").Text;
            Func <int, int, bool> gotHit = (xPos, yPos) =>
            {
                if (this.ParentBoard.IsSolid(y, x, SolidityCheck.Projectile))
                {
                    FireLine(weapon.Path("effect"), x, y);
                    return(true);
                }
                var hit = this.ParentBoard.Entities.OfType <BoardChar>().FirstOrDefault(e => e.XPosition == x && e.YPosition == y);
                if (hit != null)
                {
                    var damage       = weap.Path("damage").Value *GetDefenseFactor(weap, hit.Character);
                    var overallArmor = 0f;
                    foreach (var targetArmor in hit.Character.GetToken("items").Tokens.Where(t => t.HasToken("equipped")))
                    {
                        var targetArmorItem = NoxicoGame.KnownItems.FirstOrDefault(i => i.Name == targetArmor.Name);
                        if (targetArmorItem == null)
                        {
                            continue;
                        }
                        if (!targetArmorItem.HasToken("armor"))
                        {
                            continue;
                        }
                        if (targetArmorItem.GetToken("armor").Value > overallArmor)
                        {
                            overallArmor = Math.Max(1.5f, targetArmorItem.GetToken("armor").Value);
                        }
                    }
                    if (overallArmor != 0)
                    {
                        damage /= overallArmor;
                    }

                    FireLine(weapon.Path("effect"), x, y);
                    NoxicoGame.AddMessage(i18n.Format("youhitxfory", hit.Character.GetKnownName(false, false, true), damage, i18n.Pluralize("point", (int)Math.Ceiling(damage))));
                    hit.Hurt(damage, "death_shot", this, false);
                    this.Character.IncreaseSkill(skill);
                    return(true);
                }
                return(false);
            };

            if (targetDirection == Direction.East)
            {
                for (x++; x < this.ParentBoard.Width && distance < range; x++, distance++)                 //TODO: confirm if boardspace or screenspace
                {
                    if (gotHit(x, y))
                    {
                        break;
                    }
                }
            }
            else if (targetDirection == Direction.West)
            {
                for (x--; x >= 0 && distance < range; x--, distance++)
                {
                    if (gotHit(x, y))
                    {
                        break;
                    }
                }
            }
            else if (targetDirection == Direction.South)
            {
                for (y++; y < this.ParentBoard.Height && distance < range; y++, distance++)                 //TODO: confirm if boardspace or screenspace
                {
                    if (gotHit(x, y))
                    {
                        break;
                    }
                }
            }
            else if (targetDirection == Direction.North)
            {
                for (y--; y >= 0 && distance < range; y--, distance++)
                {
                    if (gotHit(x, y))
                    {
                        break;
                    }
                }
            }
        }