/* FixedTank.java (C) Copyright 2000 by Scott Sherman. All rights reserved. Scott Sherman 11-01... a simple tank which doesn't change direction or speed, it simply fires at the closest tank */ import java.util.Enumeration; import com.loki3.cyber.pawn.*; import com.loki3.util.Angle; public class FixedTank implements GameListener, ScannerListener { // GameListener public boolean use(Pawn pawn) { mPawn = pawn; // find out about scanners for (Enumeration e=pawn.getScanners(); e!=null && e.hasMoreElements();) { Object scanner = e.nextElement(); if (scanner instanceof ScannerRadar) ((ScannerRadar)scanner).addScannerListener(this); else if (scanner instanceof ScannerPerfect) mScannerPerfect = (ScannerPerfect)scanner; } // find out about weapons for (Enumeration e=pawn.getWeapons(); e!=null && e.hasMoreElements();) { Object weapon = e.nextElement(); if (weapon instanceof WeaponTurret) mWeaponTurret = (WeaponTurret)weapon; else if (weapon instanceof WeaponMineLayer) mWeaponMineLayer = (WeaponMineLayer)weapon; } // remember our primary identity mName = pawn.getIdentity().getFirstName(); return true; } public void gameStarted() { } public void gameTick(double tick) { if (mScannerPerfect != null) { mScannerPerfect.scan(); // find closest pawn that doesn't have our identity ScannedUnit closest = mScannerPerfect.getPawns().getClosest(mName, false); if ( (closest != null) && closest.getIsAlive() ) unitScanned(closest.getDistance(), closest.getAngle()); } } public void gameEnded() { mPawn = null; } // ScannerListener if we have a radar scanner, // also called explictly for a ScannerPerfect public void unitScanned(double distance, double angle) { // rotate turret in direction of scanned object double turretdelta = Angle.normalize(angle - mWeaponTurret.getCurrentAngle()); mWeaponTurret.turnLeft(turretdelta); // if we're almost aiming at pawn, fire if ( (turretdelta < Angle.degreesToRadians(10)) || (turretdelta > Angle.degreesToRadians(350)) ) if ( (mWeaponTurret != null) && mWeaponTurret.canFire() ) mWeaponTurret.fire(); // if a tank is behind us, drop a mine if ( (angle > Angle.degreesToRadians(170)) || (angle < Angle.degreesToRadians(-170)) ) if ( (mWeaponMineLayer != null) && mWeaponMineLayer.canFire() ) mWeaponMineLayer.fire(); } private Pawn mPawn = null; private ScannerPerfect mScannerPerfect = null; private WeaponTurret mWeaponTurret = null; private WeaponMineLayer mWeaponMineLayer = null; private String mName = null; // our primary identity }