@@ -1107,17 +1107,59 @@ public Region getRegionAt(final Position position) {
11071107//
11081108// public TilePosition getBuildLocation(UnitType type, TilePosition desiredPosition, int maxRange, boolean creep);
11091109//
1110- // public int getDamageFrom(UnitType fromType, UnitType toType, Player fromPlayer);
1111- //
1112- // public int getDamageFrom(UnitType fromType, UnitType toType);
1113- //
1114- // public int getDamageFrom(UnitType fromType, UnitType toType, Player fromPlayer, Player toPlayer);
1115- //
1116- // public int getDamageTo(UnitType toType, UnitType fromType, Player toPlayer);
1117- //
1118- // public int getDamageTo(UnitType toType, UnitType fromType);
1119- //
1120- // public int getDamageTo(UnitType toType, UnitType fromType, Player toPlayer, Player fromPlayer);
1110+
1111+ private static final int damageRatio [][] = {
1112+ // Ind, Sml, Med, Lrg, Non, Unk
1113+ { 0 , 0 , 0 , 0 , 0 , 0 }, // Independent
1114+ { 0 , 128 , 192 , 256 , 0 , 0 }, // Explosive
1115+ { 0 , 256 , 128 , 64 , 0 , 0 }, // Concussive
1116+ { 0 , 256 , 256 , 256 , 0 , 0 }, // Normal
1117+ { 0 , 256 , 256 , 256 , 0 , 0 }, // Ignore_Armor
1118+ { 0 , 0 , 0 , 0 , 0 , 0 }, // None
1119+ { 0 , 0 , 0 , 0 , 0 , 0 } // Unknown
1120+ };
1121+
1122+ private int getDamageFromImpl (UnitType fromType , UnitType toType , Player fromPlayer , Player toPlayer ) {
1123+ // Retrieve appropriate weapon
1124+ final WeaponType wpn = toType .isFlyer () ? fromType .airWeapon () : fromType .groundWeapon ();
1125+ if ( wpn == WeaponType .None || wpn == WeaponType .Unknown )
1126+ return 0 ;
1127+
1128+ // Get initial weapon damage
1129+ int dmg = fromPlayer != null ? fromPlayer .damage (wpn ) : wpn .damageAmount () * wpn .damageFactor ();
1130+
1131+ // If we need to calculate using armor
1132+ if ( wpn .damageType () != DamageType .Ignore_Armor && toPlayer != null ) {
1133+ dmg -= Math .min (dmg , toPlayer .armor (toType ));
1134+ }
1135+
1136+ return dmg * damageRatio [wpn .damageType ().id ][toType .size ().id ] / 256 ;
1137+ }
1138+
1139+
1140+ public int getDamageFrom (final UnitType fromType , final UnitType toType , final Player fromPlayer ) {
1141+ return getDamageFrom (fromType , toType , fromPlayer , null );
1142+ }
1143+
1144+ public int getDamageFrom (final UnitType fromType , UnitType toType ) {
1145+ return getDamageFrom (fromType , toType , null );
1146+ }
1147+
1148+ public int getDamageFrom (final UnitType fromType , final UnitType toType , final Player fromPlayer , final Player toPlayer ) {
1149+ return getDamageFromImpl (fromType , toType , fromPlayer , toPlayer == null ? self () : toPlayer );
1150+ }
1151+
1152+ public int getDamageTo (final UnitType toType , final UnitType fromType , final Player toPlayer ){
1153+ return getDamageTo (toType , fromType , toPlayer , null );
1154+ }
1155+
1156+ public int getDamageTo (final UnitType toType , final UnitType fromType ) {
1157+ return getDamageTo (toType , fromType , null );
1158+ }
1159+
1160+ public int getDamageTo (final UnitType toType , final UnitType fromType , final Player toPlayer , final Player fromPlayer ) {
1161+ return getDamageFromImpl (fromType , toType , fromPlayer == null ? self () : fromPlayer , toPlayer );
1162+ }
11211163
11221164 //Since 4.2.0
11231165 public int getRandomSeed () {
0 commit comments