public double getExpectedDamage() { return getProbabilityToHit() * getExpectedDamageOnHit(); }
String getDebugDescription() { return getAttackType().toString() + " 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()); } }
double calculateKickDamagePotential(Entity enemy, MovePath path, IGame game) { if (!(enemy instanceof Mech)) { return 0.0; } // if they can kick me, and probably hit, they probably will. PhysicalInfo theirKick = new PhysicalInfo(enemy, null, path.getEntity(), new EntityState(path), PhysicalAttackType.RIGHT_KICK, game, getOwner(), true); if (theirKick.getProbabilityToHit() <= 0.5) { return 0.0; } return theirKick.getExpectedDamageOnHit() * theirKick.getProbabilityToHit(); }
double calculateMyKickDamagePotential(MovePath path, Entity enemy, IGame game) { if (!(path.getEntity() instanceof Mech)) { return 0.0; } PhysicalInfo myKick = new PhysicalInfo(path.getEntity(), new EntityState(path), enemy, null, PhysicalAttackType.RIGHT_KICK, game, getOwner(), true); if (myKick.getProbabilityToHit() <= 0.5) { return 0; } return myKick.getExpectedDamageOnHit() * myKick.getProbabilityToHit(); }
testPhysicalInfo.setAttackType(punch); testPhysicalInfo.initDamage(punch, mockShooterState, mockTargetState, true, mockGame); Assert.assertEquals(0.583, testPhysicalInfo.getProbabilityToHit(), TOLERANCE); Assert.assertEquals(5.0, testPhysicalInfo.getMaxDamage(), TOLERANCE); Assert.assertEquals(0.0099, testPhysicalInfo.getExpectedCriticals(), TOLERANCE); testPhysicalInfo.setAttackType(kick); testPhysicalInfo.initDamage(kick, mockShooterState, mockTargetState, true, mockGame); Assert.assertEquals(0.583, testPhysicalInfo.getProbabilityToHit(), TOLERANCE); Assert.assertEquals(10.0, testPhysicalInfo.getMaxDamage(), TOLERANCE); Assert.assertEquals(0.0099, testPhysicalInfo.getExpectedCriticals(), TOLERANCE); testPhysicalInfo.setAttackType(punch); testPhysicalInfo.initDamage(punch, mockShooterState, mockTargetState, true, mockGame); Assert.assertEquals(0.583, testPhysicalInfo.getProbabilityToHit(), TOLERANCE); Assert.assertEquals(10.0, testPhysicalInfo.getMaxDamage(), TOLERANCE); Assert.assertEquals(0.0099, testPhysicalInfo.getExpectedCriticals(), TOLERANCE); testPhysicalInfo.setAttackType(punch); testPhysicalInfo.initDamage(punch, mockShooterState, mockTargetState, true, mockGame); Assert.assertEquals(0.583, testPhysicalInfo.getProbabilityToHit(), TOLERANCE); Assert.assertEquals(10.0, testPhysicalInfo.getMaxDamage(), TOLERANCE); Assert.assertEquals(0.5929, testPhysicalInfo.getExpectedCriticals(), TOLERANCE); Assert.assertEquals(0.0, testPhysicalInfo.getProbabilityToHit(), TOLERANCE); Assert.assertEquals(0.0, testPhysicalInfo.getMaxDamage(), TOLERANCE); Assert.assertEquals(0.0, testPhysicalInfo.getExpectedCriticals(), TOLERANCE); Assert.assertEquals(0.0, testPhysicalInfo.getProbabilityToHit(), TOLERANCE);
setExpectedCriticals(ROLL_TWO * expectedCriticalHitCount * getProbabilityToHit()); setKillProbability(0); setExpectedCriticals(getExpectedCriticals() + hitLocationProbability * getProbabilityToHit()); if ((hitLoc == Mech.LOC_HEAD) || (hitLoc == Mech.LOC_CT)) { setKillProbability(getKillProbability() + hitLocationProbability * getProbabilityToHit()); hitLocationProbability * ProbabilityCalculator.getExpectedCriticalHitCount() * getProbabilityToHit());
double expectedKickDamage = myKick.getExpectedDamageOnHit() * myKick.getProbabilityToHit(); if (expectedKickDamage > damageStructure.physicalDamage) { damageStructure.physicalDamage = expectedKickDamage;
Mockito.doReturn(0.46129).when(testPhysicalInfo).getExpectedCriticals(); Mockito.doReturn(0.02005).when(testPhysicalInfo).getKillProbability(); Mockito.doReturn(0.5).when(testPhysicalInfo).getProbabilityToHit(); testFireControl.calculateUtility(testPhysicalInfo); Assert.assertEquals(baseUtility, testPhysicalInfo.getUtility(), TOLERANCE); Mockito.doReturn(0.46129).when(testPhysicalInfo).getExpectedCriticals(); Mockito.doReturn(0.02005).when(testPhysicalInfo).getKillProbability(); Mockito.doReturn(0.0).when(testPhysicalInfo).getProbabilityToHit(); testFireControl.calculateUtility(testPhysicalInfo); Assert.assertEquals(-10000, testPhysicalInfo.getUtility(), TOLERANCE); Mockito.doReturn(0.46129).when(testPhysicalInfo).getExpectedCriticals(); Mockito.doReturn(0.02005).when(testPhysicalInfo).getKillProbability(); Mockito.doReturn(0.5).when(testPhysicalInfo).getProbabilityToHit(); Mockito.doReturn(mockPilot).when(testPhysicalInfo).getTarget(); testFireControl.calculateUtility(testPhysicalInfo); Mockito.doReturn(0.46129).when(testPhysicalInfo).getExpectedCriticals(); Mockito.doReturn(0.12005).when(testPhysicalInfo).getKillProbability(); Mockito.doReturn(0.5).when(testPhysicalInfo).getProbabilityToHit(); testFireControl.calculateUtility(testPhysicalInfo); Assert.assertEquals(25.6154, testPhysicalInfo.getUtility(), TOLERANCE); Mockito.doReturn(0.46129).when(testPhysicalInfo).getExpectedCriticals(); Mockito.doReturn(0.01005).when(testPhysicalInfo).getKillProbability(); Mockito.doReturn(0.5).when(testPhysicalInfo).getProbabilityToHit(); testFireControl.calculateUtility(testPhysicalInfo); Assert.assertEquals(20.1154, testPhysicalInfo.getUtility(), TOLERANCE);
/** * calculates the 'utility' of a physical action. * * @param physicalInfo The {@link PhysicalInfo} to be calculated. */ void calculateUtility(final PhysicalInfo physicalInfo) { // If we can't hit, there's no point. if (0.0 >= physicalInfo.getProbabilityToHit()) { physicalInfo.setUtility(-10000); return; } double utility = DAMAGE_UTILITY * physicalInfo.getExpectedDamage(); utility += CRITICAL_UTILITY * physicalInfo.getExpectedCriticals(); utility += KILL_UTILITY * physicalInfo.getKillProbability(); utility *= calcTargetPotentialDamageMultiplier(physicalInfo.getTarget()); utility -= (physicalInfo.getTarget() instanceof MechWarrior) ? EJECTED_PILOT_DISUTILITY : 0; utility += calcCommandUtility(physicalInfo.getTarget()); utility += calcStrategicBuildingTargetUtility(physicalInfo.getTarget()); utility += calcPriorityUnitTargetUtility(physicalInfo.getTarget()); utility -= calcCivilianTargetDisutility(physicalInfo.getTarget()); physicalInfo.setUtility(utility); }