//FFAquamentus //Moves like normal enemy, or in circle, faces specific direction, Fires triple fireballs. At low HP speed increases and he fires rays of fire at random positions. //Uses 2 rows of animation ffc script FFAquamentus{ 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 dir = Ghost_GetAttribute(ghost, 0, DIR_LEFT);//Facing direction int berserkHP = Ghost_GetAttribute(ghost, 1, 0);//Berserk HP threshold int sizex = Ghost_GetAttribute(ghost, 2, 2);//Tile Width int sizey = Ghost_GetAttribute(ghost, 3, 2);//Tile Height int delay = Ghost_GetAttribute(ghost, 4, 180);//Delay between shooting, in frames int ewsprite = Ghost_GetAttribute(ghost, 5, -1);//Sprite to use for eweapons int radius = Ghost_GetAttribute(ghost, 6, 0);//Movement radius, 0 for ConstantWalk4 int berserkWPN = Ghost_GetAttribute(ghost, 7, EW_FIRE2);//Weapon type used for berserk mode int berserkspeedmodifier = Ghost_GetAttribute(ghost, 8, 50);//Speed modifier for berserk mode int berserkfirespeed = Ghost_GetAttribute(ghost, 9, 200);//Berserk eweapon fire speed. ghost->Extend=3; Ghost_SetSize(this, ghost, sizex, sizey); if (sizex>2 && sizey>2)Ghost_SetHitOffsets(ghost, 2, 2, 2, 2); Ghost_SetFlag(GHF_NORMAL); Ghost_UnsetFlag(GHF_KNOCKBACK); int OrigTile = ghost->OriginalTile; int State = 0; int haltcounter = -1; int statecounter = delay; int origX = Ghost_X; int origY = Ghost_Y; int CurAngle = Rand(360);//Current angular position used for calculating sine wave position. int anglestep = SPD/100; //Used for calculating int shootcounter = 0; int FireposX[4]={0,0,240,0}; int FireposY[4]={160,0,0,0}; FireposX[0] = 32+Rand(192); FireposX[1] = 32+Rand(192); FireposY[2] = 32+Rand(102); FireposY[3] = 32+Rand(102); bool berserk = false; int defs[18]; Ghost_StoreDefenses(ghost,defs); while(true){ if (State==0){ if (radius>0){ CurAngle+=anglestep; Ghost_X=origX +radius*Cos(CurAngle); Ghost_Y=origY +radius*Sin(CurAngle); } else{ haltcounter = Ghost_ConstantWalk4(haltcounter, SPD, RR, HF, HNG); } statecounter--; if (statecounter==0){ statecounter=45; State=1; } } if (State==1){ if (statecounter>0)statecounter--; if (statecounter==0){ if (berserk){ if (shootcounter==0){ shootcounter=60; Screen->Rectangle(6, 0, 0, 256, 172, 0x81, 1, 0, 0, 0, true, 128); } shootcounter--; if ((shootcounter%3)==0){ eweapon e = FireNonAngularEWeapon(berserkWPN, FireposX[dir], FireposY[dir], dir, berserkfirespeed, WPND, -1, -1, 0); } } if (shootcounter==0){ eweapon e; e = FireAimedEWeapon(ghost->Weapon, Cond(dir==DIR_RIGHT, Ghost_X+Ghost_TileWidth*16-16, Ghost_X), Ghost_Y, 0, 100, WPND, ewsprite, -1, EWF_ROTATE); e = FireAimedEWeapon(ghost->Weapon, Cond(dir==DIR_RIGHT, Ghost_X+Ghost_TileWidth*16-16, Ghost_X), Ghost_Y, 0.2, 100, WPND, ewsprite, 0, EWF_ROTATE); e = FireAimedEWeapon(ghost->Weapon, Cond(dir==DIR_RIGHT, Ghost_X+Ghost_TileWidth*16-16, Ghost_X), Ghost_Y, -0.2, 100, WPND, ewsprite, 0, EWF_ROTATE); } if (!berserk||shootcounter==0){ statecounter=delay; if (dir<2)FireposX[dir] = 32+Rand(192); else FireposY[dir] = 32+Rand(102); State=0; } } } if (!berserk && Ghost_HP<=berserkHP){ berserk=true; Game->PlaySound(SFX_SUMMON); SPD+=berserkspeedmodifier; delay/=2; anglestep*=2; } AquamentusAnimation(ghost, OrigTile, State, 2); if (!Ghost_Waitframe(this, ghost, false, false)){ Ghost_DeathAnimation(this, ghost, GHD_EXPLODE); Quit(); } } } } void AquamentusAnimation(npc ghost, int origtile, int State, int numframes){ int offset = 20 * ghost->TileHeight; if (State==0) offset=0; ghost->OriginalTile = origtile + offset; }