//When approached, spawns some enemies, then starts moving like Peahat. When it stops, he opens eye, spawns some enemies, end fires eweapon at Link. Hit it when eye is open for damage.
//Set up 2 consecutive rows of tiles, 1 for moving, 1 for firing.
ffc script PeahatBoss{
void run(int enemyID){
npc ghost = Ghost_InitAutoGhost(this, enemyID);
int HF = ghost->Homing;
int HR = ghost->Haltrate;
int RR = ghost->Rate;
int HNG = ghost->Hunger;
int SPD = ghost->Step;
int WPND = ghost->WeaponDamage;
int Ghost_MaxHP = Ghost_HP;
int delay = Ghost_GetAttribute(ghost, 0, 60);//Delay between opening eye and shooting
int sizex = Ghost_GetAttribute(ghost, 1, 4);//Monster size X intiles.
int sizey = Ghost_GetAttribute(ghost, 2, 4);//Monster size Y intiles.
int WPNS = Ghost_GetAttribute(ghost, 3, -1);//eweapon sprite
int opendelay = Ghost_GetAttribute(ghost, 4, 120);//How long eye stays open when enemy stops, in frames.
int noblock = Ghost_GetAttribute(ghost, 5, 0);//if>0 - ignore lweapons at all, when moving.
int initproximity = Ghost_GetAttribute(ghost, 6, 256); //initial proximity distance
int numenemies = Ghost_GetAttribute(ghost, 7, 0);//Number of enemies to spawn when taking off flying.
int spawnID = Ghost_GetAttribute(ghost, 8, enemyID);//ID of enemies to spawn when taking off flying.
ghost->Extend=3;
Ghost_SetSize(this, ghost, sizex, sizey);
if (sizex>2||sizey>2)Ghost_SetHitOffsets(ghost, 8, 8, 8, 8);
Ghost_SetFlag(GHF_NORMAL);
Ghost_SetFlag(GHF_IGNORE_ALL_TERRAIN);
Ghost_SetFlag(GHF_NO_FALL);
Ghost_SetFlag(GHF_8WAY);
int origtile = ghost->OriginalTile;
int haltcounter = -1;
int shotcounter=0;
int State = 0;
if (initproximity>=256)State=1;
bool spawn = false;
int defs[18];
Ghost_StoreDefenses(ghost,defs);
ghost->OriginalTile=origtile+20*Ghost_TileHeight;
while(true){
if (State==0){
if (Distance(CenterLinkX(), CenterLinkY(), CenterX(ghost), CenterY(ghost))<=initproximity || Ghost_HP<Ghost_MaxHP){
for (int i=1;i<=numenemies;i++){
npc n = CreateNPCAt(spawnID,CenterX(ghost),CenterY(ghost));
}
// Trace(Distance(CenterLinkX(), CenterLinkY(), CenterX(ghost), CenterY(ghost)));
ghost->OriginalTile=origtile;
if (noblock>0)Ghost_SetAllDefenses(ghost, NPCDT_IGNORE);
else Ghost_SetAllDefenses(ghost, NPCDT_BLOCK);
spawn=false;
State=1;
}
}
else if (State==1){
haltcounter = Ghost_FloaterWalk(haltcounter, SPD, 1, 1, 64, RR, HF, HNG, HR, opendelay);
if ((haltcounter&0x18000)==0){
ghost->OriginalTile=origtile+20*Ghost_TileHeight;
Ghost_SetDefenses(ghost, defs);
shotcounter++;
if (shotcounter==60){
eweapon e = FireAimedEWeapon(ghost->Weapon, CenterX(ghost), CenterY(ghost)+4, 0, 300, WPND, WPNS, -1, EWF_ROTATE);
}
spawn=true;
}
else {
if (spawn){
for (int i=1;i<=numenemies;i++){
npc n = CreateNPCAt(spawnID,CenterX(ghost),CenterY(ghost));
}
spawn=false;
}
shotcounter=0;
ghost->OriginalTile=origtile;
if (noblock>0)Ghost_SetAllDefenses(ghost, NPCDT_IGNORE);
else Ghost_SetAllDefenses(ghost, NPCDT_BLOCK);
}
}
if (!Ghost_Waitframe(this, ghost, false, false)){
if (sizex>2||sizey>2)Ghost_DeathAnimation(this, ghost, GHD_SHRINK);
Quit();
}
}
}
}