private final Bullet setFireImpl(double power) { if (Double.isNaN(power)) { println("SYSTEM: You cannot call fire(NaN)"); return null; } if (getGunHeatImpl() > 0 || getEnergyImpl() == 0) { return null; } power = min(getEnergyImpl(), min(max(power, Rules.MIN_BULLET_POWER), Rules.MAX_BULLET_POWER)); Bullet bullet; BulletCommand wrapper; Event currentTopEvent = eventManager.getCurrentTopEvent(); nextBulletId++; if (currentTopEvent != null && currentTopEvent.getTime() == status.getTime() && !statics.isAdvancedRobot() && status.getGunHeadingRadians() == status.getRadarHeadingRadians() && ScannedRobotEvent.class.isAssignableFrom(currentTopEvent.getClass())) { // this is angle assisted bullet ScannedRobotEvent e = (ScannedRobotEvent) currentTopEvent; double fireAssistAngle = Utils.normalAbsoluteAngle(status.getHeadingRadians() + e.getBearingRadians()); bullet = new Bullet( fireAssistAngle, getX(), getY(), power, statics.getName(), null, true, nextBulletId); wrapper = new BulletCommand(power, true, fireAssistAngle, nextBulletId); } else { // this is normal bullet bullet = new Bullet( status.getGunHeadingRadians(), getX(), getY(), power, statics.getName(), null, true, nextBulletId); wrapper = new BulletCommand(power, false, 0, nextBulletId); } firedEnergy += power; firedHeat += Rules.getGunHeat(power); commands.getBullets().add(wrapper); bullets.put(nextBulletId, bullet); return bullet; }
/** onScannedRobot: What to do when you see another robot */ public void onScannedRobot(ScannedRobotEvent e) { System.out.println("START at : " + getTime() + " onScannedRobot----------------------------"); String nnn = e.getName(); System.out.println("scan " + nnn); double eneX = getX() + Math.sin(e.getBearingRadians() + Math.toRadians(getHeading())) * e.getDistance(); double eneY = getY() + Math.cos(e.getBearingRadians() + Math.toRadians(getHeading())) * e.getDistance(); Enemy_info enem = null; if (!isTeammate(nnn)) { // 味方への情報送信 try { broadcastMessage( nnn + ", " + e.getBearing() + ", " + e.getBearingRadians() + ", " + e.getDistance() + ", " + e.getEnergy() + ", " + e.getHeading() + ", " + e.getHeadingRadians() + ", " + e.getVelocity() + ", " + eneX + ", " + eneY); } catch (IOException ignored) { } // スキャンした車両がLocal敵リストにいるかどうかのフラグ boolean flag = false; System.out.println("send scanned info"); // スキャンした敵がLocal敵リストの中に存在するか for (Enemy_info temp : enes) { if (nnn.equals(temp.get_en_name())) { flag = true; enem = temp; // Local敵リストのアップデート temp.updateInformation( e.getBearing(), e.getBearingRadians(), e.getDistance(), e.getEnergy(), e.getHeading(), e.getHeadingRadians(), e.getVelocity(), eneX, eneY); System.out.println(" update scanned Info"); } } // スキャンした敵がLocal敵リストの中に存在しない場合 if (!flag) { // Local敵リストに新規追加 enem = new Enemy_info( nnn, e.getBearing(), e.getBearingRadians(), e.getDistance(), e.getEnergy(), e.getHeading(), e.getHeadingRadians(), e.getVelocity(), eneX, eneY); enes.add(enem); System.out.println(" add scanned info"); } if (enemy_detected == false) { // 共通の敵が設定されていない場合 enemy_detected = true; target_enemy = enem; try { broadcastMessage("Kill , " + target_enemy.get_en_name() + ", !!"); } catch (IOException ignored) { } } if (enemy_detected == true) { try { double enemyX = target_enemy.get_en_expX(); double enemyY = target_enemy.get_en_expY(); setTurnRadarLeftRadians(getRadarTurnRemainingRadians()); System.out.println("abs : eX " + enemyX + " : " + "eY " + enemyY); // 共通の敵が設定されている場合 double enemyBearing = Math.atan((enemyX - getX()) / (enemyY - getY())); // if(enemyBearing<0){ // System.out.println("change"); // enemyBearing = Math.PI*2 + enemyBearing; // }else if (enemyBearing < Math.PI){ // } // System.out.println("atan " + Math.atan((eneY-getY())/(eneX-getX()))); // System.out.println("atan1 " + Math.atan((eneX-getX())/(eneY-getY()))); // System.out.println("trueeee " + (e.getBearingRadians() + this.getHeadingRadians())); System.out.println( "enerad" + enemyBearing + " ?= " + "enemyBearing " + (this.getHeadingRadians() + e.getBearingRadians())); System.out.println(enemyBearing + Math.PI); double enemyHeading = target_enemy.get_en_heading(); // 敵の向き System.out.println("enemy heading:" + enemyHeading); // double enemyBearing = this.getHeadingRadians() + // target_enemy.get_en_bearingRadians();// 自分と敵の角度 // double enemyX = target_enemy.get_en_distance() * Math.sin(enemyBearing); // double enemyY = target_enemy.get_en_distance() * Math.cos(enemyBearing); enemyX = enemyX - getX(); enemyY = enemyY - getY(); System.out.println("Relative : eX " + enemyX + " : " + "eY " + enemyY); double battlefieldWidh = getBattleFieldWidth(); // フィールド幅 double battlefieldHeight = getBattleFieldHeight(); // フィールド高さ boolean isHeadingToCenter = (int) enemyHeading % 90 == 0; // 中心を向いている boolean isOnWall = nearlyEquals(enemyX, 18) || nearlyEquals(enemyX + 18, battlefieldWidh) || nearlyEquals(enemyY, 18) || nearlyEquals(enemyY + 18, battlefieldHeight); // 壁に張り付いている // 中心を向いている&&壁際にいる(=Walls)なら射撃 if (isHeadingToCenter && isOnWall) { System.out.println("Walls!!"); } double dis = 0; double heading = lastEnemyHeading; do { dis += Rules.getBulletSpeed(power); heading += target_enemy.get_en_headingRadians() - lastEnemyHeading; enemyX += target_enemy.get_en_velocity() * Math.sin(heading); enemyY += target_enemy.get_en_velocity() * Math.cos(heading); } while (dis < Point2D.distance(0, 0, enemyX, enemyY)); // // 相対角度に変換した上で砲塔の向きを変える setTurnGunRightRadians( Utils.normalRelativeAngle(Math.atan2(enemyX, enemyY) - getGunHeadingRadians())); setFire(power); // lastEnemyHeading = e.getHeadingRadians(); lastEnemyHeading = target_enemy.get_en_headingRadians(); System.out.println("lastEnemyHeading " + e.getHeadingRadians()); System.out.println(lastEnemyHeading); // 敵の居る方向へターンする // setTurnRightRadians(e.getBearingRadians()); setTurnRightRadians(enemyBearing - this.getHeadingRadians()); System.out.println("setTurnRightRadians " + e.getBearingRadians()); System.out.println(enemyBearing - this.getHeadingRadians()); // 前進する setAhead(moveAmount); } catch (NullPointerException ee) { System.out.println("NullPointerException"); System.out.println(target_enemy); } } } System.out.println("enemy_detected = " + enemy_detected); System.out.println("target is " + target_enemy.get_en_name()); System.out.println(target_enemy.get_en_expX() + " " + target_enemy.get_en_expY()); System.out.println("END at : " + getTime() + " onScannedRobot----------------------------"); }