public static CornerData getCornerData(List<EnumWithThresholds> enumsWithThresholds, float leftFrontValue, float rightFrontValue, float leftRearValue, float rightRearValue) { CornerData cornerData = new CornerData(); foreach (EnumWithThresholds enumWithThresholds in enumsWithThresholds) { if (leftFrontValue >= enumWithThresholds.lowerThreshold && leftFrontValue < enumWithThresholds.upperThreshold) { if (rightFrontValue >= enumWithThresholds.lowerThreshold && rightFrontValue < enumWithThresholds.upperThreshold) { if (leftRearValue >= enumWithThresholds.lowerThreshold && leftRearValue < enumWithThresholds.upperThreshold && rightRearValue >= enumWithThresholds.lowerThreshold && rightRearValue < enumWithThresholds.upperThreshold) { // it's 'whatever' all around addCornerStatus(cornerData, enumWithThresholds.e, Corners.ALL); } else { // front sides addCornerStatus(cornerData, enumWithThresholds.e, Corners.FRONTS); } } else if (leftRearValue >= enumWithThresholds.lowerThreshold && leftRearValue < enumWithThresholds.upperThreshold) { addCornerStatus(cornerData, enumWithThresholds.e, Corners.LEFTS); } else { addCornerStatus(cornerData, enumWithThresholds.e, Corners.FRONT_LEFT); } } else if (rightFrontValue >= enumWithThresholds.lowerThreshold && rightFrontValue < enumWithThresholds.upperThreshold) { if (rightRearValue >= enumWithThresholds.lowerThreshold && rightRearValue < enumWithThresholds.upperThreshold) { addCornerStatus(cornerData, enumWithThresholds.e, Corners.RIGHTS); } else { addCornerStatus(cornerData, enumWithThresholds.e, Corners.FRONT_RIGHT); } } else if (leftRearValue >= enumWithThresholds.lowerThreshold && leftRearValue < enumWithThresholds.upperThreshold) { if (rightRearValue >= enumWithThresholds.lowerThreshold && rightRearValue < enumWithThresholds.upperThreshold) { addCornerStatus(cornerData, enumWithThresholds.e, Corners.REARS); } else { addCornerStatus(cornerData, enumWithThresholds.e, Corners.REAR_LEFT); } } else if (rightRearValue >= enumWithThresholds.lowerThreshold && rightRearValue < enumWithThresholds.upperThreshold) { addCornerStatus(cornerData, enumWithThresholds.e, Corners.REAR_RIGHT); } } return cornerData; }
private static void addCornerStatus(CornerData cornerData, Enum e, Corners corners) { if (cornerData.cornersForEachStatus.ContainsValue(corners)) { var item = cornerData.cornersForEachStatus.First(kvp => kvp.Value == corners); cornerData.cornersForEachStatus.Remove(item.Key); } cornerData.cornersForEachStatus.Add(e, corners); }
private void addTyreTempWarningMessages(CornerData.Corners corners, TyreTemp tyreTemp, List<MessageFragment> messageContents) { switch (corners) { case CornerData.Corners.ALL: switch (tyreTemp) { case TyreTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdTyresAllRound)); break; case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotTyresAllRound)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingTyresAllRound)); break; default: break; } break; case CornerData.Corners.FRONTS: switch (tyreTemp) { case TyreTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdFrontTyres)); break; case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotFrontTyres)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingFrontTyres)); break; default: break; } break; case CornerData.Corners.REARS: switch (tyreTemp) { case TyreTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdRearTyres)); break; case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotRearTyres)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingRearTyres)); break; default: break; } break; case CornerData.Corners.LEFTS: switch (tyreTemp) { case TyreTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdLeftTyres)); break; case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotLeftTyres)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingLeftTyres)); break; default: break; } break; case CornerData.Corners.RIGHTS: switch (tyreTemp) { case TyreTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdRightTyres)); break; case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotRightTyres)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingRightTyres)); break; default: break; } break; case CornerData.Corners.FRONT_LEFT: switch (tyreTemp) { case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotLeftFrontTyre)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingLeftFrontTyre)); break; default: break; } break; case CornerData.Corners.FRONT_RIGHT: switch (tyreTemp) { case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotRightFrontTyre)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingRightFrontTyre)); break; default: break; } break; case CornerData.Corners.REAR_LEFT: switch (tyreTemp) { case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotLeftRearTyre)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingLeftRearTyre)); break; default: break; } break; case CornerData.Corners.REAR_RIGHT: switch (tyreTemp) { case TyreTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotRightRearTyre)); break; case TyreTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingRightRearTyre)); break; default: break; } break; } }
private void addTyreConditionWarningMessages(CornerData.Corners corners, TyreCondition tyreCondition, List<MessageFragment> messageContents) { switch (corners) { case CornerData.Corners.ALL: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornAllRound)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredAllRound)); break; default: break; } break; case CornerData.Corners.FRONTS: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornFronts)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredFronts)); break; default: break; } break; case CornerData.Corners.REARS: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornRears)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredRears)); break; default: break; } break; case CornerData.Corners.LEFTS: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornLefts)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredLefts)); break; default: break; } break; case CornerData.Corners.RIGHTS: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornRights)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredRights)); break; default: break; } break; case CornerData.Corners.FRONT_LEFT: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornLeftFront)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredLeftFront)); break; default: break; } break; case CornerData.Corners.FRONT_RIGHT: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornRightFront)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredRightFront)); break; default: break; } break; case CornerData.Corners.REAR_LEFT: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornLeftRear)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredLeftRear)); break; default: break; } break; case CornerData.Corners.REAR_RIGHT: switch (tyreCondition) { case TyreCondition.MAJOR_WEAR: messageContents.Add(MessageFragment.Text(folderWornRightRear)); break; case TyreCondition.WORN_OUT: messageContents.Add(MessageFragment.Text(folderKnackeredRightRear)); break; default: break; } break; } }
private void addBrakeTempWarningMessages(CornerData.Corners corners, BrakeTemp brakeTemp, List<MessageFragment> messageContents) { switch (corners) { case CornerData.Corners.ALL: switch (brakeTemp) { case BrakeTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdBrakesAllRound)); break; case BrakeTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotBrakesAllRound)); break; case BrakeTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingBrakesAllRound)); break; default: break; } break; case CornerData.Corners.FRONTS: switch (brakeTemp) { case BrakeTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdFrontBrakes)); break; case BrakeTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotFrontBrakes)); break; case BrakeTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingFrontBrakes)); break; default: break; } break; case CornerData.Corners.REARS: switch (brakeTemp) { case BrakeTemp.COLD: messageContents.Add(MessageFragment.Text(folderColdRearBrakes)); break; case BrakeTemp.HOT: messageContents.Add(MessageFragment.Text(folderHotRearBrakes)); break; case BrakeTemp.COOKING: messageContents.Add(MessageFragment.Text(folderCookingRearBrakes)); break; default: break; } break; default: break; } }
protected override void triggerInternal(GameStateData previousGameState, GameStateData currentGameState) { if (currentGameState.SessionData.IsNewLap) { timeLeftFrontIsLockedForLap = 0; timeRightFrontIsLockedForLap = 0; timeLeftRearIsLockedForLap = 0; timeRightRearIsLockedForLap = 0; timeLeftFrontIsSpinningForLap = 0; timeRightFrontIsSpinningForLap = 0; timeLeftRearIsSpinningForLap = 0; timeRightRearIsSpinningForLap = 0; if (warnedOnLockingForLap) { totalLockupThresholdForNextLap = totalLockupThresholdForNextLap + 1; } else { totalLockupThresholdForNextLap = initialTotalLapLockupThreshold; } if (warnedOnWheelspinForLap) { totalWheelspinThresholdForNextLap = totalWheelspinThresholdForNextLap + 1; } else { totalWheelspinThresholdForNextLap = initialTotalWheelspinThreshold; } warnedOnLockingForLap = false; warnedOnWheelspinForLap = false; } if (previousGameState != null && currentGameState.Ticks > previousGameState.Ticks) { addLockingAndSpinningData(currentGameState.TyreData, previousGameState.Ticks, currentGameState.Ticks); } if (currentGameState.Now > nextLockingAndSpinningCheck) { if (enableBrakeLockWarnings) { checkLocking(); } if (enableWheelSpinWarnings) { checkWheelSpinning(); } nextLockingAndSpinningCheck = currentGameState.Now.Add(lockingAndSpinningCheckInterval); } if (currentGameState.TyreData.TireWearActive) { leftFrontWearPercent = currentGameState.TyreData.FrontLeftPercentWear; leftRearWearPercent = currentGameState.TyreData.RearLeftPercentWear; rightFrontWearPercent = currentGameState.TyreData.FrontRightPercentWear; rightRearWearPercent = currentGameState.TyreData.RearRightPercentWear; currentTyreConditionStatus = currentGameState.TyreData.TyreConditionStatus; currentTyreTempStatus = currentGameState.TyreData.TyreTempStatus; if (isBrakeTempPeakForLap(currentGameState.TyreData.LeftFrontBrakeTemp, currentGameState.TyreData.RightFrontBrakeTemp, currentGameState.TyreData.LeftRearBrakeTemp, currentGameState.TyreData.RightRearBrakeTemp)) { currentBrakeTempStatus = currentGameState.TyreData.BrakeTempStatus; } completedLaps = currentGameState.SessionData.CompletedLaps; lapsInSession = currentGameState.SessionData.SessionNumberOfLaps; timeInSession = currentGameState.SessionData.SessionRunTime; timeElapsed = currentGameState.SessionData.SessionRunningTime; if (currentGameState.PitData.InPitlane && !currentGameState.SessionData.LeaderHasFinishedRace) { if (currentGameState.SessionData.SessionType == SessionType.Race && enableTyreWearWarnings && !reportedTyreWearForCurrentPitEntry) { //reportCurrentTyreConditionStatus(false, true); // sounds shit... reportedTyreWearForCurrentPitEntry = true; } } else { reportedTyreWearForCurrentPitEntry = false; } if (currentGameState.SessionData.IsNewLap && !currentGameState.PitData.InPitlane && enableTyreWearWarnings && !currentGameState.SessionData.LeaderHasFinishedRace) { reportCurrentTyreConditionStatus(false, false); } if (!currentGameState.PitData.InPitlane && !reportedEstimatedTimeLeft && enableTyreWearWarnings && !currentGameState.SessionData.LeaderHasFinishedRace) { reportEstimatedTyreLife(33, false); } // if the tyre wear has actually decreased, reset the 'reportdEstimatedTyreWear flag - assume this means the tyres have been changed if (previousGameState != null && (currentGameState.TyreData.FrontLeftPercentWear < previousGameState.TyreData.FrontLeftPercentWear || currentGameState.TyreData.FrontRightPercentWear < previousGameState.TyreData.FrontRightPercentWear || currentGameState.TyreData.RearRightPercentWear < previousGameState.TyreData.RearRightPercentWear || currentGameState.TyreData.RearLeftPercentWear < previousGameState.TyreData.RearLeftPercentWear)) { reportedEstimatedTimeLeft = true; } if (enableTyreTempWarnings && !currentGameState.SessionData.LeaderHasFinishedRace && !currentGameState.PitData.InPitlane && currentGameState.SessionData.CompletedLaps >= lapsIntoSessionBeforeTempMessage && currentGameState.SessionData.IsNewLap) { reportCurrentTyreTempStatus(false); } if (!currentGameState.SessionData.LeaderHasFinishedRace && ((checkBrakesAtSector == 1 && currentGameState.SessionData.IsNewLap) || ((currentGameState.SessionData.IsNewSector && currentGameState.SessionData.SectorNumber == checkBrakesAtSector)))) { if (!currentGameState.PitData.InPitlane && currentGameState.SessionData.CompletedLaps >= lapsIntoSessionBeforeTempMessage) { if (enableBrakeTempWarnings) { reportCurrentBrakeTempStatus(false); } } peakBrakeTempForLap = 0; } } }
public override void clearState() { reportedTyreWearForCurrentPitEntry = false; reportedEstimatedTimeLeft = false; leftFrontWearPercent = 0; leftRearWearPercent = 0; rightFrontWearPercent = 0; rightRearWearPercent = 0; completedLaps = 0; lapsInSession = 0; timeInSession = 0; timeElapsed = 0; currentTyreConditionStatus = new CornerData(); currentTyreTempStatus = new CornerData(); currentBrakeTempStatus = new CornerData(); lastTyreTempMessage = null; lastBrakeTempMessage = null; lastTyreConditionMessage = null; peakBrakeTempForLap = 0; timeLeftFrontIsLockedForLap = 0; timeRightFrontIsLockedForLap = 0; timeLeftRearIsLockedForLap = 0; timeRightRearIsLockedForLap = 0; timeLeftFrontIsSpinningForLap = 0; timeRightFrontIsSpinningForLap = 0; timeLeftRearIsSpinningForLap = 0; timeRightRearIsSpinningForLap = 0; totalLockupThresholdForNextLap = initialTotalLapLockupThreshold; totalWheelspinThresholdForNextLap = initialTotalWheelspinThreshold; warnedOnLockingForLap = false; warnedOnWheelspinForLap = false; nextLockingAndSpinningCheck = DateTime.MinValue; }