/** * Models the probability of each individual weapon getting a kill shot. * We treat each weapon shot as a Bernoulli trial and compute the probiblity * of the target surviving each shot. We can then take 1 - surviveChance to * get the chance of getting a kill. This model doesn't take into * consideration multiple weapons hitting the same location. * * @return The odds of getting a kill based on the odds of each individual * weapon getting a kill. The result will be between 0 and 1. */ synchronized double getKillProbability() { double surviveProbability = 1; for (WeaponFireInfo weaponFireInfo : this) { surviveProbability *= 1 - weaponFireInfo.getKillProbability(); } return 1 - surviveProbability; }
String getDebugDescription() { return getWeapon().getName() + " P. Hit: " + LOG_PER.format(getProbabilityToHit()) + ", Max Dam: " + LOG_DEC.format(getMaxDamage()) + ", Exp. Dam: " + LOG_DEC.format(getExpectedDamageOnHit()) + ", Num Crits: " + LOG_DEC.format(getExpectedCriticals()) + ", Kill Prob: " + LOG_PER.format(getKillProbability()); } }
@Test public void testGetKillProbability() { Mockito.when(mockWeaponFireInfoMG.getKillProbability()).thenReturn(0.0); Mockito.when(mockWeaponFireInfoPPC.getKillProbability()).thenReturn(0.0024); Mockito.when(mockWeaponFireInfoERML.getKillProbability()).thenReturn(0.0); //noinspection PointlessArithmeticExpression double expected = 1 - ((1 - 0) * (1 - 0.0024) * (1 - 0)); Assert.assertEquals(expected, testFiringPlan.getKillProbability(), TOLERANCE); Mockito.when(mockWeaponFireInfoMG.getKillProbability()).thenReturn(1.0); Mockito.when(mockWeaponFireInfoPPC.getKillProbability()).thenReturn(0.0024); Mockito.when(mockWeaponFireInfoERML.getKillProbability()).thenReturn(0.0); //noinspection PointlessArithmeticExpression expected = 1 - ((1 - 1) * (1 - 0.0024) * (1 - 0)); Assert.assertEquals(expected, testFiringPlan.getKillProbability(), TOLERANCE); Mockito.when(mockWeaponFireInfoMG.getKillProbability()).thenReturn(0.5); Mockito.when(mockWeaponFireInfoPPC.getKillProbability()).thenReturn(0.5); Mockito.when(mockWeaponFireInfoERML.getKillProbability()).thenReturn(0.5); expected = 1 - ((1 - 0.5) * (1 - 0.5) * (1 - 0.5)); Assert.assertEquals(expected, testFiringPlan.getKillProbability(), TOLERANCE); }
setExpectedCriticals(getExpectedCriticals() + (hitLocationProbability * getProbabilityToHit())); if (Mech.LOC_CT == hitLocation) { setKillProbability(getKillProbability() + (hitLocationProbability * getProbabilityToHit())); } else if ((Mech.LOC_HEAD == hitLocation) && (Mech.COCKPIT_TORSO_MOUNTED != targetMech.getCockpitType())) { setKillProbability(getKillProbability() + (hitLocationProbability * getProbabilityToHit()));
TestCase.assertEquals(expectedProbabilityToHit, testWeaponFireInfo.getProbabilityToHit(), DELTA); TestCase.assertEquals(expectedCriticals, testWeaponFireInfo.getExpectedCriticals(), DELTA); TestCase.assertEquals(expectedKill, testWeaponFireInfo.getKillProbability(), DELTA); TestCase.assertEquals(expectedProbabilityToHit, testWeaponFireInfo.getProbabilityToHit(), DELTA); TestCase.assertEquals(expectedCriticals, testWeaponFireInfo.getExpectedCriticals(), DELTA); TestCase.assertEquals(expectedKill, testWeaponFireInfo.getKillProbability(), DELTA); TestCase.assertEquals(expectedProbabilityToHit, testWeaponFireInfo.getProbabilityToHit(), DELTA); TestCase.assertEquals(expectedCriticals, testWeaponFireInfo.getExpectedCriticals(), DELTA); TestCase.assertEquals(expectedKill, testWeaponFireInfo.getKillProbability(), DELTA); TestCase.assertEquals(expectedProbabilityToHit, testWeaponFireInfo.getProbabilityToHit(), DELTA); TestCase.assertEquals(expectedCriticals, testWeaponFireInfo.getExpectedCriticals(), DELTA); TestCase.assertEquals(expectedKill, testWeaponFireInfo.getKillProbability(), DELTA); TestCase.assertEquals(expectedProbabilityToHit, testWeaponFireInfo.getProbabilityToHit(), DELTA); TestCase.assertEquals(expectedCriticals, testWeaponFireInfo.getExpectedCriticals(), DELTA); TestCase.assertEquals(expectedKill, testWeaponFireInfo.getKillProbability(), DELTA);
Mockito.when(mockPPCFireInfo.getExpectedDamageOnHit()).thenReturn(10.0); Mockito.when(mockPPCFireInfo.getExpectedCriticals()).thenReturn(0.46); Mockito.when(mockPPCFireInfo.getKillProbability()).thenReturn(0.002); Mockito.when(mockPPCFireInfo.getWeapon()).thenReturn(mockPPC); Mockito.when(mockPPCFireInfo.getShooter()).thenReturn(mockShooter); Mockito.when(mockMLFireInfo.getExpectedDamageOnHit()).thenReturn(5.0); Mockito.when(mockMLFireInfo.getExpectedCriticals()).thenReturn(0.0); Mockito.when(mockMLFireInfo.getKillProbability()).thenReturn(0.0); Mockito.when(mockMLFireInfo.getWeapon()).thenReturn(mockML); Mockito.when(mockMLFireInfo.getShooter()).thenReturn(mockShooter); Mockito.when(mockLRMFireInfo.getExpectedDamageOnHit()).thenReturn(3.0); Mockito.when(mockLRMFireInfo.getExpectedCriticals()).thenReturn(0.0); Mockito.when(mockLRMFireInfo.getKillProbability()).thenReturn(0.0); Mockito.when(mockLRMFireInfo.getWeapon()).thenReturn(mockLRM5); Mockito.when(mockLRMFireInfo.getShooter()).thenReturn(mockShooter); Mockito.when(mockMGFireInfo.getExpectedDamageOnHit()).thenReturn(2.0); Mockito.when(mockMGFireInfo.getExpectedCriticals()).thenReturn(0.0); Mockito.when(mockMGFireInfo.getKillProbability()).thenReturn(0.0); Mockito.when(mockMGFireInfo.getWeapon()).thenReturn(mockMG); Mockito.when(mockMGFireInfo.getShooter()).thenReturn(mockShooter);