/////////////////////// //// THE DALEKS ///// /////////////////////// npc script Dalek { const int LASER_LAYER = 3; const int LASER_COLOUR = 0x04; const int LASER_OPACITY = 128; void run (int angleOfVision, int shotStep, int shotCooldownTime, int weaponType, int shotSFX) { //Get attributes angleOfVision = this->InitD[0]; shotStep = this->InitD[1]]; shotCooldownTime = this->InitD[2]; weaponType = ghost->InitD[3]; shotSFX = ghost->InitD[4]; int shotCooldown = shotCooldownTime; int turnTimer = this->Rate * 10; int laserStartX; int laserStartY; eweapon beam; while(this->isValid()) { //Shooting if ( shotCooldown > 0 ) --shotCooldown; //Only one beam at a time else if ( !beam->isValid() ) { //Check angle to Link against angle of vision int angleToLink = Angle(CenterX(this), CenterY(this), CenterLinkX(), CenterLinkY()); int facingAngle = Dir4Angle(this->Dir); int difference = Abs(angleToLink - facingAngle); //If Link is within this angle if ( difference <= angleOfVision/2 ) { shotCooldown = shotCooldownTime; //can reduce down by reading InitD again -Z laserStartX = CenterX(this); laserStartY = CenterY(this); beam = Screen->CreateEWeapon(weaponType); beam->X = laserStartX; beam->Y = laserStartY; beam->Angular = true; beam->Angle = ArcTan(Link->X-beam->X, Link->Y-beam->X); beam->Step = shotStep; beam->Damage = this->WeaponDamage; Audio->PlaySound(shotSFX); beam->DrawXOffset = 999; //Draw off-screen } } //Draw laser beam if ( beam->isValid() ) { Screen->Line(LASER_LAYER, laserStartX, laserStartY, CenterX(beam), CenterY(beam), LASER_COLOUR, 1, 0, 0, 0, LASER_OPACITY); } Waitframe(); } } }