import "std.zh" const int BIG_MOLDORM_ONE = 185;//Invulnerable Moldrom core; const int TAIL_ONE= 186;//Invulnerable Moldorm tail segement. const int BIG_MOLDORM_TWO = 184;//Normal Moldorm Core. const int TAIL_TWO = 187;//Normal Moldorm Tail segment. //D0 is the screen reg to use. If this value is -1, the script will run at all times. //D1 is a flag, to trigger screen secrets. If 0, no secrets are triggered. If 1, secrets are temporarily triggers. // if 2 or higher, secrets are triggered in a permanent manner. //D2 Sets a custom speed. If none defined (set to 0), it uses the default speed from the enemy editor (Step). ffc script Big_Moldorm{ void run(int reg, int triggerSecrets, int speed){ npc n = Screen->CreateNPC(BIG_MOLDORM_ONE); npc n2 = Screen->CreateNPC(TAIL_ONE); npc n3 = Screen->CreateNPC(TAIL_ONE); npc n4 = Screen->CreateNPC(TAIL_ONE); npc n5 = Screen->CreateNPC(TAIL_TWO); int Speed; if ( speed > 0 ) { Speed = speedl } else { Speed = n->Step; } bool isAlive1 = true; bool isAlive2 = true; bool isAlive3 = true; bool isAlive4 = true; bool StartTimer = false; int timer = 0; n->X = this->X; n->Y = this->Y; n->Extend = 3; n->TileWidth = 2; n->TileHeight = 2; n2->X = n->X-16; n2->Y = n->Y; n3->X = n2->X-16; n3->Y = n2->Y; n4->X = n3->X-16; n4->Y = n3->Y; n5->X = n4->X-16; n5->Y = n4->Y; int curScreen = Game->GetCurScreen(); int dat = Game->GetScreenD(curScreen, int reg); if ( reg > -1 && dat > 0 ){ this->Data = 0; return; } if ( reg < 0 || ( reg > 0 && Screen->D[reg] == 0 ) { while(n->HP > 0 ){ //Movement code. if(Abs(n->X - n2->X)>16){ if (n2->X < n->X-16)n2->X++; else if(n2->X > n->X+16)n2->X--; } if(Abs(n2->X - n3->X)>16){ if (n3->X < n2->X-16)n3->X++; else if(n3->X > n2->X+16)n3->X--; } if(Abs(n3->X - n4->X)>16){ if (n4->X < n3->X-16)n4->X++; else if(n4->X > n3->X+16)n4->X--; } if(Abs(n4->X - n5->X)>16){ if (n5->X < n4->X-16)n5->X++; else if(n5->X > n4->X+16)n5->X--; } if(Abs(n->Y - n2->Y)>16){ if (n2->Y < n->Y-16)n2->Y++; else if(n2->Y > n->Y+16)n2->Y--; } if(Abs(n2->Y - n3->Y)>16){ if (n3->Y < n2->Y-16)n3->Y++; else if(n3->Y > n2->Y+16)n3->Y--; } if(Abs(n3->Y - n4->Y)>16){ if (n4->Y < n3->Y-16)n4->Y++; else if(n4->Y > n3->Y+16)n4->Y--; } if(Abs(n4->Y - n5->Y)>16){ if (n5->Y < n4->Y-16)n5->Y++; else if(n5->Y > n4->Y+16)n5->Y--; } //Check each part to see if it is still alive. if(n5->HP <= 0 && isAlive4){ isAlive4 = false; StartTimer = true; } if (n4->HP <=0 && isAlive3){ isAlive3 = false; StartTimer = true; } if (n3->HP<= 0 && isAlive2){ isAlive2 = false; StartTimer = true; } if (n2->HP <= 0 && isAlive1){ isAlive1 = false; StartTimer = true; } //All parts are dead, make the core vulnerable. if(!isAlive1 && !isAlive2 && !isAlive3 && !isAlive4){ this->X = n->X; this->Y = n->Y; n->HP = 0; n = Screen->CreateNPC(BIG_MOLDORM_TWO); n->X = this->X; n->Y = this->Y; n->Extend = 3; n->TileWidth = 2; n->TileHeight = 2; } //A part has been damaged, make it angry. if(StartTimer){ timer = 600; StartTimer = false; } while(timer > 0){ //Repeat movement code, because the main while loop doesn't run while this is going on. if(Abs(n->X - n2->X)>16){ if (n2->X < n->X-16)n2->X++; else if(n2->X > n->X+16)n2->X--; } if(Abs(n2->X - n3->X)>16){ if (n3->X < n2->X-16)n3->X++; else if(n3->X > n2->X+16)n3->X--; } if(Abs(n3->X - n4->X)>16){ if (n4->X < n3->X-16)n4->X++; else if(n4->X > n3->X+16)n4->X--; } if(Abs(n4->X - n5->X)>16){ if (n5->X < n4->X-16)n5->X++; else if(n5->X > n4->X+16)n5->X--; } if(Abs(n->Y - n2->Y)>16){ if (n2->Y < n->Y-16)n2->Y++; else if(n2->Y > n->Y+16)n2->Y--; } if(Abs(n2->Y - n3->Y)>16){ if (n3->Y < n2->Y-16)n3->Y++; else if(n3->Y > n2->Y+16)n3->Y--; } if(Abs(n3->Y - n4->Y)>16){ if (n4->Y < n3->Y-16)n4->Y++; else if(n4->Y > n3->Y+16)n4->Y--; } if(Abs(n4->Y - n5->Y)>16){ if (n5->Y < n4->Y-16)n5->Y++; else if(n5->Y > n4->Y+16)n5->Y--; } n->Step = 2* Speed; timer--; //It isn't angry anymore. if(timer <= 0){ n->Step = Speed; //Check to see which parts have died, then replace with vulnerable ones. if(isAlive3 && isAlive2 && isAlive1){ n4->HP = 0; n4 =Screen->CreateNPC(TAIL_TWO); n4->X = n3->X-16; n4->Y = n3->Y; } if(!isAlive3 && isAlive2 && isAlive1){ n3->HP = 0; n3= Screen->CreateNPC(TAIL_TWO); n3->X = n2->X-16; n3->Y = n2->Y; } if(!isAlive3 && !isAlive2 && isAlive1){ n2->HP = 0; n2 = Screen->CreateNPC(TAIL_TWO); n2->X = n->X-16; n2->Y = n->Y; } } Waitframe(); } //The whole boss is dead, so trigger secrets. Waitframe(); } if ( reg >= 0 ) { Game->SetScreenD(curScreen, reg, 1); } if ( triggerSecrets ) { Screen->TriggerSecrets(); if ( triggerSecrets > 1 ) { Screen->State[ST_SECRET] = true; } } this->Data = 0; return; } } }