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(); }
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; } } } }