PK.META-INF/MANIFEST.MFMLK-. K-*ϳR03PKPK .iispoon/ripple/MyFireData.class-Jspoon/ripple/MyFireDatajava/lang/Object_xD_y _velocity_timeJ_predictResults[Lspoon/predict/ShootingOrder; _victimListLjava/util/ArrayList;_nameLjava/lang/String;7(DDDJ[Lspoon/predict/ShootingOrder;Ljava/lang/String;)VCode()V          java/util/ArrayList! "  $  &LineNumberTableLocalVariableTablethisLspoon/ripple/MyFireData;posxposyvelocitytimeresultsNameget_time()J get_velocity()Dget_xget_yget_predictResults ()[Lspoon/predict/ShootingOrder;isVictim(Ljava/lang/String;)Zcontains(Ljava/lang/Object;)Z <= ">name addVictim(Ljava/lang/String;)Vadd C= "Dget_name()Ljava/lang/String; SourceFileMyFireData.java!   2**'*)*** *"Y#%* '(& ! "#$% &+'1()H2*+2,2-2.2/ 20 21 23/*(+) *+45/*(/) *+65/*(3) *+75/*(7) *+89/* (;) *+:;= *%+?(?) *+ @ABB *%+EW( D F) *+ @FG/*'(I) *+HIPK .l8MMspoon/ripple/MyFireData.java/* * Created on 2003. 6. 26. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.ripple; import java.util.ArrayList; import spoon.predict.ShootingOrder; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class MyFireData { double _x, _y, _velocity; long _time; ShootingOrder[] _predictResults; ArrayList _victimList; String _name; public MyFireData( double posx, double posy, double velocity, long time, ShootingOrder[] results, String Name) { _x = posx; _y = posy; _velocity = velocity; _time = time; _predictResults = results; _victimList = new ArrayList(); _name = Name; } public long get_time() { return _time; } public double get_velocity() { return _velocity; } public double get_x() { return _x; } public double get_y() { return _y; } public ShootingOrder[] get_predictResults() { return _predictResults; } public boolean isVictim(String name) { return _victimList.contains(name); } public void addVictim(String name) { _victimList.add(name); } public String get_name() { return _name; } } PK .DJJ spoon/ripple/RippleManager.class-spoon/ripple/RippleManagerjava/lang/Object _enemymgrLspoon/enemy/EnemyInfoManager; _predictmgr Lspoon/predict/PredictorManager; MyFireHistoryLjava/util/ArrayList;()VCode  spoon/IrYoungenemymgr     predictormgr    java/util/ArrayList  LineNumberTableLocalVariableTablethisLspoon/ripple/RippleManager;reportFireBullet(Lrobocode/Bullet;)Vspoon/ripple/MyFireData'spoon/util/MyInfo)getX()D +, *-getY /, *0robocode/Bullet2 getVelocity 4, 35spoon/util/GameInfo7getTime()J 9: 8;spoon/predict/PredictorManager=getAllPredictResult ()[Lspoon/predict/ShootingOrder; ?@ >Aspoon/tactician/TacticianC get_target()Lspoon/enemy/EnemyInfo; EF DGspoon/enemy/EnemyInfoIget_id()Ljava/lang/String; KL JM7(DDDJ[Lspoon/predict/ShootingOrder;Ljava/lang/String;)V O (Padd(Ljava/lang/Object;)Z RS TbulletLrobocode/Bullet;checkHitToEnemytoArray(([Ljava/lang/Object;)[Ljava/lang/Object; YZ [[Lspoon/ripple/MyFireData;]spoon/enemy/EnemyInfoManager_getEnemiesArray()[Lspoon/enemy/EnemyInfo; ab `cget_x e, (fget_y h, (i get_velocity k, (lget_time n: (ogetLongerDistanceToWall(DD)D qr sjava/util/AbstractCollectionuremove wS vxisAlive()Z z{ J| Jf Jispoon/util/MathUtilDistance(DDDD)D @4onRippleHitEnemy/(Ljava/lang/String;Lspoon/ripple/MyFireData;J)V ` firehitorysenemies[Lspoon/enemy/EnemyInfo;nowtimeJiItmpxDtmpyflyingdistancejdistance diffdistance getBattleW , 8@ getBattleH , 8xycheckHitByEnemygetShootingDataArray()[Lspoon/enemy/ShootingData; Jspoon/enemy/ShootingData f i l get_stamptime : removeShootigData(Lspoon/enemy/ShootingData;)V JonRippleHitFangs0(Ljava/lang/String;Lspoon/enemy/ShootingData;J)V `firesspoon/enemy/ShootingData;checkRippleHit X   SourceFileRippleManager.java!   X****Y !!" #$%" #$%& ** (Y.1+6<*BHNQUW!. ()* +,-./")%()0"*#$*VWX  * (\^L*dM3@:AD@E?GCTD`EcHiJsNuOwP~QMLSUXYZ[XH9a"p #$]*3Gy fZ , % qr p,&o &gG(o (gI&(!d efg$h",,   *dL+Preferences>Java>Code Generation>Code and Comments */ package spoon.ripple; import java.util.ArrayList; import robocode.Bullet; import spoon.IrYoung; import spoon.enemy.EnemyInfo; import spoon.enemy.EnemyInfoManager; import spoon.enemy.ShootingData; import spoon.predict.PredictorManager; import spoon.tactician.Tactician; import spoon.util.GameInfo; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class RippleManager { EnemyInfoManager _enemymgr; PredictorManager _predictmgr; private ArrayList MyFireHistory; public RippleManager() { _enemymgr = IrYoung.enemymgr; _predictmgr = IrYoung.predictormgr; MyFireHistory = new ArrayList(); } public void reportFireBullet(Bullet bullet) { MyFireHistory.add( new MyFireData( MyInfo.getX(), MyInfo.getY(), bullet.getVelocity(), GameInfo.getTime(), _predictmgr.getAllPredictResult(), Tactician.get_target().get_id())); } private void checkHitToEnemy() { // Debug.println("checking Hit TO Enemies"); MyFireData[] firehitorys = (MyFireData[]) MyFireHistory.toArray(new MyFireData[0]); EnemyInfo[] enemies = _enemymgr.getEnemiesArray(); long nowtime = GameInfo.getTime(); for (int i = 0; i < firehitorys.length; i++) { // Debug.println("In FOR LOOP1"); double tmpx, tmpy; tmpx = firehitorys[i].get_x(); tmpy = firehitorys[i].get_y(); double flyingdistance = firehitorys[i].get_velocity() * (nowtime - firehitorys[i].get_time()); if (flyingdistance > getLongerDistanceToWall(tmpx, tmpy)) { MyFireHistory.remove(firehitorys[i]); break; } for (int j = 0; j < enemies.length; j++) { if (enemies[j].isAlive()) { double distance = MathUtil.Distance( tmpx, tmpy, enemies[j].get_x(), enemies[j].get_y()); double diffdistance = flyingdistance - distance; // Debug.println("diffdist : " + diffdistance); if (diffdistance >= 0 && diffdistance < 20) { // Debug.println("In FOR LOOP2"); // Debug.println("Ripple Hit Enemy" + enemies[i].get_id()); _enemymgr.onRippleHitEnemy( enemies[j].get_id(), firehitorys[i], GameInfo.getTime()); } } } } } private static double getLongerDistanceToWall(double x, double y) { if (x < (GameInfo.getBattleW() / 2)) x = GameInfo.getBattleW() - x; if (y < (GameInfo.getBattleH() / 2)) y = GameInfo.getBattleH() - y; return MathUtil.Distance(x, y, 0, 0); } private void checkHitByEnemy() { EnemyInfo[] enemies = _enemymgr.getEnemiesArray(); if (enemies == null) return; long nowtime = GameInfo.getTime(); for (int i = 0; i < enemies.length; i++) { ShootingData[] fires = enemies[i].getShootingDataArray(); for (int j = 0; j < fires.length; j++) { double distance = MathUtil.Distance( fires[j].get_x(), fires[j].get_y(), MyInfo.getX(), MyInfo.getY()); double flyingdistance = fires[j].get_velocity() * (nowtime - fires[j].get_stamptime()); if (flyingdistance > getLongerDistanceToWall( fires[j].get_x(), fires[j].get_y())) { enemies[i].removeShootigData(fires[j]); break; } double diffdistance = flyingdistance - distance; if (diffdistance > 0 && diffdistance < 20) { _enemymgr.onRippleHitFangs( enemies[i].get_id(), fires[j], GameInfo.getTime()); } } } } public void checkRippleHit() { checkHitToEnemy(); checkHitByEnemy(); } } PK .B ]F F %spoon/predict/CircularPredictor.class-spoon/predict/CircularPredictorjava/lang/Objectspoon/predict/PredictableCIRCULAR_CHECKI ConstantValue ()VCode LineNumberTableLocalVariableTablethis!Lspoon/predict/CircularPredictor; getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;spoon/enemy/EnemyInfoget_angularvelocity()D  isTargetTurning(D)Z  getShootingOrder  !TargetLspoon/enemy/EnemyInfo;()Lspoon/predict/ShootingOrder;spoon/tactician/Tactician& get_target()Lspoon/enemy/EnemyInfo; () '*spoon/predict/GunPowerSelector, get_gunpower . -/get_headingRadians 1 2 get_velocity 4 5get_x 7 8get_y : ;getCenterOfCircul%(DDDDD)Ljava/awt/geom/Point2D$Double; => ?spoon/util/MyInfoAgetX C BDgetY F BGgetAngleToFireByCircular((Ljava/awt/geom/Point2D$Double;DDDDDDD)D IJ Kspoon/predict/ShootingOrderM(DDZ)V O NPgunpowerDCenterPositionLjava/awt/geom/Point2D$Double; fireangle@4@spoon/util/MathUtil[Distance(DDDD)D ]^ \_java/awt/geom/Point2D$Doublea bD bG?java/lang/Mathgcos(D)D ij hksin mj hnatan2(DD)D pq hrAbsoluteRadians tj \uangularVelocityheadingRadiansxyshooterxshooterychangingheadingdifftimeJbulletvelocitydistanceradiusi(DD)V bvelocitycenterxcentery isCanPredict(Lspoon/enemy/EnemyInfo;)ZgetEnemyDataRecordArray()[Lspoon/enemy/StateData; spoon/enemy/StateData  5abs j h?zG{target EnemyDatas[Lspoon/enemy/StateData; stdtmpangvelo stdtmpvelogaptmptoString()Ljava/lang/String;CirangluarVelocity SourceFileCircularPredictor.java!    /*  N+*+"  #$ % P+L+*+""#$ % #$  G0I+3+6++9+<@:(++3+9+<EHL9NY(QN)-. /01,+56 7$8(9,:0;3<6493;=4GG#$CRS*TU; VS IJ WY'kg9   `9*c*d `96Joec7)k9*cclkg9*dcokc9    `9 g  gsvZN PTU V"W$S'R)Y/[;\B_F`Q_R^TbXccbdafdsY}gTURSwSxSySzS {S |S B4}S;;~ SvS)eS,Q => *(o9 &l kc9&o kg9bYwz{|R*xS*S*wS*yS*zS$S S S  h+M,2J, ),296 6 -, 2)g9, 2     > #&,8:PS]dfHhh$c \S#ES:S&B  -   4 &  SPK .- p$spoon/predict/CircularPredictor.java/* * Created on 2003. 5. 20. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import java.awt.geom.Point2D; import java.awt.geom.Point2D.Double; import spoon.enemy.EnemyInfo; import spoon.enemy.StateData; import spoon.tactician.Tactician; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class CircularPredictor implements Predictable { final static int CIRCULAR_CHECK = 10; public ShootingOrder getResult(EnemyInfo Target) { if (!isTargetTurning(Target.get_angularvelocity())) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { double gunpower = GunPowerSelector.get_gunpower(); Point2D.Double CenterPosition = getCenterOfCircul( Target.get_headingRadians(), Target.get_velocity(), Target.get_angularvelocity(), Target.get_x(), Target.get_y()); double fireangle = getAngleToFireByCircular( CenterPosition, gunpower, Target.get_angularvelocity(), Target.get_headingRadians(), Target.get_x(), Target.get_y(), MyInfo.getX(), MyInfo.getY()); return new ShootingOrder(fireangle, gunpower, true); } public static double getAngleToFireByCircular( Double CenterPosition, double gunpower, double angularVelocity, double headingRadians, double x, double y, double shooterx, double shootery) { double diffdist; double changingheading; long difftime; double bulletvelocity = 20 - 3 * gunpower; double distance = MathUtil.Distance(shooterx, shootery, x, y); double radius = MathUtil.Distance( CenterPosition.getX(), CenterPosition.getY(), x, y); for (int i = 0; i < 20; i++) { difftime = (long) (distance / bulletvelocity + 0.5); changingheading = difftime * angularVelocity; x = CenterPosition.getX() - Math.cos(headingRadians + changingheading) * radius; y = CenterPosition.getY() + Math.sin(headingRadians + changingheading) * radius; distance = MathUtil.Distance(shooterx, shootery, x, y); } return MathUtil.AbsoluteRadians(Math.atan2(x - shooterx, y - shootery)); } /** * @param d * @param e * @param f * @return */ public static Point2D.Double getCenterOfCircul( double headingRadians, double velocity, double angularVelocity, double x, double y) { double radius = velocity / angularVelocity; long difftime; double centerx = x + Math.cos(headingRadians) * radius; double centery = y - Math.sin(headingRadians) * radius; return new Point2D.Double(centerx, centery); } // private double getAngleToFireByCircular( // double x, // double y, // double headingRadians, // double EnemyVelocity) { // double initheadingradians = _target.get_headingRadians(); // double radius = _target.get_velocity() / _oldturnrate; // long difftime; // // double x = Target.get_x(); // double y = Target.get_y(); // double centerx = x + Math.cos(initheadingradians) * radius; // double centery = y - Math.sin(initheadingradians) * radius; // // double diffdist; // double changingheading; // // double myx = MyInfo.getX(); // double myy = MyInfo.getY(); // double dist = MathUtil.Distance(myx, myy, x, y); // double bulletVelocity = 20 - 3 * _gunpower; // // for (int i = 0; i < 20; i++) { // // difftime = (long) (dist / bulletVelocity + 0.5); // changingheading = difftime * _oldturnrate; // // x = // centerx // - Math.cos(initheadingradians + changingheading) * radius; // y = // centery // + Math.sin(initheadingradians + changingheading) * radius; // double tmpdist = MathUtil.Distance(myx, myy, x, y); // diffdist = Math.abs(tmpdist - dist); // dist = tmpdist; // } // return Math.PI / 2 - Math.atan2(y - myy, x - myx); /* (non-Javadoc) * @see fangs.predict.Pattern#isMatch(double, double) */ public boolean isCanPredict(EnemyInfo target) { StateData[] EnemyDatas = target.getEnemyDataRecordArray(); double stdtmpangvelo = EnemyDatas[0].get_angularvelocity(); if (EnemyDatas.length < CIRCULAR_CHECK || stdtmpangvelo == 0) { return false; } double stdtmpvelo = EnemyDatas[0].get_velocity(); double gaptmp; int i = 1; for (i = 1; i < CIRCULAR_CHECK; i++) { gaptmp = Math.abs(EnemyDatas[i].get_angularvelocity() - stdtmpangvelo); if (EnemyDatas[i].get_velocity() != stdtmpvelo || gaptmp > 0.04) { break; } } if (i == CIRCULAR_CHECK) { return true; } return false; } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { return "Cir"; } public static boolean isTargetTurning(double angluarVelocity) { return (angluarVelocity != 0); } } PK .}H H (spoon/predict/GuessFactorPredictor.class-}"spoon/predict/GuessFactorPredictorjava/lang/Objectspoon/predict/Predictable()VCode   LineNumberTableLocalVariableTablethis$Lspoon/predict/GuessFactorPredictor; getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;getShootingOrder  TargetLspoon/enemy/EnemyInfo;()Lspoon/predict/ShootingOrder;spoon/tactician/Tactician get_target()Lspoon/enemy/EnemyInfo;  spoon/enemy/EnemyInfo getDistance()D ! "getDistanceIndex(D)I $% &spoon/predict/GunPowerSelector( get_gunpower *! )+getGuessFactorScoreMap()[[D -. /getBestGuessFactor([[DI)I 12 3 get_velocity 5! 6get_headingRadians 8! 9getAbsBearingRadians ;! <getTargetDirection(DDD)D >? @getAngleToFireByGuessFactor(IDD)D BC Dspoon/predict/ShootingOrderF(DDZ)V H GI distindexIgunpowerDbestGuessFactortargetDirection fireanglejava/lang/MathR toRadians(D)D TU SVspoon/util/MathUtilXAbsoluteRadians ZU Y[absBearingRadiansin ^U S_abs aU Sbvelocity headingRadianguessFactorMap[[Dtmpi@Dsqrt lU Smround(D)J op Sqdistance isCanPredict(Lspoon/enemy/EnemyInfo;)ZtargettoString()Ljava/lang/String;GFy SourceFileGuessFactorPredictor.java!  /*    :*+   PL+*+      @+#'=,J+046+7+:+=A9+=E9GY)J > ! %&'"$%#'+),--/*2)4/ H@@8KL 4MN*OL'PN4 QN BC Z')2dWkc\ 78 7 6 OL]NPN >? }!9&&(g`k9co9 ?@ BACE *!dN!eN!]NPN 12 `*221I266D(*22d1*22d1I2d6(*22`1*22`1I2`6*2l . KL MNO)P0S>THUOM]Z 4`fg`KLYhN UOLOiL $% f&jonr==  = ^ `acdf sN KLtu 6 j vwx -z m {|PK .hF  'spoon/predict/GuessFactorPredictor.java/* * Created on May 28, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.enemy.EnemyInfo; import spoon.tactician.Tactician; import spoon.util.MathUtil; public class GuessFactorPredictor implements Predictable { public ShootingOrder getResult(EnemyInfo Target) { return getShootingOrder(Target); } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { int distindex = getDistanceIndex(Target.getDistance()); double gunpower = GunPowerSelector.get_gunpower(); int bestGuessFactor = getBestGuessFactor(Target.getGuessFactorScoreMap(), distindex); double targetDirection = getTargetDirection( Target.get_velocity(), Target.get_headingRadians(), Target.getAbsBearingRadians()); double fireangle = getAngleToFireByGuessFactor( bestGuessFactor, Target.getAbsBearingRadians(), targetDirection); return new ShootingOrder(fireangle, gunpower, true); } public static double getAngleToFireByGuessFactor( int bestGuessFactor, double absBearingRadian, double targetDirection) { return MathUtil.AbsoluteRadians( absBearingRadian + targetDirection * Math.toRadians(bestGuessFactor - 50)); } public static double getTargetDirection( double velocity, double headingRadian, double absBearingRadian) { double targetDirection = 1; if (velocity != 0) { targetDirection = velocity * Math.sin(headingRadian - absBearingRadian); targetDirection /= Math.abs(targetDirection); } return targetDirection; } public static int getBestGuessFactor( double[][] guessFactorMap, int distindex) { double tmp = guessFactorMap[distindex][50]; int bestGuessFactor = 50; for (int i = 0; i < guessFactorMap[distindex].length / 2; i++) { if (tmp < guessFactorMap[distindex][50 - i]) { tmp = guessFactorMap[distindex][50 - i]; bestGuessFactor = 50 - i; // allow = true; } if (tmp < guessFactorMap[distindex][50 + i]) { tmp = guessFactorMap[distindex][50 + i]; bestGuessFactor = 50 + i; // allow = true; } } return bestGuessFactor; } public static int getDistanceIndex(double distance) { int distindex = (int) Math.round(Math.sqrt(distance / 40)); // distindex 0 is possible? --;;; if (distindex <= 0) distindex = 1; if (distindex > 10) distindex = 10; return distindex; } public boolean isCanPredict(EnemyInfo target) { return true; } public String toString() { return "GF"; } } PK .* ܖ$spoon/predict/GunPowerSelector.class-Uspoon/predict/GunPowerSelectorjava/lang/Object _gunpowerDMeleeZ()VCode   LineNumberTableLocalVariableTable  this Lspoon/predict/GunPowerSelector; setGunPower(Lspoon/enemy/EnemyInfo;)ZisMelee()Z  spoon/enemy/EnemyInfoisAlive   getDistance()D ! "spoon/util/MyInfo$ getEnergy &! %' get_energy )! *@@?  2@@0@@y@@java/lang/Math@min(DD)D BC AD?TargetLspoon/enemy/EnemyInfo;gunpowerdistMyEnergy EnemyEnergy deadpower get_gunpowersetMelee(Z)Vb SourceFileGunPowerSelector.java!  )    /*  S +++#9(9++9,9 .. 0344o9 6.c8o9 : ,I< >I.I (E3+|(I++9,9.(. 0344o96.c8o9(.k(0gFE3,E3( $!)#;$A%C(L)W*`+l-u.|/029=?AEFHJKLOPQRXYZ\`bz HIyJJ JK}L$wM)rN uLoMjN O! * 3,Ef  $ j PQ 3  no RSTPK .I>'r r #spoon/predict/GunPowerSelector.javapackage spoon.predict; import spoon.enemy.EnemyInfo; import spoon.util.MyInfo; /* * Created on 2003-06-05 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ /** * @author cse20 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class GunPowerSelector { static double _gunpower; static boolean Melee = false; public boolean setGunPower(EnemyInfo Target) { if (Target == null) return false; if (isMelee()) { if (Target.isAlive()) { double gunpower; double dist = Target.getDistance(); double MyEnergy = MyInfo.getEnergy(); double EnemyEnergy = Target.get_energy(); double deadpower = 3; if (EnemyEnergy < 2 && MyEnergy < 2) { _gunpower = 0.1; return true; } if (EnemyEnergy <= 4) { deadpower = (EnemyEnergy) / 4; } else if (EnemyEnergy <= 16) { deadpower = (EnemyEnergy + 2) / 6; } if (dist < 400) { gunpower = 3.0; } else if (dist < 600) { gunpower = 2.5; } else { gunpower = 2; } // if (MyEnergy < 2 * deadpower) { // return false; // } _gunpower = Math.min(deadpower, gunpower); // _gunpower = 1; // _gunpower = 1; return true; } return false; } if (Target.isAlive()) { // double gunpower; // double dist = Target.getDistance(); double MyEnergy = MyInfo.getEnergy(); double EnemyEnergy = Target.get_energy(); double deadpower = 3; if (EnemyEnergy < 2 && MyEnergy < 2) { _gunpower = 0.1; return true; } if (EnemyEnergy <= 4) { deadpower = (EnemyEnergy) / 4; } else if (EnemyEnergy <= 16) { deadpower = (EnemyEnergy + 2) / 6; } // if (MyEnergy < 2 * deadpower) { // return false; // } if (MyEnergy * 2 < EnemyEnergy) { _gunpower = Math.min(MyEnergy - 0.1, 0.5); return true; } _gunpower = Math.min(deadpower, 3.0); // _gunpower = 1; // _gunpower = 1; return true; } return false; } public static double get_gunpower() { return Math.min(_gunpower, 3.0); } public static boolean isMelee() { return Melee; } public static void setMelee(boolean b) { Melee = b; } } PK .| #spoon/predict/LinearPredictor.class-spoon/predict/LinearPredictorjava/lang/Objectspoon/predict/Predictable LINEAR_CHECKI()VCode   LineNumberTableLocalVariableTablethisLspoon/predict/LinearPredictor; getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;getShootingOrder  TargetLspoon/enemy/EnemyInfo;()Lspoon/predict/ShootingOrder;spoon/tactician/Tactician get_target()Lspoon/enemy/EnemyInfo;   spoon/predict/GunPowerSelector" get_gunpower()D $% #&spoon/enemy/EnemyInfo( get_velocity *% )+getAbsBearingRadians -% ).get_headingRadians 0% )1getAngleToFireByLinear(DDDD)D 34 5spoon/predict/ShootingOrder7(DDZ)V 9 8:gunpowerD fireanglejava/lang/Math?sin(D)D AB @Cspoon/util/DebugE isShowLinearZ GH FIjava/lang/StringBufferK T head : M(Ljava/lang/String;)V O LP toDegrees RB @Sappend(D)Ljava/lang/StringBuffer; UV LW T Bearing : Y,(Ljava/lang/String;)Ljava/lang/StringBuffer; U[ L\toString()Ljava/lang/String; ^_ L`println bO Fc Velocity : e gunpower g@4@asin mB @nspoon/util/MathUtilpAbsoluteRadians rB qsvelocityabsBearingRadian headingRadianprojVdiff isCanPredict(Lspoon/enemy/EnemyInfo;)ZgetEnemyDataRecordArray()[Lspoon/enemy/StateData; |} )~spoon/enemy/StateData +get_angularvelocity % stdV :  stdAV : target EnemyDatas[Lspoon/enemy/StateData; stdtmpvelo stdtmpangveloiLin SourceFileLinearPredictor.java!  = * *     :*+ P!L+*+   "'I+,+/+2(698Y(;"$)* +,('0*""<= >= 34  k(g9  D&k9JCLYNQTXZ](TXadLYfQ&Xh]Xadikkgoo(ct2 9;=?@&A+B2?5>8CUGgF>ku=kv=kw=k<=\x=ey= z{ " +M,*,2J,29LYQ)X]XadD)>6 6 !, 2), 2  * *FKLMOPS9R<TIULVRW^XjYmVy\]`>o=g=L8 ^_ -d PK .Aa a "spoon/predict/LinearPredictor.java/* * Created on May 13, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.enemy.EnemyInfo; import spoon.enemy.StateData; import spoon.tactician.Tactician; import spoon.util.Debug; import spoon.util.MathUtil; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class LinearPredictor implements Predictable { private int LINEAR_CHECK = 10; public ShootingOrder getResult(EnemyInfo Target) { return getShootingOrder(Target); } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { double gunpower = GunPowerSelector.get_gunpower(); // Debug.println("call lin"); double fireangle = getAngleToFireByLinear( Target.get_velocity(), Target.getAbsBearingRadians(), Target.get_headingRadians(), gunpower); // Debug.println(Math.toDegrees(fireangle)); return new ShootingOrder(fireangle, gunpower, true); } public static double getAngleToFireByLinear( double velocity, double absBearingRadian, double headingRadian, double gunpower) { double projV; double diff = headingRadian - absBearingRadian; projV = Math.sin(diff) * velocity; if (Debug.isShowLinear) { Debug.println( "T head : " + Math.toDegrees(headingRadian) + " T Bearing : " + Math.toDegrees(absBearingRadian)); Debug.println("Velocity : " + velocity + " gunpower " + gunpower); } return MathUtil.AbsoluteRadians( Math.asin(projV / (20 - 3 * gunpower)) + absBearingRadian); } public boolean isCanPredict(EnemyInfo target) { StateData[] EnemyDatas = target.getEnemyDataRecordArray(); if (EnemyDatas.length < LINEAR_CHECK) { return false; } double stdtmpvelo = EnemyDatas[0].get_velocity(); double stdtmpangvelo = EnemyDatas[0].get_angularvelocity(); double gaptmp; Debug.println( "stdV : " + stdtmpvelo + " stdAV : " + stdtmpangvelo); if (stdtmpangvelo == 0 && stdtmpvelo != 0) { int i = 1; for (i = 1; i < LINEAR_CHECK; i++) { if (EnemyDatas[i].get_velocity() != stdtmpvelo || EnemyDatas[i].get_angularvelocity() != 0) break; } if (i == LINEAR_CHECK) { return true; } } return false; } public String toString() { return "Lin"; } } PK .`L?i;;spoon/predict/Predictable.class- spoon/predict/Predictablejava/lang/Object isCanPredict(Lspoon/enemy/EnemyInfo;)ZgetShootingOrder6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;()Lspoon/predict/ShootingOrder; getResult SourceFilePredictable.java!    PK .˩ppspoon/predict/Predictable.java/* * Created on 2003. 5. 20. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.enemy.EnemyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public interface Predictable { public boolean isCanPredict(EnemyInfo target); public ShootingOrder getShootingOrder(EnemyInfo Target); public ShootingOrder getShootingOrder(); public ShootingOrder getResult(EnemyInfo Target); } PK . $spoon/predict/PredictorManager.class-spoon/predict/PredictorManagerjava/lang/Object_GunPowerSelector Lspoon/predict/GunPowerSelector;_isMeleeZ _predictors[Lspoon/predict/Predictable;()VCodespoon/predict/Predictable"spoon/predict/GuessFactorPredictor  spoon/predict/RepeatPredictor spoon/predict/CircularPredictor spoon/predict/LinearPredictor !spoon/predict/StationaryPredictor  !LineNumberTableLocalVariableTable spoon/predict/GunPowerSelector& '  )this Lspoon/predict/PredictorManager;getPredictorsNumber()IgetAllPredictResult ()[Lspoon/predict/ShootingOrder;spoon/tactician/Tactician1 get_target()Lspoon/enemy/EnemyInfo; 34 257(Lspoon/enemy/EnemyInfo;)[Lspoon/predict/ShootingOrder; /7 8spoon/predict/ShootingOrder: getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder; <= >TargetLspoon/enemy/EnemyInfo;results[Lspoon/predict/ShootingOrder;iIgetShootingOrder()Lspoon/predict/ShootingOrder; F= H setGunPower(Lspoon/enemy/EnemyInfo;)Z JK 'LisMelee()Z NO P Hspoon/enemy/EnemyInfoSgetAccuracyArray()[I UV TW spoon/IrYoungYenemymgrLspoon/enemy/EnemyInfoManager; [\ Z]get_id()Ljava/lang/String; _` Taspoon/enemy/EnemyInfoManagercsetAccuracyToZero(Ljava/lang/String;I)V ef dgaccuracy[I bestindex bestvalueorderLspoon/predict/ShootingOrder;displayPredictInfojava/lang/StringBufferptoString r` sjava/lang/StringuvalueOf&(Ljava/lang/Object;)Ljava/lang/String; wx vy(Ljava/lang/String;)V { q| accuracy : ~append,(Ljava/lang/String;)Ljava/lang/StringBuffer; q(I)Ljava/lang/StringBuffer; q qsspoon/util/Debugprintln { Selected Predictor :    setMelee(Z)Vb SourceFilePredictorManager.java!   z:YYSYYSYYSYYSYY S"#& $.569$  B*%*'Y(*# !"$ +, -. %"#%$/0 2*69#)$ +,/7 (";M>,"2+?S",#-0 10&9$*(+,(@A BC DEFG P6L+*+I#=>? @$+, @AF= r**+M*Q"2+R+XM>66,. >,.6""2+R:+^+bh#BE F HJ S%U'V*W0X9Y<ZBWN][_d`oc$Hr+,r@A%Mij'KkE*HlE-!DE[mno   w6L=>+X:6>qY"2tz}.. =.>qY}"2t#>ijklmo7n:pCqFrLmWvnuq}v$>w+,s@AqkEolEiijFDENO /*#$ +, >*# $+,PK .Jʩ #spoon/predict/PredictorManager.java/* * Created on 2003-05-22 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.IrYoung; import spoon.enemy.EnemyInfo; import spoon.tactician.Tactician; import spoon.util.Debug; /** * @author cse20 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class PredictorManager { GunPowerSelector _GunPowerSelector; boolean _isMelee; static private Predictable[] _predictors = new Predictable[] { new GuessFactorPredictor(), new RepeatPredictor(), new CircularPredictor(), new LinearPredictor(), new StationaryPredictor()}; public PredictorManager() { _GunPowerSelector = new GunPowerSelector(); } public static int getPredictorsNumber() { return _predictors.length; } public ShootingOrder[] getAllPredictResult() { return getAllPredictResult(Tactician.get_target()); } public ShootingOrder[] getAllPredictResult(EnemyInfo Target) { ShootingOrder[] results = new ShootingOrder[_predictors.length]; // ShootingOrder[] results = new ShootingOrder[1]; // results[0]= _predictors[4].getShootingOrder(Target); for (int i = 0; i < _predictors.length; i++) { results[i] = _predictors[i].getResult(Target); // Debug.println("getAll Result"); // if (_predictors[i].isCanPredict(Target)) { // results[i] = _predictors[i].getShootingOrder(Target); // } else { // results[i] = null; // } } return results; } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { if (!_GunPowerSelector.setGunPower(Target)) return null; if (isMelee()) { // if (Target.getDistance() < 200) { return _predictors[4].getShootingOrder(Target); // } } // if (isMelee()) { // return _predictors[4].getShootingOrder(); // } else { int[] accuracy = Target.getAccuracyArray(); int bestindex = 0; int bestvalue = 0; for (int i = 0; i < _predictors.length; i++) { if (bestvalue < accuracy[i]) { bestindex = i; bestvalue = accuracy[i]; } } ShootingOrder order = _predictors[bestindex].getShootingOrder(Target); if (order == null || Target == null) { IrYoung.enemymgr.setAccuracyToZero(Target.get_id(), bestindex); } return order; // } } public void displayPredictInfo() { EnemyInfo Target = Tactician.get_target(); int bestindex = 0; int bestvalue = 0; int[] accuracy = Target.getAccuracyArray(); for (int i = 0; i < accuracy.length; i++) { Debug.println( _predictors[i].toString() + " accuracy : " + accuracy[i]); if (bestvalue < accuracy[i]) { bestindex = i; bestvalue = accuracy[i]; } } Debug.println( "Selected Predictor : " + _predictors[bestindex].toString()); // int index = GuessFactorPredictor.getDistanceIndex(Target.getDistance()); // double[][] map = Target.getGuessFactorScoreMap(); // for (int i = 0; i < map[0].length; i++) { // Debug.print(map[index][i] + " "); // } Debug.println(" "); } public boolean isMelee() { return _isMelee; } public void setMelee(boolean b) { _isMelee = b; } } PK .IJ #spoon/predict/RepeatPredictor.class-spoon/predict/RepeatPredictorjava/lang/Objectspoon/predict/Predictable PATTERN_CHECKI ConstantValue_allowZ()VCode  LineNumberTableLocalVariableTablethisLspoon/predict/RepeatPredictor; getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;getShootingOrder  TargetLspoon/enemy/EnemyInfo;()Lspoon/predict/ShootingOrder;spoon/tactician/Tactician get_target()Lspoon/enemy/EnemyInfo; ! " isCanPredict(Lspoon/enemy/EnemyInfo;)Z $% & (spoon/predict/GunPowerSelector* get_gunpower()D ,- +.spoon/enemy/EnemyInfo0getEnemyDataRecordArray()[Lspoon/enemy/StateData; 23 14get_matchoffset()I 67 18 getDistance :- 1;getAngleToFireByRepeat([Lspoon/enemy/StateData;IDD)D => ?spoon/predict/ShootingOrderA(DDZ)V C BDgunpowerD fireangle@4@spoon/enemy/StateDataMget_x O- NPget_y R- NS??!TD-java/lang/MathYatan2(DD)D [\ Z]get_headingRadians _- N`spoon/util/MathUtilbDistance(DDDD)D de cfsin(D)D hi Zjcos li Zmspoon/util/MyInfoogetX q- prgetY t- pu(java/lang/ArrayIndexOutOfBoundsExceptionwdatas[Lspoon/enemy/StateData;startMatchOffsetdistancedifftimeJvelocitystartxstartydestxdesty directangletmpdistie*Ljava/lang/ArrayIndexOutOfBoundsException;get_angularvelocity - Nabs i Z get_velocity - N?zG{?zG{set_matchoffset(I)V 1target EnemyDatascounttmpgapVgaptmptoString()Ljava/lang/String;Pat SourceFileRepeatPredictor.java!   /* :*+P#L+*+ ! 5*+'*)/I*+5+9+<(@9BY(*)E2 %' )*-./0 1!-$,&3*55"FG&HG=>IKkg9 +2Q9 +2T9 996) oUc7+e2Q9+e2T9 :*)W g g^g+2ag9  g9+2ac9+2Qkkc9+2Tnkc9svgJfWvgsg^g3PPxr? @ABC"F(G3I@JPLRMWNYR\SiRjTpRqQsUVWX[ZF_`_yz{|GFG3}~ G G G G"GsKG>G%R$% +5M,>6,2,2g9,2,2g9i`>U,`2,2g9,`2,2g9( +d,da.hi jlpquv$u%t(s*y1z7y8x;w={O}TUWXZ]cdg~ijlmorxy|~}rqpHz=rG*G- PK .bj.LL"spoon/predict/RepeatPredictor.java/* * Created on 2003-05-26 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.enemy.EnemyInfo; import spoon.enemy.StateData; import spoon.tactician.Tactician; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author cse20 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class RepeatPredictor implements Predictable { final static int PATTERN_CHECK = 8; boolean _allow; public ShootingOrder getResult(EnemyInfo Target) { return getShootingOrder(Target); } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { if (!isCanPredict(Target)) { return null; } _allow = true; double gunpower = GunPowerSelector.get_gunpower(); double fireangle = getAngleToFireByRepeat( Target.getEnemyDataRecordArray(), Target.get_matchoffset(), Target.getDistance(), gunpower); return new ShootingOrder(fireangle, gunpower, _allow); } /** * @return */ private double getAngleToFireByRepeat( StateData[] datas, int startMatchOffset, double distance, double gunpower) { long difftime; double velocity = 20 - 3 * gunpower; double startx = datas[startMatchOffset].get_x(); double starty = datas[startMatchOffset].get_y(); double destx = 0; double desty = 0; double directangle; double tmpdist; for (int i = 0; i < 20; i++) { difftime = (long) (distance / velocity + 0.5); try { destx = datas[(int) (startMatchOffset - difftime)].get_x(); desty = datas[(int) (startMatchOffset - difftime)].get_y(); } catch (ArrayIndexOutOfBoundsException e) { _allow = false; return 0; } directangle = Math.PI / 2 - Math.atan2(desty - starty, destx - startx) - datas[startMatchOffset].get_headingRadians(); tmpdist = MathUtil.Distance(destx, desty, startx, starty); directangle += datas[0].get_headingRadians(); destx = datas[0].get_x() + Math.sin(directangle) * tmpdist; desty = datas[0].get_y() + Math.cos(directangle) * tmpdist; distance = MathUtil.Distance(MyInfo.getX(), MyInfo.getY(), destx, desty); } return Math.PI / 2 - Math.atan2(desty - MyInfo.getY(), destx - MyInfo.getX()); } /* (non-Javadoc) * @see fangs.predict.Pattern#isMatch(double, double) */ public boolean isCanPredict(EnemyInfo target) { StateData[] EnemyDatas = target.getEnemyDataRecordArray(); if (EnemyDatas.length < PATTERN_CHECK) { return false; } int count = 0; int i; double tmpgapV; double gaptmp; for (i = PATTERN_CHECK * 3; i < EnemyDatas.length - PATTERN_CHECK; i++) { gaptmp = Math.abs( EnemyDatas[i].get_angularvelocity() - EnemyDatas[0].get_angularvelocity()); tmpgapV = Math.abs( EnemyDatas[i].get_velocity() - EnemyDatas[0].get_velocity()); if (gaptmp <= 0.04 && tmpgapV <= 0.02) { // Debug.println("match? num : " + i); for (count = 1; count < PATTERN_CHECK; count++) { gaptmp = Math.abs( EnemyDatas[i + count].get_angularvelocity() - EnemyDatas[count].get_angularvelocity()); tmpgapV = Math.abs( EnemyDatas[i + count].get_velocity() - EnemyDatas[count].get_velocity()); if (gaptmp > 0.04 || tmpgapV > 0.02) { break; } if (count == PATTERN_CHECK - 1) { target.set_matchoffset(i - 1); return true; } } } } return false; } public String toString() { return "Pat"; } } PK .,`!spoon/predict/ShootingOrder.class-$spoon/predict/ShootingOrderjava/lang/Object_radiansD_power_allowZ(DDZ)VCode()V       LineNumberTableLocalVariableTablethisLspoon/predict/ShootingOrder;RPA get_power()D get_radiansis_allow()Z SourceFileShootingOrder.java!   m**'*)* *  /*  /*   ! /*$ "#PK .!R spoon/predict/ShootingOrder.java/* * Created on May 17, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class ShootingOrder { double _radians; double _power; boolean _allow; public ShootingOrder(double R, double P, boolean A ) { _radians = R; _power = P; _allow = A; // Debug.println("fire angle : " + Math.toDegrees(R)); } public double get_power() { return _power; } public double get_radians() { return _radians; } public boolean is_allow() { return _allow; } } PK .]ܪ=='spoon/predict/StationaryPredictor.class-I!spoon/predict/StationaryPredictorjava/lang/Objectspoon/predict/Predictable STANARY_CHECKI ConstantValue()VCode LineNumberTableLocalVariableTablethis#Lspoon/predict/StationaryPredictor; getResult6(Lspoon/enemy/EnemyInfo;)Lspoon/predict/ShootingOrder;getShootingOrder  TargetLspoon/enemy/EnemyInfo;()Lspoon/predict/ShootingOrder;spoon/tactician/Tactician get_target()Lspoon/enemy/EnemyInfo;   spoon/predict/GunPowerSelector" get_gunpower()D $% #&spoon/predict/ShootingOrder(spoon/enemy/EnemyInfo*getAbsBearingRadians ,% +-(DDZ)V / )0gunpowerD isCanPredict(Lspoon/enemy/EnemyInfo;)ZgetEnemyDataRecordArray()[Lspoon/enemy/StateData; 67 +8spoon/enemy/StateData: get_velocity <% ;=target EnemyDatas[Lspoon/enemy/StateData;itoString()Ljava/lang/String;StaE SourceFileStationaryPredictor.java!    /*  :*+ P!L+*+   T'I)Y+.(1 "# 2345 4+9M,>,2> * '( ),./!,*10224*44?/@A$BCD -F7 GHPK . !&spoon/predict/StationaryPredictor.java/* * Created on 2003-05-22 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.predict; import spoon.enemy.EnemyInfo; import spoon.enemy.StateData; import spoon.tactician.Tactician; /** * @author cse20 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class StationaryPredictor implements Predictable { final static int STANARY_CHECK = 20; public ShootingOrder getResult(EnemyInfo Target) { return getShootingOrder(Target); } public ShootingOrder getShootingOrder() { EnemyInfo Target = Tactician.get_target(); if (Target == null) return null; return getShootingOrder(Target); } public ShootingOrder getShootingOrder(EnemyInfo Target) { double gunpower = GunPowerSelector.get_gunpower(); return new ShootingOrder(Target.getAbsBearingRadians(), gunpower, true); } public boolean isCanPredict(EnemyInfo target) { StateData[] EnemyDatas = target.getEnemyDataRecordArray(); if (EnemyDatas.length < STANARY_CHECK) { return false; } int i; for (i = 0; i < STANARY_CHECK; i++) { // Debug.println("v : " + EnemyDatas[i].get_velocity()); if (EnemyDatas[i].get_velocity() != 0) break; } if (i == STANARY_CHECK) return true; return false; } public String toString() { return "Sta"; } } PK .Espoon/enemy/EnemyInfo.class-spoon/enemy/EnemyInfojava/lang/Object_aliveZ_shootinghistoryLjava/util/ArrayList;_history_idLjava/lang/String; _latestDataLspoon/enemy/StateData;Accuracy[I _matchoffsetIradianFactorWeight[[D_fangsGuessFactorScoreMap(Ljava/lang/String;DDDDDJ)VCode()V         "java/util/ArrayList$ %  '  )spoon/enemy/StateData+ (JDDDDDD)V - ,. 0add(ILjava/lang/Object;)V 23 %4 initFactors 6 7spoon/predict/PredictorManager9getPredictorsNumber()I ;< :=  ?LineNumberTableLocalVariableTablethisLspoon/enemy/EnemyInfo;IDXDYEnergyVelocityHeadingRadians TimestampJ?? oz jiclearRoundDataclear U %VgetAbsBearingRadians()Dget_x ZY ,[spoon/util/MyInfo]getX _Y ^`get_y bY ,cgetY eY ^fjava/lang/Mathhatan2(DD)D jk ilspoon/util/MathUtilnAbsoluteRadians(D)D pq orget_angularvelocity tY ,u get_energy wY ,xget_headingRadians zY ,{get_id()Ljava/lang/String;get_matchoffset  getLastUpdateTime()J get_timestamp , get_velocity Y ,_x G ,_y G , getDistanceDistance(DDDD)D ogetEnemyDataRecordArray()[Lspoon/enemy/StateData;toArray(([Ljava/lang/Object;)[Ljava/lang/Object; %[Lspoon/enemy/StateData;getEnemyShootingDataArray()Ljava/util/ArrayList; getHistory(I)Lspoon/enemy/StateData;size < %get(I)Ljava/lang/Object; %pastgetGuessFactorScoreMap()[[DisAlive()Z set_alive(Z)Vbset_matchoffset(I)Vl set_energy(D)V ,d addHistory(Lspoon/enemy/StateData;)Vremove %recordget_fangsGuessFactorScoreMap removeHistorygetShootingDataArray()[Lspoon/enemy/ShootingData;spoon/enemy/ShootingDataspoon/enemy/ShootingData;addShootingData$(DDDDDJ[D)Lspoon/enemy/ShootingData; (DDDDDJ[D)V  xypowerbearingdistancetimeangles[DtmpfireLspoon/enemy/ShootingData;getHistoryByTime(J)Lspoon/enemy/StateData;statesremoveShootigData(Lspoon/enemy/ShootingData;)Vjava/util/AbstractCollection(Ljava/lang/Object;)Z datagetAccuracyArray()[I SourceFileEnemyInfo.java!   m** e* e*+!*#*%Y&(*%Y&**,Y ( /1*(*15*8*> @A:!)!*&+1,<-=.P-S/_0c2l3BRmCDmE mFGmHGmIGmJGmKG mLM 6;</=*2NR*2PR*2߄*αA67 89 7.6:;B ;CD8R'STA**W*(WA>?@B CDXYS*1\ag*1dggmsAE FDCB CDtY2*1vAJB CDwY2*1yANB CDzY2*1|ARB CD}~/*!AVB CD</*AZB CD2*1A^B CDY2*1AbB CDZY2*1AfB CDbY2*1AjB CDYRag*1\*1dAopq rnB CD9*(,AvB CD/**AzB CDW*(d*(,A~ BCD/*AB CD/*#AB CD>*#A BCD>*A BCDA *1'A B CD Gr**(+5*(W*(*+1A $)B*CD* /*AB CDU*(W**(,1A BCDS9**öŰAB CD"Y')   :**5AB\ "CD"G"G"G"G"G "M "  2*(,N6-2-2-A!&0B*2CD2M#SB **+WA  B CD /*@AB CDPK .WSspoon/enemy/EnemyInfo.java/* * Created on 2003. 5. 10. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.enemy; import java.util.ArrayList; import spoon.predict.PredictorManager; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class EnemyInfo { boolean _alive; ArrayList _shootinghistory; ArrayList _history; String _id; StateData _latestData; int[] Accuracy; int _matchoffset; double[][] radianFactorWeight = new double[11][101]; double[][] _fangsGuessFactorScoreMap = new double[11][101]; public EnemyInfo( String ID, double X, double Y, double Energy, double Velocity, double HeadingRadians, long Timestamp) { _id = ID; _alive = true; _history = new ArrayList(); _shootinghistory = new ArrayList(); _latestData = new StateData(Timestamp, X, Y, Energy, HeadingRadians, Velocity, 0); _history.add(0, _latestData); initFactors(); Accuracy = new int[PredictorManager.getPredictorsNumber()]; } public void initFactors() { for (int j = 0; j < radianFactorWeight.length; j++) for (int i = 0; i < radianFactorWeight[0].length; i++) { radianFactorWeight[j][i] = 1.0000001; _fangsGuessFactorScoreMap[j][i] = 1.000001; } } public void clearRoundData() { _shootinghistory.clear(); _history.clear(); } public double getAbsBearingRadians() { return MathUtil.AbsoluteRadians( Math.atan2( _latestData.get_x() - MyInfo.getX(), _latestData.get_y() - MyInfo.getY())); } public double get_angularvelocity() { return _latestData.get_angularvelocity(); } public double get_energy() { return _latestData.get_energy(); } public double get_headingRadians() { return _latestData.get_headingRadians(); } public String get_id() { return _id; } public int get_matchoffset() { return _matchoffset; } public long getLastUpdateTime() { return _latestData.get_timestamp(); } public double get_velocity() { return _latestData.get_velocity(); } public double get_x() { return _latestData._x; } public double get_y() { return _latestData._y; } public double getDistance() { return MathUtil.Distance( MyInfo.getX(), MyInfo.getY(), _latestData.get_x(), _latestData.get_y()); } public StateData[] getEnemyDataRecordArray() { return (StateData[]) _history.toArray(new StateData[0]); } public ArrayList getEnemyShootingDataArray() { return _shootinghistory; } public StateData getHistory(int past) { if (past > _history.size() - 1) return null; return (StateData) _history.get(past); } public double[][] getGuessFactorScoreMap() { return radianFactorWeight; } public boolean isAlive() { return _alive; } public void set_alive(boolean b) { _alive = b; } public void set_matchoffset(int l) { _matchoffset = l; } public void set_energy(double d) { _latestData.set_energy(d); } public void addHistory(StateData record) { _history.add(0, record); while (_history.size() > 500) { _history.remove(500); } _latestData = record; } public double[][] get_fangsGuessFactorScoreMap() { return _fangsGuessFactorScoreMap; } public void removeHistory(int i) { _history.remove(i); _latestData = (StateData) _history.get(0); } public ShootingData[] getShootingDataArray() { return (ShootingData[]) _shootinghistory.toArray(new ShootingData[0]); } public ShootingData addShootingData( double x, double y, double power, double bearing, double distance, long time, double[] angles) { ShootingData tmpfire = new ShootingData(x, y, power, bearing, distance, time, angles); _shootinghistory.add(0, tmpfire); return tmpfire; } public StateData getHistoryByTime(long time) { StateData[] states = (StateData[]) _history.toArray(new StateData[0]); for (int i = 0; i < states.length; i++) { if (states[i].get_timestamp() == time) return states[i]; } return null; } public void removeShootigData(ShootingData data) { _shootinghistory.remove(data); } public int[] getAccuracyArray() { return Accuracy; } } // public void searchBulletOrigin(Bullet bullet, long time) { // ShootingData matcheddata = null; // double power = bullet.getPower(); // double velocity = bullet.getVelocity(); // double distance; // if (_Predictcount < _PredictAngleRate.length) // _Predictcount++; // ShootingData[] firerecords = // (ShootingData[]) _shootinghistory.toArray(new ShootingData[0]); // for (int i = 0; i < firerecords.length; i++) { // long deadtime = // (long) (GameInfo.getBattleW() / firerecords[i].get_velocity()); // long gaptime = time - firerecords[i].get_stamptime(); // // if (gaptime > deadtime || gaptime < 0) { // _shootinghistory.remove(firerecords[i]); // continue; // } // distance = // MathUtil.Distance( // bullet.getX(), // bullet.getY(), // firerecords[i].get_x(), // firerecords[i].get_y()); // // long GT = Math.abs(gaptime - (int) (distance / velocity)); // // if (GT <= 2) { // matcheddata = firerecords[i]; // continue; // } // } // if (matcheddata != null) { // double bullethead = bullet.getHeadingRadians(); // double mybear = matcheddata.get_mybearing(); // double mylinear = matcheddata.get_linear(); // // double gaplinear = mylinear - mybear; // if (gaplinear < 0.0001) // return; // double gapreal = bullethead - mybear; // _PredictAngleRate[_Predictindex] = gapreal / gaplinear; // // double dist = matcheddata.get_distance(); // _PredictDistance[_Predictindex] = dist * Math.tan(gapreal); // firerecords = // (ShootingData[]) _shootinghistory.toArray(new ShootingData[0]); // for (int i = 0; i < firerecords.length; i++) { // firerecords[i].removeGPBsAll(); // mybear = firerecords[i].get_mybearing(); // double ratepredictangle = // (firerecords[i].get_linear() - mybear) // * _PredictAngleRate[_Predictindex] // + mybear; // GravPointBullet gpbullet = // new GravPointBullet( // firerecords[i].get_x(), // firerecords[i].get_y(), // firerecords[i].get_power(), // ratepredictangle, // 1.8, // firerecords[i].get_stamptime()); // GravPointManager.addGravPoint(gpbullet); // // dist = firerecords[i].get_distance(); // double distpredict = // Math.tan(_PredictDistance[_Predictindex] / dist) + mybear; // gpbullet = // new GravPointBullet( // firerecords[i].get_x(), // firerecords[i].get_y(), // firerecords[i].get_power(), // distpredict, // 1.8, // firerecords[i].get_stamptime()); // GravPointManager.addGravPoint(gpbullet); // } // _Predictindex++; // if (_Predictindex >= _Predictcount) // _Predictindex = 0; // } else { // // Debug.println("Unmatch"); // } // if (matcheddata != null) // removeFireDataRecord(matcheddata); // // } //}PK .Lp88"spoon/enemy/EnemyInfoManager.class-wspoon/enemy/EnemyInfoManagerjava/lang/Object _enemymapLjava/util/HashMap;()VCode   spoon/util/GameInfo  getAllOthers()I  ?java/util/HashMap(I)V    LineNumberTableLocalVariableTablethisLspoon/enemy/EnemyInfoManager;tmpIgetEnemyInfoByName+(Ljava/lang/String;)Lspoon/enemy/EnemyInfo;get&(Ljava/lang/Object;)Ljava/lang/Object; #$ %spoon/enemy/EnemyInfo'NameLjava/lang/String;getEnemiesArray()[Lspoon/enemy/EnemyInfo;values()Ljava/util/Collection; -. /java/util/Collection1toArray(([Ljava/lang/Object;)[Ljava/lang/Object; 34 25[Lspoon/enemy/EnemyInfo;7getEnemiesShootingDataArray()[Lspoon/enemy/ShootingData; +, ;java/util/ArrayList= > getEnemyShootingDataArray()Ljava/util/ArrayList; @A (BaddAll(Ljava/util/Collection;)Z DE >Fspoon/enemy/ShootingDataH >5spoon/enemy/ShootingData;KenemieslistLjava/util/ArrayList;igetTotalEnemiesCountsize R S ReportDeath(Ljava/lang/String;)V containsKey(Ljava/lang/Object;)Z WX Y set_alive(Z)V [\ (]enLspoon/enemy/EnemyInfo; isExistByName(Ljava/lang/String;)Z setAliveAllEarrayclearRoundData e (feis updateByScan(Ljava/lang/String;JDDDDD)V !" kisAlive()Z mn (ogetLastUpdateTime()J qr (s removeHistory u (vEnemyInfoUpdate (Lspoon/enemy/EnemyInfo;JDDDDD)V xy z(Ljava/lang/String;DDDDDJ)V | (}put8(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;  nameTimeJxDyEnergyHeadingVelocityEIget_headingRadians()D ( get_energy (@get_x (@get_y (spoon/util/MyInfogetX getY java/lang/Mathatan2(DD)D spoon/util/MathUtilAbsoluteRadians(D)D Distance(DDDD)D  senseShooting (Lspoon/enemy/EnemyInfo;DDDDDJ)V getAbsBearingRadians ( getDistance (sin cos @4 getBattleW  getBattleH spoon/enemy/StateData (JDDDDDD)V   addHistory(Lspoon/enemy/StateData;)V ( angulardifftimegap diffEnergyposxposybearingdistancedisttmpxtmpyvelocity eachangleradiuscenterxcenterylasttime lastheadinggetStationaryAngle getGuessedCircularAngle getGuessedShootingAngleByGF(Lspoon/enemy/EnemyInfo;DD)D addShootingData$(DDDDDJ[D)Lspoon/enemy/ShootingData; (spoon/util/DebugisShowSenseShootingZ java/lang/StringBuffer sense shoot time  V append(J)Ljava/lang/StringBuffer;   Distnace : ,(Ljava/lang/String;)Ljava/lang/StringBuffer;   (D)Ljava/lang/StringBuffer;  toString()Ljava/lang/String;  println V enemy shoot :  toDegrees  guessed Position x :  y : fangs bearing :  @ !TD-AbsoluteDegrees $ % diff: 'infopowertimeStationaryAngle CircularAngleGuessFactorAngle PredictAngle[D"spoon/predict/GuessFactorPredictor1getDistanceIndex(D)I 34 25get_fangsGuessFactorScoreMap()[[D 78 (9getBestGuessFactor([[DI)I ;< 2= isShowBestGF ? @dist:B distindex:D(I)Ljava/lang/StringBuffer; F G bestGF: Ijava/lang/StringKvalueOf(D)Ljava/lang/String; MN LO Qprint SV TV getVelocity X YgetHeadingRadians [ \getTargetDirection(DDD)D ^_ 2`getAngleToFireByGuessFactor(IDD)D bc 2d distindexbestGuessFactormap[[DtargetDirectionget_angularVelocity k lspoon/predict/CircularPredictornisTargetTurning(D)Z pq orgetGuessedLinearAngle t ugetCenterOfCircul%(DDDDD)Ljava/awt/geom/Point2D$Double; wx oygetAngleToFireByCircular((Ljava/awt/geom/Point2D$Double;DDDDDDD)D {| o}CenterPositionLjava/awt/geom/Point2D$Double;asin   myBearingbulletvelocityprojvupdateByBulletHit(Ljava/lang/String;D)V(Lspoon/enemy/EnemyInfo;D)V  disContainEnemy updateByHit'(Ljava/lang/String;Lrobocode/Bullet;J)V b robocode/BulletgetPower   set_energy(D)V  (bulletLrobocode/Bullet;eiEonRippleHitEnemy/(Ljava/lang/String;Lspoon/ripple/MyFireData;J)Vspoon/ripple/MyFireDataget_time r getHistoryByTime(J)Lspoon/enemy/StateData;  (   get_velocity   relativeRadians  @IisVictim b getGuessFactorScoreMap 8 (updateGuessFactor([[DID)V   addVictim V isShowEnemyGFInfo  $Update ----- ***** currrentTime = getTime r  distindex= factor= Shooting T : get_name  get_id  (equals X Lget_predictResults ()[Lspoon/predict/ShootingOrder;  atan  abs  getAccuracyArray()[I  (spoon/predict/ShootingOrder get_radians  HitRipple currrentTime = isShowEnemyGFMapFile  CurrentTime =   printToFile V absBearingAtShoot= absHitBearing= targetDir=java/text/MessageFormat{0,number,#.##} java/lang/Double@Y   java/text/Format format&(Ljava/lang/Object;)Ljava/lang/String;     dataLspoon/ripple/MyFireData;stateLspoon/enemy/StateData;absBearingAtShoot absHitBearingfactorresults[Lspoon/predict/ShootingOrder;HitRangeaccuracy[I isAllMissedtempMapmfLjava/text/MessageFormat;jobjs[Ljava/lang/Object;result?zGupdateStrikedFactor ) *updateNearFactor , -round(D)J /0 1?java/lang/Throwable5 6(java/lang/ArrayIndexOutOfBoundsException8neare*Ljava/lang/ArrayIndexOutOfBoundsException;onRippleHitFangs0(Ljava/lang/String;Lspoon/enemy/ShootingData;J)V get_mybearing ? I@ I Iget_myvelocity D IE get_myheading G IHisRippleHitFang Jn IKisShowRippleHitFangs M N RippleHitFangs-bear HitTimeP ShootTime: R get_stamptime Tr IU shootint Abs Bearing : W hit bear : Y my Dire : [ distance: ] get_distance _ I`my position : b - d- shooting shooter position when shooting : f - h velocityj IsetRippleHitFang m\ InLspoon/enemy/ShootingData;lsetAccuracyToZero(Ljava/lang/String;I)V bestindex SourceFileEnemyInfoManager.java! Z* k<Y !"#  !" ? +&(&  )*+, =0(68* 9: 2*Y?M>,+2CGW+,IJL./ 010&3*2-M7 %NOP Q 1T7 UV j+Z+&(M,^; < =>? )*_`ab <+ZB)*c i*6AmYC+E HJ H+::6 $Y2 1PR U  2WZ]("ca9("cev87 = ><;@B$C+D1E6F<GABDAGHMISJqI~LRSTQPWXYV\ )`* f g M7hiP.P j  ;ms *'v]Zmz:  'm])~Ja bfghij e#d%m'n(o+p.q1r4s5t7l>;;*;;;% t  3)"c9'kg9]gĸZk9  oc"x y|}!|"{$/~>33*3 )$  _*+l:*(*)*`b <+Z)* '*+!*+l:9,kc&>''*''+` H+(  `  z*+l:,:,g,g9,g,g9 a9   gkc6 ,+* ,,,+òƙRYȷ˶Ͷ ,,6H϶  HѶ ,,׶ڙ,:,,9o9:66%22 g6V6H2,2 g. \.`O. \.dOƙRY˶Ͷ ,,6H϶  HѶ ,]Y˶Ͷ ,,6H϶  HѶ , Y     :Y:6AYYo S::Y  26\6BYY21 S::Y  26",/24>HKNPUZ\_achknortv~ "$29<BJX^alqw     )/ 5#:$?%C&G"J!P'V([)a*h+nqt-~./0123-,46789;7= >?@0A9CT?bEh>sGyKzz*zz+s)`h4FP* aj v  $29<?-P tPP  i!"K# $$%&*dP M# 0$$%9&* 4)666+2\1'kR+2*+)+*+).RS TS%W,X3Z>44hi4 4.f  P ,  N)66)6l276+2`3R+2d3Rߧ :7CC92 `dcbagh(i4gCkElMoRNNhiN NHf 8:*P E;<) })66+2+2\13cRuvwy4hi f => i *+l:,A9,Bg,Cg9,F,Ia9  gkc6 ,LͲOYQ˶S ,VX Z \  ^ ,aYce Yg,Bi ,Ck ,lW,o*: ,a6}  #%)-/246;>ABEGIPV`flsy  \ *pq)` %4j I rs p*+lN-:O 4*t  )` uvPK .m1I1I!spoon/enemy/EnemyInfoManager.java/* * Created on 2003. 5. 10. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.enemy; import java.awt.geom.Point2D; import java.text.MessageFormat; import java.util.ArrayList; import java.util.HashMap; import robocode.Bullet; import spoon.predict.CircularPredictor; import spoon.predict.GuessFactorPredictor; import spoon.predict.ShootingOrder; import spoon.ripple.MyFireData; import spoon.util.Debug; import spoon.util.GameInfo; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class EnemyInfoManager { static HashMap _enemymap; public EnemyInfoManager() { int tmp = (int) (GameInfo.getAllOthers() * 1.5); _enemymap = new HashMap(tmp); } public EnemyInfo getEnemyInfoByName(String Name) { return (EnemyInfo) _enemymap.get(Name); } public EnemyInfo[] getEnemiesArray() { return (EnemyInfo[]) _enemymap.values().toArray(new EnemyInfo[0]); } public ShootingData[] getEnemiesShootingDataArray() { EnemyInfo[] enemies = getEnemiesArray(); ArrayList list = new ArrayList(); for (int i = 0; i < enemies.length; i++) { list.addAll(enemies[i].getEnemyShootingDataArray()); } return (ShootingData[]) list.toArray(new ShootingData[0]); } public int getTotalEnemiesCount() { return _enemymap.size(); } public void ReportDeath(String Name) { if (!_enemymap.containsKey(Name)) return; EnemyInfo en = (EnemyInfo) _enemymap.get(Name); en.set_alive(false); } public boolean isExistByName(String Name) { return _enemymap.containsKey(Name); } public void setAliveAll() { EnemyInfo[] Earray = getEnemiesArray(); for (int i = 0; i < Earray.length; i++) { Earray[i].set_alive(true); } } public void clearRoundData() { EnemyInfo[] eis = getEnemiesArray(); for (int i = 0; i < eis.length; i++) { eis[i].clearRoundData(); } } public void updateByScan( String name, long Time, double x, double y, double Energy, double Heading, double Velocity) { if (_enemymap.containsKey(name)) { EnemyInfo EI = getEnemyInfoByName(name); if (!EI.isAlive()) { EI.set_alive(true); } if (EI.getLastUpdateTime() == Time) { EI.removeHistory(0); } EnemyInfoUpdate(EI, Time, x, y, Energy, Heading, Velocity); } else { EnemyInfo EI = new EnemyInfo(name, x, y, Energy, Velocity, Heading, Time); _enemymap.put(name, EI); } } private void EnemyInfoUpdate( EnemyInfo EI, long Time, double x, double y, double Energy, double Heading, double Velocity) { if (EI.getLastUpdateTime() == Time) EI.removeHistory(0); double angulardiff = Heading - EI.get_headingRadians(); int timegap = (int) (Time - EI.getLastUpdateTime()); double diffEnergy = EI.get_energy() - Energy; if (diffEnergy > 0 && diffEnergy <= 3) { if (timegap > 1) { double posx = (x + EI.get_x()) / 2; double posy = (y + EI.get_y()) / 2; double bearing = MathUtil.AbsoluteRadians( Math.atan2(posx - MyInfo.getX(), posy - MyInfo.getY())); double distance = MathUtil.Distance(posx, posy, MyInfo.getX(), MyInfo.getY()); senseShooting( EI, posx, posy, diffEnergy, bearing, distance, (EI.getLastUpdateTime() + Time) / 2); } else { // Debug.println("Fire TIME" + Time); senseShooting( EI, EI.get_x(), EI.get_y(), diffEnergy, EI.getAbsBearingRadians(), EI.getDistance(), EI.getLastUpdateTime()); } } if (timegap > 1) { // Debug.println("Have Time Gap"); double dist = MathUtil.Distance(EI.get_x(), EI.get_y(), x, y); if (angulardiff == 0) { double tmpx = EI.get_x(); double tmpy = EI.get_y(); double velocity = dist / timegap; for (long i = EI.getLastUpdateTime() + 1; i < Time; i++) { tmpx += velocity * Math.sin(Heading); tmpy += velocity * Math.cos(Heading); // adjustOutOfBattleField if (tmpx < 0) tmpx = 20; if (tmpx > GameInfo.getBattleW()) tmpx = GameInfo.getBattleW() - 20; if (tmpy < 0) tmpy = 20; if (tmpy > GameInfo.getBattleH()) tmpy = GameInfo.getBattleH() - 20; // end - adjustOutOfBattleField EI.addHistory( new StateData( i, tmpx, tmpy, Energy, Heading, velocity, 0)); } EI.addHistory( new StateData(Time, x, y, Energy, Heading, Velocity, 0)); } else { double eachangle = angulardiff / timegap; double radius = dist / 2 / Math.sin(angulardiff / 2); double velocity = radius * eachangle; double centerx = x + Math.cos(Heading) * radius; double centery = y - Math.sin(Heading) * radius; double tmpx; double tmpy; long lasttime = EI.getLastUpdateTime(); double lastheading = EI.get_headingRadians(); for (int i = 1; i < timegap; i++) { tmpx = centerx - Math.cos(lastheading + eachangle * i) * radius; tmpy = centery + Math.sin(lastheading + eachangle * i) * radius; // adjustOutOfBattleField if (tmpx < 0) tmpx = 20; if (tmpx > GameInfo.getBattleW()) tmpx = GameInfo.getBattleW() - 20; if (tmpy < 0) tmpy = 20; if (tmpy > GameInfo.getBattleH()) tmpy = GameInfo.getBattleH() - 20; // end - adjustOutOfBattleField EI.addHistory( new StateData( lasttime + i, tmpx, tmpy, Energy, lastheading + eachangle * i, velocity, eachangle)); } EI.addHistory( new StateData( Time, x, y, Energy, Heading, Velocity, eachangle)); } } else { EI.addHistory( new StateData( Time, x, y, Energy, Heading, Velocity, angulardiff)); } } private void senseShooting( EnemyInfo info, double x, double y, double power, double bearing, double distance, long time) { double StationaryAngle = getStationaryAngle(bearing); // double LinearAngle = getGuessedLinearAngle(power, bearing); double CircularAngle = getGuessedCircularAngle(power, x, y, bearing); double GuessFactorAngle = getGuessedShootingAngleByGF(info, bearing, power); // double[] PredictAngle = // new double[] { // StationaryAngle, // LinearAngle, // CircularAngle, // GuessFactorAngle }; // double[] PredictAngle = new double[] { GuessFactorAngle }; // double[] PredictAngle = new double[] { GuessFactorAngle, LinearAngle }; double[] PredictAngle = // new double[] { GuessFactorAngle, CircularAngle,StationaryAngle }; new double[] { GuessFactorAngle, CircularAngle}; // TODO info.addShootingData( x, y, power, bearing, distance, time, PredictAngle); if (Debug.isShowSenseShooting) { Debug.println( "\nsense shoot time " + time + " Distnace : " + distance); Debug.println("enemy shoot : " + Math.toDegrees(GuessFactorAngle)); Debug.println("guessed Position x : " + x + " y : " + y); Debug.println( "fangs bearing : " + MathUtil.AbsoluteDegrees(Math.toDegrees(bearing + Math.PI)) + " diff: " + Math.toDegrees(GuessFactorAngle - (bearing + Math.PI))); } } private double getStationaryAngle(double bearing) { return bearing + Math.PI; } private double getGuessedShootingAngleByGF( EnemyInfo info, double bearing, double power) { int distindex = GuessFactorPredictor.getDistanceIndex(info.getDistance()); // TODO :: distance е int bestGuessFactor = GuessFactorPredictor.getBestGuessFactor( info.get_fangsGuessFactorScoreMap(), distindex); if (Debug.isShowBestGF) { Debug.println( "dist:" + info.getDistance() + " distindex:" + distindex + " bestGF: " + bestGuessFactor); double[][] map = info.get_fangsGuessFactorScoreMap(); for (int i = 0; i < map[0].length; i++) { Debug.print(map[distindex][i] + " "); } Debug.println(""); } double targetDirection = GuessFactorPredictor.getTargetDirection( MyInfo.getVelocity(), MyInfo.getHeadingRadians(), bearing + Math.PI); return GuessFactorPredictor.getAngleToFireByGuessFactor( bestGuessFactor, bearing + Math.PI, targetDirection); } private double getGuessedCircularAngle( double power, double x, double y, double bearing) { if (!CircularPredictor.isTargetTurning(MyInfo.get_angularVelocity())) return getGuessedLinearAngle(power, bearing); //  ƴϸ Point2D.Double CenterPosition = CircularPredictor.getCenterOfCircul( MyInfo.getHeadingRadians(), MyInfo.getVelocity(), MyInfo.get_angularVelocity(), MyInfo.getX(), MyInfo.getY()); return CircularPredictor.getAngleToFireByCircular( CenterPosition, power, MyInfo.get_angularVelocity(), MyInfo.getHeadingRadians(), MyInfo.getX(), MyInfo.getY(), x, y); } private double getGuessedLinearAngle(double power, double bearing) { double myBearing = MathUtil.AbsoluteRadians(bearing + Math.PI); double bulletvelocity = 20 - 3 * power; double projv = Math.sin(MyInfo.getHeadingRadians() - myBearing) * MyInfo.getVelocity(); return MathUtil.AbsoluteRadians( myBearing + Math.asin(projv / bulletvelocity)); } public void updateByBulletHit(String Name, double d) { EnemyInfo EI = getEnemyInfoByName(Name); updateByBulletHit(EI, d); } private boolean isContainEnemy(String Name) { return _enemymap.containsKey(Name); } public void updateByHit(String name, Bullet bullet, long time) { if (isContainEnemy(name)) { EnemyInfo ei = (EnemyInfo) getEnemyInfoByName(name); double E = ei.get_energy(); ei.set_energy(E + 3 * bullet.getPower()); // TODO :: searchBulletOrigin ϱ // ei.searchBulletOrigin(bullet, time); } } public void updateByBulletHit(EnemyInfo EI, double E) { EI.set_energy(E); } public void onRippleHitEnemy(String name, MyFireData data, long time) { EnemyInfo info = getEnemyInfoByName(name); StateData state = info.getHistoryByTime(data.get_time()); if (state == null) { return; } /* Guess Factor Update */ double absBearingAtShoot = MathUtil.AbsoluteRadians( Math.atan2( state.get_x() - data.get_x(), state.get_y() - data.get_y())); double absHitBearing = MathUtil.AbsoluteRadians( Math.atan2( info.get_x() - data.get_x(), info.get_y() - data.get_y())); double targetDirection = GuessFactorPredictor.getTargetDirection( state.get_velocity(), state.get_headingRadians(), absBearingAtShoot); int factor = (int) (targetDirection * Math.toDegrees( MathUtil.relativeRadians( absHitBearing - absBearingAtShoot)) + 50); if (!data.isVictim(name)) { updateGuessFactor( info.getGuessFactorScoreMap(), factor, MathUtil.Distance( state.get_x(), state.get_y(), data.get_x(), data.get_y())); data.addVictim(name); if (Debug.isShowEnemyGFInfo) { Debug.println( "Update ----- ***** " + " currrentTime = " + GameInfo.getTime() + " distindex=" + GuessFactorPredictor.getDistanceIndex( MathUtil.Distance( state.get_x(), state.get_y(), data.get_x(), data.get_y())) + " factor=" + factor + "Shooting T : " + data.get_time()); } // TODO :: /* Accuracy Update */ if (data.get_name().equals(info.get_id())) { ShootingOrder[] results = data.get_predictResults(); double distance = MathUtil.Distance( info.get_x(), info.get_y(), data.get_x(), data.get_y()); double HitRange = Math.abs(Math.atan(20 / distance)); int[] accuracy = info.getAccuracyArray(); boolean isAllMissed = true; for (int i = 0; i < results.length; i++) { if (results[i] != null && Math.abs(results[i].get_radians() - absHitBearing) <= HitRange) { isAllMissed = false; } } if (!isAllMissed) { for (int i = 0; i < results.length; i++) { // Debug.println(i); if (results[i] != null && Math.abs(results[i].get_radians() - absHitBearing) <= HitRange) { // Debug.println("Hit " + i); if (accuracy[i] < 5) { accuracy[i]++; // Debug.println("UP " + i); } } else { // Debug.println("Miss " + i); if (accuracy[i] > 0) { accuracy[i]--; // Debug.println("Dwon " + i); // Missed } } } } } // if (count == 0) { // Debug.println( // " ALL Miss ALL Miss ALL Miss ALL Miss ALL Miss \n"); // for (int i = 0; i < accuracy.length; i++) // if (accuracy[i] != 0) // accuracy[i]++; // } /*Debug */ if (Debug.isShowEnemyGFInfo) { Debug.println( "HitRipple" + " currrentTime = " + GameInfo.getTime() + " distindex=" + GuessFactorPredictor.getDistanceIndex( MathUtil.Distance( state.get_x(), state.get_y(), data.get_x(), data.get_y())) + " factor=" + factor + "Shooting T : " + data.get_time()); } if (Debug.isShowEnemyGFMapFile) { Debug.printToFile( "CurrentTime = " + GameInfo.getTime() + " distindex=" + GuessFactorPredictor.getDistanceIndex( MathUtil.Distance( state.get_x(), state.get_y(), data.get_x(), data.get_y())) + " factor=" + factor + "Shooting T : " + data.get_time() + "\n"); Debug.printToFile( "absBearingAtShoot=" + absBearingAtShoot + " absHitBearing=" + absHitBearing + " targetDir=" + targetDirection + "\n"); double[][] tempMap = info.getGuessFactorScoreMap(); MessageFormat mf = new MessageFormat("{0,number,#.##}"); for (int j = 0; j < tempMap[0].length; j++) { Object[] objs = { new Double(j / 100.0)}; String result = mf.format(objs); Debug.printToFile(" " + result + " "); } Debug.printToFile("\n"); for (int i = 0; i < tempMap.length; i++) { for (int j = 0; j < tempMap[i].length; j++) { Object[] objs = { new Double(tempMap[i][j])}; String result = mf.format(objs); Debug.printToFile(" " + result + " "); } Debug.printToFile("\n"); } Debug.printToFile("\n"); } } } private void updateGuessFactor( double[][] map, int factor, double distance) { //TODO SIDE EFFECT int distindex = GuessFactorPredictor.getDistanceIndex(distance); for (int i = 0; i < map[0].length; i++) { map[distindex][i] *= 0.99; } updateStrikedFactor(map, factor, distance); updateNearFactor(map, factor, distance); } private void updateNearFactor( double[][] map, int factor, double distance) { int distindex = GuessFactorPredictor.getDistanceIndex(distance); long near = Math.round( Math.atan( 30 / GuessFactorPredictor.getDistanceIndex(distance))); try { for (int i = 1; i < near; i++) { map[distindex][factor + i] = 0.1; map[distindex][factor - i] = 0.1; } } catch (ArrayIndexOutOfBoundsException e) { Debug.println(e.toString()); } } private void updateStrikedFactor( double[][] map, int factor, double distance) { int distindex = GuessFactorPredictor.getDistanceIndex(distance); if (factor >= 0 && factor < map[0].length) map[distindex][factor] += 0.1; } public void onRippleHitFangs(String name, ShootingData data, long l) { EnemyInfo info = getEnemyInfoByName(name); double absBearingAtShoot = data.get_mybearing(); double absHitBearing = MathUtil.AbsoluteRadians( Math.atan2( MyInfo.getX() - data.get_x(), MyInfo.getY() - data.get_y())); double targetDirection = GuessFactorPredictor.getTargetDirection( data.get_myvelocity(), data.get_myheading(), absBearingAtShoot); int factor = (int) (targetDirection * Math.toDegrees( MathUtil.relativeRadians( absHitBearing - absBearingAtShoot)) + 50); // int distindex = // GuessFactorPredictor.getDistanceIndex(data.get_distance()); if (!data.isRippleHitFang()) { if (Debug.isShowRippleHitFangs) { Debug.println( " RippleHitFangs-bear HitTime" + GameInfo.getTime() + " ShootTime: " + data.get_stamptime() + "\nshootint Abs Bearing : " + Math.toDegrees(absBearingAtShoot) + " hit bear : " + Math.toDegrees(absHitBearing) + " my Dire : " + targetDirection + " distance: " + data.get_distance()); Debug.println( "my position : " + MyInfo.getX() + " - " + MyInfo.getY()); Debug.println( " shooting shooter position when shooting : " + data.get_x() + " - " + data.get_y() + " velocity" + data.get_velocity()); Debug.println(""); } data.setRippleHitFang(true); updateGuessFactor( info.get_fangsGuessFactorScoreMap(), factor, data.get_distance()); } } public void setAccuracyToZero(String name, int bestindex) { EnemyInfo info = getEnemyInfoByName(name); int[] accuracy = info.getAccuracyArray(); accuracy[bestindex] = 0; // bad smell } // double absHitRadians = // MathUtil.AbsoluteRadians( // Math.atan2( // MyInfo.getX() - get_originX(), // MyInfo.getY() - get_originY())); // double gapHitRadians = // MathUtil.relativeRadians(absHitRadians - get_absBearing()); // // double targetDirection = 1; // if (get_selfVelocityWhenShooting() != 0) { // targetDirection = // get_selfVelocityWhenShooting() // * Math.sin(get_selfAbsHeadingRadian() - get_absBearing()); // } // // targetDirection /= Math.abs(targetDirection); } PK .\oospoon/enemy/ShootingData.class-hspoon/enemy/ShootingDatajava/lang/Object _stamptimeJ_powerD _velocity_x_y _mybearing _distance _guessAngles[D _myvelocity _myheadingisRippleHitFangZ (DDDDDJ[D)VCode()V           @4@  &@ !TD-spoon/util/MathUtil*AbsoluteRadians(D)D ,- +.  0  2  4spoon/util/MyInfo6 getVelocity()D 89 7:  <getHeadingRadians >9 7?  A  CLineNumberTableLocalVariableTablethisLspoon/enemy/ShootingData;posxposyPowerBearingdistancetimeangles getDamage@@damage get_power get_stamptime()J get_velocityget_xget_y get_mybearing get_distanceget_guessAngles()[D get_myheadingget_myvelocity()ZsetRippleHitFang(Z)Vb SourceFileShootingData.java!      W** *'*)*!*"$*!kg'*(c/1* 3* 5*;=*@B*DE6 " #$%&*'7(=)C-J.Q/V0FRWGHWIWJWKWLWM WN WO P9a!*!QkH*!'S*!gkcH'E3 457F!GH UV9/*!E;F GHWX/*E?F GHY9/*'ECF GHZ9/*EGF GH[9/*EKF GH\9/*1EOF GH]9/*3ESF GH^_/*5EVF GH`9/*BEZF GHa9/*=E^F GHb/*DEbF GHcd>*DE fgFGHefgPK .hspoon/enemy/ShootingData.java/* * Created on May 28, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.enemy; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class ShootingData { private long _stamptime; private double _power, _velocity, _x, _y, _mybearing, _distance; private double[] _guessAngles; private double _myvelocity, _myheading; private boolean isRippleHitFang; public ShootingData( double posx, double posy, double Power, double Bearing, double distance, long time, double[] angles) { _stamptime = time; _x = posx; _y = posy; _power = Power; _velocity = 20 - 3 * _power; _mybearing = MathUtil.AbsoluteRadians(Bearing + Math.PI); _distance = distance; _guessAngles = angles; // Debug.println("Make Shooting Data Time ::: " + time); _myvelocity = MyInfo.getVelocity(); _myheading = MyInfo.getHeadingRadians(); isRippleHitFang = false; } public double getDamage() { double damage = _power * 4; if (_power > 1) { damage += 2 * (_power - 1); } return damage; } public double get_power() { return _power; } public long get_stamptime() { return _stamptime; } public double get_velocity() { return _velocity; } public double get_x() { return _x; } public double get_y() { return _y; } public double get_mybearing() { return _mybearing; } public double get_distance() { return _distance; } public double[] get_guessAngles() { return _guessAngles; } public double get_myheading() { return _myheading; } public double get_myvelocity() { return _myvelocity; } public boolean isRippleHitFang() { return isRippleHitFang; } public void setRippleHitFang(boolean b) { isRippleHitFang = b; } }PK x.:go>>spoon/enemy/StateData.class-;spoon/enemy/StateDatajava/lang/Object _timestampJ_xD_y_energy_headingRadians _velocity_angularvelocity (JDDDDDD)VCode()V                 LineNumberTableLocalVariableTablethisLspoon/enemy/StateData;timexyEnergyHeadingVelocityangle get_energy()Dget_headingRadians get_timestamp()J get_velocityget_xget_y set_energy(D)Vdget_angularvelocity SourceFileStateData.java!      -***)*** * * !"&  !"# $&%,&#R-$%-&-'-(-)-* -+ -, -./*",# $%/./*"3# $%01/*":# $%2./*"A# $%3./*"H# $%4./*"O# $%56>*'" VW#$%78./*!"]# $%9:PK x.Bvspoon/enemy/StateData.java/* * Created on 2003. 5. 17. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.enemy; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class StateData { long _timestamp; double _x, _y; double _energy; double _headingRadians; double _velocity; double _angularvelocity; public StateData( long time, double x, double y, double Energy, double Heading, double Velocity, double angle) { _timestamp = time; _x = x; _y = y; _energy = Energy; _headingRadians = Heading; _velocity = Velocity; _angularvelocity = angle; } /** * @return */ public double get_energy() { return _energy; } /** * @return */ public double get_headingRadians() { return _headingRadians; } /** * @return */ public long get_timestamp() { return _timestamp; } /** * @return */ public double get_velocity() { return _velocity; } /** * @return */ public double get_x() { return _x; } /** * @return */ public double get_y() { return _y; } /** * @param d */ public void set_energy(double d) { _energy = d; } /** * @return */ public double get_angularvelocity() { return _angularvelocity; } } PK .JJ&spoon/scaner/OldSearchCalculater.class-m spoon/scaner/OldSearchCalculaterjava/lang/Object _enemymgrLspoon/enemy/EnemyInfoManager; turnRadiansDfindallZ!(Lspoon/enemy/EnemyInfoManager;)VCode()V    LineNumberTableLocalVariableTablethis"Lspoon/scaner/OldSearchCalculater;EMGR getOldScaned()Lspoon/enemy/EnemyInfo;spoon/enemy/EnemyInfoManagergetEnemiesArray()[Lspoon/enemy/EnemyInfo;  spoon/util/GameInfo"getTime()J $% #& (spoon/enemy/EnemyInfo*isAlive()Z ,- +.getLastUpdateTime 0% +1 enemies[Lspoon/enemy/EnemyInfo;tmpEnemyLspoon/enemy/EnemyInfo;scanRobo scanedtimeJnowiIgaptimegetScanRadians()D getAllOthers()I BC #DgetTotalEnemiesCount FC G@ !TD- getRoundNum KC #L  PgetAbsBearingRadians RA +Sspoon/util/MyInfoUgetRadarHeadingRadians WA VXspoon/util/MathUtilZrelativeRadians(D)D \] [^  `adjustTurnRadians b] c@!TD-oldrobo?R8-seR SourceFileOldSearchCalculater.java!   F **+      _*LN 7'7*)6:+2M,/+,2e7  3 ,N 7*)+-B !"$%&$'+(4)=*E+G,N/S%]2R_W56$278 U98P:;K<;A=>4?; @A YE*HIM'NI*QL+*+TYg_a*)*) **adeB6 79!:%<*>.?/A3B6A7@:?@DEFLGUIY*/g8b] W' 'hcH 'hgH'MNPQjklPK .%/u%spoon/scaner/OldSearchCalculater.java/* * Created on May 14, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.scaner; import spoon.enemy.EnemyInfo; import spoon.enemy.EnemyInfoManager; import spoon.util.GameInfo; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class OldSearchCalculater { EnemyInfoManager _enemymgr; double turnRadians; boolean findall; public OldSearchCalculater(EnemyInfoManager EMGR) { _enemymgr = EMGR; } public EnemyInfo getOldScaned() { EnemyInfo[] enemies = _enemymgr.getEnemiesArray(); EnemyInfo tmpEnemy, scanRobo = null; long scanedtime = -1; long now = GameInfo.getTime(); findall = true; for (int i = 0; i < enemies.length; i++) { tmpEnemy = enemies[i]; if (tmpEnemy.isAlive()) { long gaptime = now - tmpEnemy.getLastUpdateTime(); if (gaptime < 12) { if (gaptime > scanedtime) { scanRobo = tmpEnemy; scanedtime = gaptime; } } else findall = false; } } return scanRobo; } public double getScanRadians() { if (GameInfo.getAllOthers() != _enemymgr.getTotalEnemiesCount()) return Math.PI; if (GameInfo.getRoundNum() > 0 && GameInfo.getTime() < 9) return Math.PI; EnemyInfo oldrobo = getOldScaned(); if (oldrobo != null) turnRadians = MathUtil.relativeRadians( oldrobo.getAbsBearingRadians() - MyInfo.getRadarHeadingRadians()); else findall = false; if (findall) return adjustTurnRadians(turnRadians); else return Math.PI * 2; } private double adjustTurnRadians(double R) { if (R >= 0) R += Math.PI / 6; else R -= Math.PI / 6; return R; } } PK .llspoon/scaner/Scanner.class-5spoon/scaner/Scannerjava/lang/Object_fangLspoon/IrYoung; _enemymgrLspoon/enemy/EnemyInfoManager; _oldsearcher"Lspoon/scaner/OldSearchCalculater;(Lspoon/IrYoung;)VCode()V     spoon/IrYoungenemymgr     spoon/scaner/OldSearchCalculater!(Lspoon/enemy/EnemyInfoManager;)V   LineNumberTableLocalVariableTablethisLspoon/scaner/Scanner;fscangetScanRadians()D '( )robocode/_AdvancedRadiansRobot+setTurnRadarRightRadians(D)V -. ,/radiansD SourceFile Scanner.java!   d **+**Y* ! " #$ %& M* *H*'0! "#$ 1234PK .ispoon/scaner/Scanner.java/* * Created on 2003. 5. 10. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.scaner; import spoon.IrYoung; import spoon.enemy.EnemyInfoManager; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class Scanner { IrYoung _fang; EnemyInfoManager _enemymgr; OldSearchCalculater _oldsearcher; public Scanner(IrYoung f) { _fang = f; _enemymgr = IrYoung.enemymgr; _oldsearcher = new OldSearchCalculater(_enemymgr); } public void scan() { double radians = _oldsearcher.getScanRadians(); _fang.setTurnRadarRightRadians(radians); } } PK .hC99 spoon/driver/AGMCalculater.class-spoon/driver/AGMCalculaterjava/lang/ObjectsumforceDcountJ_gpmgr"Lspoon/gravpoint/GravPointManager;displayZ()VCode LineNumberTableLocalVariableTable%(Lspoon/gravpoint/GravPointManager;)V   thisLspoon/driver/AGMCalculater;GPM calculate()Lspoon/driver/AGMResult; spoon/gravpoint/GravPointManager getGPArray()[Lspoon/gravpoint/GravPoint; !" #spoon/util/Debug% isShowGPS ' &( == AGMCalculate Result ==*println(Ljava/lang/String;)V ,- &.spoon/gravpoint/GravPoint0get_absBearingRadians()D 23 14getForce 63 17java/lang/Math9sin(D)D ;< :=cos ?< :@java/lang/StringBufferBjava/lang/StringDvalueOf(I)Ljava/lang/String; FG EH - CJ force Lappend,(Ljava/lang/String;)Ljava/lang/StringBuffer; NO CP(D)Ljava/lang/StringBuffer; NR CS angle U toDegrees W< :X x Zget_x \3 1] y _get_y a3 1btoString()Ljava/lang/String; de Cf@|3!atan2(DD)D jk :lspoon/util/MathUtilnAbsoluteRadians p< oqDistance(DDDD)D st ou force : w angle : yspoon/driver/AGMResult{(DD)V } |~xforceyforceanglegps[Lspoon/gravpoint/GravPoint;iItmpforceforce SourceFileAGMCalculater.java!  ) F **+     HJ*$:)+/6259289 ' >kcH) AkcJ)LCYIKMQ TVQYT[Q2^T`Q2cTg/h)'mgr9')v9)$CYxKTzQYTg/|Yz !$%(&2'=(H*N.Z/_0d1i2q3v456.,$<;:=>@?B\ (r< 2e 3PK .J^^spoon/driver/AGMCalculater.java/* * Created on 2003. 5. 11. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.driver; import spoon.gravpoint.*; import spoon.util.*; /** * @author Chunsik In Spoon.Korea.ac.kr * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class AGMCalculater { double sumforce; long count; GravPointManager _gpmgr; public static boolean display = false; public AGMCalculater(GravPointManager GPM) { _gpmgr = GPM; } public AGMResult calculate() { double xforce = 0, yforce = 0, angle; GravPoint[] gps = _gpmgr.getGPArray(); if (Debug.isShowGPS) { Debug.println("\n\n== AGMCalculate Result =="); } for (int i = 0; i < gps.length; i++) { angle = gps[i].get_absBearingRadians(); double tmpforce = gps[i].getForce(); xforce += tmpforce * Math.sin(angle); yforce += tmpforce * Math.cos(angle); if (Debug.isShowGPS) { /* for Debug*/ Debug.println( /* gps[i].toString()*/ i + " force " + tmpforce + " angle " + Math.toDegrees(angle) + " x " + gps[i].get_x() + " y " + gps[i].get_y()); } } angle = MathUtil.AbsoluteRadians( Math.PI * 3 / 2 - Math.atan2(yforce, xforce)); double force = MathUtil.Distance(0, 0, xforce, yforce); if (Debug.isShowGPS) { Debug.println( "\nforce : " + force + " angle : " + Math.toDegrees(angle)); } return new AGMResult(force, angle); } } PK s.YS**spoon/driver/AGMResult.class-spoon/driver/AGMResultjava/lang/Object_forceD_angle(DD)VCode()V      LineNumberTableLocalVariableTablethisLspoon/driver/AGMResult;RANGEANGLE get_angle()D get_force SourceFileAGMResult.java!  Y* *'*)   /*  /*" PK r.@spoon/driver/AGMResult.java/* * Created on May 10, 2003 * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.driver; /** * @author cse19 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class AGMResult { double _force, _angle; public AGMResult(double RANGE, double ANGLE) { _force = RANGE; _angle = ANGLE; } /** * @return */ public double get_angle() { return _angle; } /** * @return */ public double get_force() { return _force; } } PK .m: spoon/driver/Driver.class-spoon/driver/Driverjava/lang/Object_fangLspoon/IrYoung;_agmcalcLspoon/driver/AGMCalculater;MeleeZiI(Lspoon/IrYoung;)VCode()V     spoon/driver/AGMCalculater spoon/IrYoung gravpointmgr"Lspoon/gravpoint/GravPointManager;  %(Lspoon/gravpoint/GravPointManager;)V    "LineNumberTableLocalVariableTablethisLspoon/driver/Driver;fdrive calculate()Lspoon/driver/AGMResult; *+ ,spoon/util/Debug.isShowDriverCall 0 /1java/lang/StringBuffer3time : 5(Ljava/lang/String;)V 7 48spoon/util/GameInfo:getTime()J <= ;>append(J)Ljava/lang/StringBuffer; @A 4B i : D,(Ljava/lang/String;)Ljava/lang/StringBuffer; @F 4G(I)Ljava/lang/StringBuffer; @I 4JtoString()Ljava/lang/String; LM 4Nprintln P7 /Qspoon/driver/AGMResultS get_force()D UV TWisMelee()Z YZ [spoon/tactician/Tactician] get_target()Lspoon/enemy/EnemyInfo; _` ^aspoon/enemy/EnemyInfocgetAbsBearingRadians eV df get_angle hV Tispoon/util/MathUtilkrelativeRadians(D)D mn lo?!TD-AbsoluteRadians sn lt@@Y(DD)V z T{@java/lang/Mathrandom V @ ?robocode/AdvancedRobotsetMaxVelocity(D)V setMaxTurnRate goTO(Lspoon/driver/AGMResult;)V  agmresultLspoon/driver/AGMResult;forceD toradians targetbear tmpradianstargetLspoon/enemy/EnemyInfo;tmplimitVlimitTspoon/util/MyInfogetHeadingRadians V @@@ !TD-!TD-robocode/_AdvancedRadiansRobotsetTurnRightRadians setAhead DOanglerange direction setMelee(Z)Vb SourceFile Driver.java!  a***+*Y!#$ !%&'()*#-L2+4Y69?CEH*YZ`KOR+XI9*\jb:  ` g9+jgp9qcu9qgu9+jgpvocu9 TYx |L}}kc9 vkc kg9 * * *+$!$%&6);*>AECJDOFVJ]I`HbKiMrLwN~PO]_^`^]\[afghijk%f &';>VVbJJb ,  S+jgpI96(q(gI6( (cI6k9*(*$>qp o rswx"y(z0{6|9AIR%4S&'S GB? YZ/*$% &'>*$ %&' PK .F$ spoon/driver/Driver.java/* * Created on 2003. 5. 10. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.driver; import spoon.IrYoung; import spoon.enemy.EnemyInfo; import spoon.tactician.Tactician; import spoon.util.Debug; import spoon.util.GameInfo; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class Driver { IrYoung _fang; AGMCalculater _agmcalc; boolean Melee; int i = 0; public Driver(IrYoung f) { _fang = f; _agmcalc = new AGMCalculater(IrYoung.gravpointmgr); } public void drive() { AGMResult agmresult = _agmcalc.calculate(); if (Debug.isShowDriverCall) { Debug.println("time : " + GameInfo.getTime() + " i : " + i++); } double force = agmresult.get_force(); double toradians = 0; double targetbear; double tmpradians; // Debug.println("agm force " + force); // if (force < 0.1) { // EnemyInfo target = Tactician.get_target(); // if (target != null) { // // targetbear = target.get_absBearingRadians(); // // tmpradians = // MathUtil.relativeRadians( // MyInfo.getHeadingRadians() - targetbear); // if (tmpradians >= 0) { // toradians = // MathUtil.AbsoluteRadians(targetbear + Math.PI / 2); // } else if (tmpradians < 0) { // toradians = // MathUtil.AbsoluteRadians(targetbear - Math.PI / 2); // } // agmresult = new AGMResult(100, toradians); // } // } else { if (!isMelee()) { EnemyInfo target = Tactician.get_target(); if (target != null) { targetbear = target.getAbsBearingRadians(); tmpradians = MathUtil.relativeRadians( agmresult.get_angle() - targetbear); if (tmpradians >= 0) { toradians = MathUtil.AbsoluteRadians(targetbear + Math.PI / 2); } else if (tmpradians < 0) { toradians = MathUtil.AbsoluteRadians(targetbear - Math.PI / 2); } // Debug.println( // "T-bear : " // + Math.toDegrees(targetbear) // + " tmpradians : " // + Math.toDegrees(tmpradians) // + " HMS heading : " // + Math.toDegrees(toradians) // + " agm angle " // + Math.toDegrees(agmresult.get_angle())); double tmp = MathUtil.AbsoluteRadians( toradians + MathUtil.relativeRadians( agmresult.get_angle() - toradians) / 2); agmresult = new AGMResult(100, tmp); // } } } double limitV = 4 + 4 * Math.random(); double limitT = ((8 + 2 * Math.random()) - 0.75 * limitV); _fang.setMaxVelocity(limitV); _fang.setMaxTurnRate(limitT); goTO(agmresult); } public void goTO(AGMResult DO) { double angle = MathUtil.relativeRadians( DO.get_angle() - MyInfo.getHeadingRadians()); double range = 1000; int direction = 1; // Debug.println("Goto angle " + Math.toDegrees(DO.get_angle())); if (angle > Math.PI / 2) { angle -= Math.PI; direction = -1; } else if (angle < -Math.PI / 2) { angle += Math.PI; direction = -1; } range *= direction; _fang.setTurnRightRadians(angle); _fang.setAhead(range); } public boolean isMelee() { return Melee; } public void setMelee(boolean b) { Melee = b; } } PK .?$MMspoon/gravpoint/GravPoint.class-Lspoon/gravpoint/GravPointjava/lang/Object _strengthD_x_y_factor()VCode  LineNumberTableLocalVariableTablethisLspoon/gravpoint/GravPoint;(DDDD)V        StrengthXYFactorgetForce()D get_strength "! #spoon/util/MyInfo%getX '! &(getY *! &+get_x -! .get_y 0! 1spoon/util/MathUtil3Distance(DDDD)D 56 47 get_factor 9! :java/lang/Math<pow(DD)D >? =@get_absBearingRadiansatan2 C? =DAbsoluteRadians(D)D FG 4H SourceFileGravPoint.java!   3*     ***'*)* 4 ! h *$),*/*28*;Ao& "# $%!&  B! E*/)g*2,gEI *) "! /*. -! /*2 0! /*6 9! /*: JKPK .g@spoon/gravpoint/GravPoint.java/* * Created on 2003. 5. 11. * * To change the template for this generated file go to * Window>Preferences>Java>Code Generation>Code and Comments */ package spoon.gravpoint; import spoon.util.MathUtil; import spoon.util.MyInfo; /** * @author Administrator * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class GravPoint { double _strength, _x, _y, _factor; public GravPoint() { } public GravPoint(double Strength, double X, double Y, double Factor) { _factor = Factor; _strength = Strength; _x = X; _y = Y; } public double getForce() { return get_strength() / Math.pow( MathUtil.Distance( MyInfo.getX(), MyInfo.getY(), get_x(), get_y()), get_factor()); } public double get_absBearingRadians() { return MathUtil.AbsoluteRadians( Math.atan2(get_x() - MyInfo.getX(), get_y() - MyInfo.getY())); } public double get_strength() { return _strength; } public double get_x() { return _x; } public double get_y() { return _y; } public double get_factor() { return _factor; } } PK .-||&spoon/gravpoint/GravPointManager.class- spoon/gravpoint/GravPointManagerjava/lang/Object_mapStrengthNearFromWallD_mapStrengthFarFromWall_gplistLjava/util/ArrayList;leadxleady leadStrength leadFactor_defaultLeadStrength_defaultLeadFactormeleeZ()VCode    LineNumberTableLocalVariableTable setLeadPoint(DDDD)V    !  #  %xystrengthfactor(DD)V  , . /@@  3@  7  9java/util/ArrayList; </  >this"Lspoon/gravpoint/GravPointManager; getGPArray()[Lspoon/gravpoint/GravPoint;clear D <EisMelee()Z GH IgatherCenterGP K L gatherLeadGP N O gatherEnemyGP Q R@@gatherBulletGP V WgetAllGPsOfMap()Ljava/util/ArrayList; YZ [addAll(Ljava/util/Collection;)Z ]^ <_spoon/gravpoint/GravPointatoArray(([Ljava/lang/Object;)[Ljava/lang/Object; cd <e[Lspoon/gravpoint/GravPoint;gconvertEnemyInfoToGravPoint4(Lspoon/enemy/EnemyInfo;)Lspoon/gravpoint/GravPoint;spoon/enemy/EnemyInfokget_x()D mn loget_y qn lr@@@ . bxinfoLspoon/enemy/EnemyInfo;convertShootingDataToGravPoint(Lspoon/enemy/ShootingData;)Vspoon/enemy/ShootingData~get_guessAngles()[D  getDamage n @O@ get_velocity n spoon/util/GameInfogetTime()J  get_stamptime  ojava/lang/Mathsin(D)D rcos add(Ljava/lang/Object;)Z <dataLspoon/enemy/ShootingData;angles[DflyingdistanceposxposyiI spoon/IrYoungenemymgrLspoon/enemy/EnemyInfoManager; spoon/enemy/EnemyInfoManagergetEnemiesShootingDataArray()[Lspoon/enemy/