private void MarkSecondDelivery(ScoreCardFrame scoreCardFrame, DeliveryInputViewModel deliveryInputViewModel) { if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.OpenFrame) { scoreCardFrame.SecondDeliveryMark = UserDeliveryMessages.OPEN_FRAME_DELIVERY_CODE; scoreCardFrame.SecondDeliveryScore = 0; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Foul) { scoreCardFrame.SecondDeliveryScore = 0; scoreCardFrame.SecondDeliveryMark = UserDeliveryMessages.FOUL_DELIVERY_CODE; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Spare) { //score the next time mark as / scoreCardFrame.SecondDeliveryMark = UserDeliveryMessages.SPARE_DELIVERY_CODE; int firstScore = scoreCardFrame.FirstDeliveryScore; scoreCardFrame.SecondDeliveryScore = 10 - firstScore; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Split) { //simply save the score and prepend pins down with S scoreCardFrame.SecondDeliveryMark = UserDeliveryMessages.SPLIT_DELIVERY_CODE + deliveryInputViewModel.SelectedPinsDownCount; scoreCardFrame.SecondDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.StandardRoll) { scoreCardFrame.SecondDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount; scoreCardFrame.SecondDeliveryMark = deliveryInputViewModel.SelectedPinsDownCount.ToString(); } }
public void SaveDelivery(ScoreCardViewModel scoreCardViewModel, DeliveryInputViewModel deliveryInputViewModel) { ScoreCardFrame currentFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex] .ScoreCardFrames[scoreCardViewModel.CurrentFrameId]; ScoreCardFrame previousFrame = new ScoreCardFrame(); if (scoreCardViewModel.CurrentFrameId > 0) { previousFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex] .ScoreCardFrames[scoreCardViewModel.CurrentFrameId - 1]; } ScoreCardFrame twoFramesBackFrame = new ScoreCardFrame(); if (scoreCardViewModel.CurrentFrameId > 1) { twoFramesBackFrame = scoreCardViewModel.ScoreCardRows[scoreCardViewModel.CurrentScoreCardRowIndex] .ScoreCardFrames[scoreCardViewModel.CurrentFrameId - 2]; } if (deliveryInputViewModel.CurrDeliveryInFrameIndex == 0 && deliveryInputViewModel.FrameIndex < 9) { MarkFirstDelivery(currentFrame, deliveryInputViewModel); } else if (deliveryInputViewModel.CurrDeliveryInFrameIndex == 1 && deliveryInputViewModel.FrameIndex < 9) { MarkSecondDelivery(currentFrame, deliveryInputViewModel); ScorePrevFrameForStrikesAndSpares(twoFramesBackFrame, previousFrame, currentFrame, deliveryInputViewModel); ScoreRegularFrames(previousFrame, currentFrame, deliveryInputViewModel); } if (deliveryInputViewModel.FrameIndex == 9 && deliveryInputViewModel.CurrDeliveryInFrameIndex == 0) { MarkFirstDelivery(currentFrame, deliveryInputViewModel); } else if (deliveryInputViewModel.FrameIndex == 9 && deliveryInputViewModel.CurrDeliveryInFrameIndex == 1) { MarkSecondDelivery(currentFrame, deliveryInputViewModel); if (deliveryInputViewModel.FrameIndex == 9 && deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Strike && deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Spare) { ScoreTenthFrame(previousFrame, currentFrame, deliveryInputViewModel); scoreCardViewModel.IsUserGameComplete = true; } } else if (deliveryInputViewModel.FrameIndex == 9 && deliveryInputViewModel.CurrDeliveryInFrameIndex == 2) { MarkTenthFrameBonusDeliveries(currentFrame, deliveryInputViewModel); ScoreTenthFrame(previousFrame, currentFrame, deliveryInputViewModel); scoreCardViewModel.IsUserGameComplete = true; } }
public IActionResult BowlingDeliveryInput(DeliveryInputViewModel deliveryInputViewModel) { //using session state in place of database for small demo and persistence between pages. ScoreCardViewModel scoreCardViewModel = JsonConvert.DeserializeObject <ScoreCardViewModel>(HttpContext.Session.GetString("GameFullData")); //validation failed, selection and field info persists, dpdn collections must be reloaded... if (!ModelState.IsValid) { DeliveryInputViewModel invalidViewModel = LoadDeliveryInputViewModel(deliveryInputViewModel.CurrentRowIndex, deliveryInputViewModel.FrameIndex, deliveryInputViewModel.CurrDeliveryInFrameIndex, deliveryInputViewModel.PreviousDeliveryTypeCode, deliveryInputViewModel.PreviousDeliveryPinsDown); return(View(invalidViewModel)); } _deliveryService.SaveDelivery(scoreCardViewModel, deliveryInputViewModel); //for non10th frames where first roll is not a strike //hand off values to cache collection and increment delivery/roll index to never exceed 0 or 1 if (scoreCardViewModel.CurrentFrameId < 9 && deliveryInputViewModel.CurrDeliveryInFrameIndex == 0 && deliveryInputViewModel.SelectedDeliveryCode != (int)FrameStatusEnum.Strike) { scoreCardViewModel.PreviousPinDownCount = deliveryInputViewModel.SelectedPinsDownCount; scoreCardViewModel.PreviousDeliveryType = deliveryInputViewModel.SelectedDeliveryCode; scoreCardViewModel.CurrentDeliveryInFrameIndex = deliveryInputViewModel.CurrDeliveryInFrameIndex == 1 ? 0 : ++deliveryInputViewModel.CurrDeliveryInFrameIndex; }//strike or second roll for non10th frames, zero out roll data and increment frame index; else if (scoreCardViewModel.CurrentFrameId < 9 && (deliveryInputViewModel.CurrDeliveryInFrameIndex == 1 || deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Strike)) { scoreCardViewModel.PreviousPinDownCount = 0; scoreCardViewModel.PreviousDeliveryType = 0; scoreCardViewModel.CurrentDeliveryInFrameIndex = 0; ++scoreCardViewModel.CurrentFrameId; } else//handle 10th frame, never exceed 2 in roll index and pass selections to cache { scoreCardViewModel.PreviousPinDownCount = deliveryInputViewModel.SelectedPinsDownCount; scoreCardViewModel.PreviousDeliveryType = deliveryInputViewModel.SelectedDeliveryCode; scoreCardViewModel.CurrentDeliveryInFrameIndex = deliveryInputViewModel.CurrDeliveryInFrameIndex == 3 ? 0 : ++deliveryInputViewModel.CurrDeliveryInFrameIndex; } HttpContext.Session.SetString("GameFullData", JsonConvert.SerializeObject(scoreCardViewModel)); return(RedirectToAction("BowlingGame")); }
private void ScorePrevFrameForStrikesAndSpares(ScoreCardFrame twoFramesBackFrame, ScoreCardFrame prevScoreCardFrame, ScoreCardFrame currScoreCardFrame, DeliveryInputViewModel deliveryInputViewModel) { if (prevScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE)) { prevScoreCardFrame.FrameCumulativeScore = twoFramesBackFrame.FrameCumulativeScore + 10 + currScoreCardFrame.FirstDeliveryScore + currScoreCardFrame.SecondDeliveryScore; } else if (prevScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE)) { prevScoreCardFrame.FrameCumulativeScore = twoFramesBackFrame.FrameCumulativeScore + 10 + currScoreCardFrame.FirstDeliveryScore; } }
private void MarkFirstDelivery(ScoreCardFrame cardFrame, DeliveryInputViewModel deliveryInputViewModel) { if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.OpenFrame) { cardFrame.FirstDeliveryMark = UserDeliveryMessages.OPEN_FRAME_DELIVERY_CODE; cardFrame.FirstDeliveryScore = 0; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Foul) { cardFrame.FirstDeliveryScore = 0; cardFrame.FirstDeliveryMark = UserDeliveryMessages.FOUL_DELIVERY_CODE; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Split) { cardFrame.FirstDeliveryMark = UserDeliveryMessages.SPLIT_DELIVERY_CODE + deliveryInputViewModel.SelectedPinsDownCount; cardFrame.FirstDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount; } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Strike) { if (deliveryInputViewModel.FrameIndex == 9) { cardFrame.FirstDeliveryScore = 10; cardFrame.FirstDeliveryMark = UserDeliveryMessages.STRIKE_DELIVERY_CODE; } else { cardFrame.SecondDeliveryScore = 10; cardFrame.SecondDeliveryMark = UserDeliveryMessages.STRIKE_DELIVERY_CODE; } } else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.StandardRoll) { cardFrame.FirstDeliveryScore = deliveryInputViewModel.SelectedPinsDownCount; cardFrame.FirstDeliveryMark = deliveryInputViewModel.SelectedPinsDownCount.ToString(); } }
private DeliveryInputViewModel LoadDeliveryInputViewModel(int currRowIndex, int currFrameId, int currDeliveryInFrameIndex, int prevDeliveryType, int prevPinsDown) { ScoreCardViewModel scoreCardViewModel = JsonConvert.DeserializeObject <ScoreCardViewModel>(HttpContext.Session.GetString("GameFullData")); DeliveryInputViewModel deliveryInputViewModel = new DeliveryInputViewModel(); deliveryInputViewModel.FrameIndex = currFrameId; deliveryInputViewModel.PreviousDeliveryPinsDown = prevPinsDown; deliveryInputViewModel.PreviousDeliveryTypeText = _deliveryService.GetDeliveryStatusText(prevDeliveryType); deliveryInputViewModel.FirstName = scoreCardViewModel.ScoreCardRows[currRowIndex].FirstName; deliveryInputViewModel.LastName = scoreCardViewModel.ScoreCardRows[currRowIndex].LastName; deliveryInputViewModel.CurrentRowIndex = currRowIndex; deliveryInputViewModel.PreviousDeliveryTypeCode = prevDeliveryType; if (currFrameId < 10) { deliveryInputViewModel.CurrDeliveryInFrameIndex = currDeliveryInFrameIndex; } deliveryInputViewModel.DeliveryTypes = new List <SelectListItem>() { new SelectListItem() { Text = "Split", Value = ((int)FrameStatusEnum.Split).ToString() }, new SelectListItem() { Text = "Missed Pins", Value = ((int)FrameStatusEnum.OpenFrame).ToString() }, new SelectListItem() { Text = "Foul", Value = ((int)FrameStatusEnum.Foul).ToString() }, new SelectListItem() { Text = "Standard Roll", Value = ((int)FrameStatusEnum.StandardRoll).ToString() } }; //first 9 frames should offer a strike only on first roll/delivery, as that ends the frame if (prevDeliveryType == 0 && currFrameId < 9) { deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem() { Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString() }); }//tenth frame should provide option for all strikes else if (prevDeliveryType != 0 && currFrameId < 9)//only 2nd roll should provide a spare option { deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem() { Text = "Spare", Value = ((int)FrameStatusEnum.Spare).ToString() }); } else if (currFrameId == 9) {// if (currDeliveryInFrameIndex == 0) { deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem() { Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString() }); } else { if (prevDeliveryType == (int)FrameStatusEnum.Strike || prevDeliveryType == (int)FrameStatusEnum.Spare) { deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem() { Text = "Strike", Value = ((int)FrameStatusEnum.Strike).ToString() }); } else { deliveryInputViewModel.DeliveryTypes.Add(new SelectListItem() { Text = "Spare", Value = ((int)FrameStatusEnum.Spare).ToString() }); } } } deliveryInputViewModel.CountOfPinsAvailable = new List <SelectListItem>(); //can't be null, but not sure if populating is needed given js manipulation for (int i = 1; i < 10 - prevPinsDown; i++) { deliveryInputViewModel.CountOfPinsAvailable.Add( new SelectListItem() { Text = i.ToString(), Value = i.ToString() }); } return(deliveryInputViewModel); }
private void ScoreRegularFrames(ScoreCardFrame prevScoreCardFrame, ScoreCardFrame currScoreCardFrame, DeliveryInputViewModel deliveryInputViewModel) { if (currScoreCardFrame.FrameId == 0 & !currScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE) && !currScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE)) { currScoreCardFrame.FrameCumulativeScore = currScoreCardFrame.FirstDeliveryScore + currScoreCardFrame.SecondDeliveryScore; //return; } else if (!currScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE) && !currScoreCardFrame.SecondDeliveryMark.Equals(UserDeliveryMessages.SPARE_DELIVERY_CODE)) { currScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FrameCumulativeScore + currScoreCardFrame.FirstDeliveryScore + currScoreCardFrame.SecondDeliveryScore; } //if (prevScoreCardFrame.FirstDeliveryMark.Equals(UserDeliveryMessages.STRIKE_DELIVERY_CODE)) //{ // prevScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FirstDeliveryScore + // currScoreCardFrame.FirstDeliveryScore + // currScoreCardFrame.SecondDeliveryScore; //} //else if (deliveryInputViewModel.SelectedDeliveryCode == (int)FrameStatusEnum.Spare) //{ // prevScoreCardFrame.FrameCumulativeScore = prevScoreCardFrame.FirstDeliveryScore + // currScoreCardFrame.FirstDeliveryScore; //} }
private void ScoreTenthFrame(ScoreCardFrame prevFrame, ScoreCardFrame tenthFrame, DeliveryInputViewModel deliveryInputViewModel) { tenthFrame.FrameCumulativeScore = prevFrame.FrameCumulativeScore + tenthFrame.FirstDeliveryScore + tenthFrame.SecondDeliveryScore + tenthFrame.BonusDeliveryScore; }