public void Travel(int citizenID, Region startRegion, Region endRegion, MovingTicket ticket) { using (NoSaveChanges) { var citizen = citizenRepository.GetById(citizenID); citizen.RegionID = endRegion.ID; equipmentRepository.RemoveEquipmentItem(citizen.Entity.EquipmentID.Value, ticket); var trades = tradeRepository.GetTradesAssociatedWithEntity(citizenID) .Where(trade => trade.TradeStatusID == (int)TradeStatusEnum.Ongoing) .ToList(); var citizenLink = EntityLinkCreator.Create(citizen.Entity); var reason = $"{citizenLink} moving into other region"; foreach (var trade in trades) { tradeService.AbortTrade(trade, reason); } citizen.HitPoints -= ticket.HpLoss; } ConditionalSaveChanges(citizenRepository); }
public TravelSummaryViewModel(MethodResult canTravel, Path travelPath, MovingTicket ticket) { CanTravel = canTravel.isSuccess; if (CanTravel == false) { CannotTravelReason = canTravel.ToString(); } if (Math.Abs((travelPath?.Distance ?? 0) - 0) < 0.0001) { Distance = null; } else { Distance = travelPath.Distance; } TicketTravelDistance = ticket.TravelDistance; HpLoss = ticket.HpLoss; }
public JsonResult TravelSummary(int regionID, int?ticketQuality) { if (ticketQuality == null) { return(JsonError("You did not have chosen the ticket!")); } try { var region = regionRepository.GetById(regionID); var entity = SessionHelper.CurrentEntity; if (entity.Citizen == null) { return(JsonError("You are not a citizen!")); } var citizen = entity.Citizen; var startRegion = regionRepository.GetById(citizen.RegionID); var endRegion = regionRepository.GetById(regionID); var ticket = new MovingTicket(1, ticketQuality.Value); var path = regionService.GetPathBetweenRegions(startRegion, endRegion, new DefaultRegionSelector(), new WarsPenaltyCostCalculator(citizen, warRepository, regionService)); var canTravel = travelService.CanTravel(citizen, startRegion, endRegion, ticket); var vm = new TravelSummaryViewModel(canTravel, path, ticket); var content = RenderPartialToString("~/Views/Citizen/TravelSummary.cshtml", vm); return(Json(new JsonTravelSummary(content, canTravel.isSuccess))); } catch (Exception e) { return(JsonError(e)); throw e; //we only logged the error } }
public ActionResult Travel(int regionID, int?ticketQuality) { var entity = SessionHelper.CurrentEntity; if (entity.Citizen == null) { return(RedirectToHomeWithError("You are not a citizen!")); } if (ticketQuality == null) { return(RedirectToHomeWithError("You have not chosen a ticket!")); } var ticket = equipmentRepository .GetEquipmentItem(entity.EquipmentID.Value, (int)ProductTypeEnum.MovingTicket, ticketQuality.Value); if (ticket == null) { return(RedirectBackWithError("You do not have ticket of this quality")); } var movingTicket = new MovingTicket(ticket); var startRegion = regionRepository.GetById(entity.Citizen.RegionID); var endRegion = regionRepository.GetById(regionID); if (travelService.CanTravel(entity.Citizen, startRegion, endRegion, movingTicket).IsError) { return(RedirectBackWithError("You cannot travel here!")); } travelService.Travel(entity.EntityID, startRegion, endRegion, movingTicket); AddInfo(string.Format("You successfuly moved to {0}", endRegion.Name)); return(RedirectToAction("View", new { CitizenID = entity.EntityID })); }
public MethodResult CanTravel(Citizen citizen, Region startRegion, Region endRegion, MovingTicket ticket) { if (citizen.HitPoints < ticket.HpLoss) { return(new MethodResult("You do not have enough HP to travel!")); } if (startRegion.ID == endRegion.ID) { return(new MethodResult("You are actually in this region!")); } var item = citizen.Entity.GetEquipmentItem(ticket, productRepository); if (item.Amount == 0) { return(new MethodResult("You do not have this kind of moving ticket!")); } var path = regionService.GetPathBetweenRegions(startRegion, endRegion, new DefaultRegionSelector(), new WarsPenaltyCostCalculator(citizen, warRepository, regionService)); if (path == null || path.Distance > ticket.TravelDistance) { return(new MethodResult("You cannot travel that distance with this type of moving ticket!")); } return(MethodResult.Success); }