public Battle CreateBattle(War war, int regionID, WarSideEnum attackingSide) { using (var transaction = transactionScopeProvider.CreateTransactionScope()) { var region = regionRepository.GetById(regionID); double startingWallHealth = CalculateWallHealth(region); var battle = new Battle() { RegionID = regionID, WallHealth = (decimal)startingWallHealth, War = war, Active = true, StartTime = DateTime.Now, StartDay = GameHelper.CurrentDay, AttackerInitiatedBattle = attackingSide == WarSideEnum.Attacker }; var gold = warService.GetGoldNeededToStartBattle(war, region); MakeBattleStartTransaction(war, war.GetMainCountry(attackingSide), gold); SendMessageAboutAttack(war, attackingSide, region); war.AttackerOfferedSurrender = null; battleRepository.Add(battle); ConditionalSaveChanges(battleRepository); battleEventService.AddEvent(battle, BattleStatusEnum.Started); transaction?.Complete(); return(battle); } }
public JsonResult Fight(int battleID, int weaponQuality, bool isAttacker) { try { var citizen = SessionHelper.CurrentEntity.Citizen; var battle = battleRepository.GetById(battleID); if (battle == null) { return(JsonError("Battle does not exist!")); } if (citizen == null) { return(JsonError("You are not a citizen!")); } if (citizen.HitPoints < 30) { return(JsonError("You must have more than 30 HP to fight!")); } if (weaponQuality > 0) { if (citizen.Entity.GetEquipmentItem(ProductTypeEnum.Weapon, weaponQuality, productRepository).Amount == 0) { return(JsonError("You do not have such weapon in inventory!")); } } if (battle.War.IsTrainingWar == false && battle.GetTimeLeft(GameHelper.CurrentDay).TotalSeconds < 0) { return(JsonError("You cannot take part in the fight!")); } WarSideEnum warSide = WarSideEnum.Attacker; if (isAttacker == false) { warSide = WarSideEnum.Defender; } if (warService.CanFightAs(battle, battle.War, citizen, warSide) == false) { return(JsonError("You cannot fight in that battle!")); } var damage = battleService.CalculateDamage(citizen, battle, weaponQuality, isAttacker); battleService.ParticipateInBattle(citizen, battle, isAttacker, weaponQuality); return(Json(new JsonFightModel(damage, citizen.HitPoints))); } catch (Exception e) { return(JsonDebugError(e)); } }
public static Country GetMainCountry(this War war, WarSideEnum warSide) { if (warSide == WarSideEnum.None) { return(null); } return(GetMainCountry(war, warSide == WarSideEnum.Attacker)); }
public virtual void SendMessageAboutAttack(War war, WarSideEnum attackingSide, Region region) { var attacker = attackingSide == WarSideEnum.Attacker ? war.Attacker.Entity : war.Defender.Entity; var attackerLink = EntityLinkCreator.Create(attacker).ToHtmlString(); var regionLink = RegionLinkCreator.Create(region).ToHtmlString(); var warLink = WarLinkCreator.Create(war).ToHtmlString(); string message = $"{attackerLink} attacked {regionLink} in {warLink}!"; warService.SendMessageToEveryoneInWar(war, message, attacker.EntityID); }
public bool CanFightAs(Battle battle, War war, Citizen citizen, WarSideEnum warSide) { if (citizen == null) { return(false); } if (war == null) { return(false); } if (war.IsTrainingWar) { return(true); } var fightingSide = GetFightingSide(war, citizen); if (battle.AttackerInitiatedBattle == false) { if (warSide == WarSideEnum.Attacker) { warSide = WarSideEnum.Defender; } else { warSide = WarSideEnum.Attacker; } } if (fightingSide == warSide || fightingSide == WarSideEnum.Both) { return(true); } return(false); }