Copy to Clipboard Test

Beginner-Level Custom Boss Kit Code

//Bossmaker script arguments:
// D0: Movement part enemy in the list.
// D1: Shooter part enemy in the list.
// D2: Collision part enemy in the list. Also known as "core" or "weak point"
// D3: Set to 1 if you want for boss` body not to damage Link on direct contact. 
//    Contact with re is always harmful.
// D4: Shooter`s X position offset.
// D5: Shooter`s Y position offset.
//     Use these arguments if you want to have boss shoot Eweapons from proper position.
//     For Collision part use BigEnemy script with HitBox offset argument
 
const int BOSS_INVISITILE = 50000; //Needed to render NPC invisible.
 
ffc script BossMaker{
void run(int Movement, int WeaponFire, int Collision, int Background_Boss, int Shooter_XOffset, int Shooter_YOffset){
Waitframes(4);

//DECLARE VARIABLES AND POINTERS
npc EnemyMove; //Pointer for Movement Enemy Data
npc EnemyFire; //Pointer for Weapon Enemy Data
npc EnemyColl; //Pointer for Collision Enemy Data
bool Dual_Enemy = true; //Variable for Dual Enemy Mode
bool Triple_Enemy = true; //Variable for Triple Enemy Mode
int FireOrigWeapon; //Declare 6 variables for backing up Weapon, tiles and CollDetection for Projectile and Collision parts
int FireOrigtile;
bool FireOrigCollDetection;
int CollOrigWeapon;
int CollOrigtile;
bool CollOrigCollDetection;
//DETERMINE HOW MANY ENEMIES ARE BEING USED IN THE SCRIPT
Dual_Enemy = true; //Initialize modes as true.
Triple_Enemy = true;
EnemyMove = Screen->LoadNPC(Movement);  //Load enemy data used for appearance and movement
if(!EnemyMove->isValid()){
 Quit(); //Use Enemy placement flags to set up stationary bosses.
 }
if(WeaponFire>0) EnemyFire = Screen->LoadNPC(WeaponFire);   //Load enemy data used for behavior and weapon fire
// if(EnemyFire->isValid()){ //If a second enemy exists
// Dual_Enemy = true; //Activate "Dual Enemy" mode
// }
if(!EnemyFire->isValid()){ //If a second enemy does not exist
 Dual_Enemy = false; //"Dual Enemy" mode does not activate
 }
 else{
     FireOrigWeapon = EnemyFire->Weapon; //Back up Weapon, Original tile and CollDetection for Projectile part.
    FireOrigtile = EnemyFire->OriginalTile;
    FireOrigCollDetection = EnemyFire->CollDetection;
 }
 
if (Collision>0) EnemyColl = Screen->LoadNPC(Collision);   //Load enemy data used for collision and touch effects
// if(EnemyColl->isValid()){ //If a third enemy exists
// Triple_Enemy = true; //Activate "Triple Enemy" mode
// }
if(!EnemyColl->isValid()){ //If a third enemy does not exist
 Triple_Enemy = false; //"Triple Enemy" mode does not activate
 }
 else{
     CollOrigWeapon = EnemyColl->Weapon; //Back up Weapon, Original tile and CollDetection for Collision part.
    CollOrigtile = EnemyColl->OriginalTile;
    CollOrigCollDetection = EnemyColl->CollDetection;
 }
 
while(EnemyMove->isValid()){ 
if((Dual_Enemy == true)&&(EnemyFire->isValid())||(Triple_Enemy == true)){  //SETTINGS FOR BOTH DUAL AND TRIPLE ENEMY MODES
EnemyFire->X = EnemyMove->X + Shooter_XOffset;   //Weapon enemy X-Coordinate attached to Movement enemy. Offset is applied to position.
EnemyFire->Y = EnemyMove->Y + Shooter_YOffset;   //Weapon enemy Y-Coordinate attached to Movement enemy. Offset is applied to position.
WizzrobeUpdate(EnemyMove, EnemyFire, FireOrigtile, FireOrigWeapon, FireOrigCollDetection);
if(Background_Boss>0){ //Check if the boss is not in the same plane as Link
                      //Set NPC`s all Defenses to "ignore" if you want for boss body not to take damage from Lweapons.
EnemyMove->CollDetection = false;  //Movement enemy collision detection turned off
EnemyFire->CollDetection = false;  //Shooter enemy collision is off
}
}
if((Dual_Enemy == true)&&(Triple_Enemy == false)){ //SETTINGS FOR DUAL ENEMY MODE ONLY
if(EnemyMove->HP <= 0){ //If movement enemy's HP reaches zero
EnemyFire->HP = 0;   //Set Weapon enemy's HP to zero
Quit();   //Boss is dead. Finita la comedia.
}
}
if((Triple_Enemy == true)&&(EnemyColl->isValid())){ //SETTINGS FOR TRIPLE ENEMY MODE ONLY
EnemyColl->X = EnemyMove->X; //Collision enemy X-Coordinate attached to Movement enemy
EnemyColl->Y = EnemyMove->Y; //Collision enemy Y-Coordinate attached to Movement enemy
WizzrobeUpdate(EnemyMove, EnemyColl, CollOrigtile, CollOrigWeapon, CollOrigCollDetection);
if(Background_Boss>0){  //Check if the boss is not in the same plane as Link
                       //Set NPC`s all Defenses to "ignore" if you want for boss body not to take damage from Lweapons.
EnemyMove->CollDetection = false; //Movement enemy collision detection turned off
if(EnemyFire->isValid()){  // Some bosses have no turrets but have cores
EnemyFire->CollDetection = false; //Shooter enemy collision is off
}
} 
if((EnemyColl->HP <= 0)||(EnemyMove->HP <=0 )){ //If Collision enemy's HP reaches zero or movement part is already destroyed. 
EnemyMove->HP = 0;   //Set Movement enemy's HP to zero
EnemyColl->HP = 0;   //Set Collision enemy`s HP to 0. 
                     //This is useful if the Triple boss is killed via chain reaction 
                     //if there are multiple Bossmaker scripts running in one screen.
if(EnemyFire->isValid()){
EnemyFire->HP = 0; //Set Weapon enemy's HP to zero
}
Quit();//Boss is dead. Finita la comedia.
}
}
Waitframe();
}
// This 2-line piece of code destroys Shooter and Collision parts if EnemyMove pointer
// is rendered invalid in the way other than killing enemy. 
// This is true if enemy splits(like Digdogger) or tribbles.   
if (EnemyFire->isValid()) EnemyFire->HP=0;
if (EnemyColl->isValid()) EnemyColl->HP=0;
}
}

//This function temporarily hides Shooter and Collision enemies if WizzRobe 
//(if he is Movement part of the boss) is currently teleporting.
void WizzrobeUpdate(npc carrier, npc part, int OrigTile, int OrigWeapon, bool OrigCollDetection ){
    if (carrier->Type==NPCT_WIZZROBE){
        if (carrier->HitXOffset >= 1000){
            part->CollDetection=false;
            part->OriginalTile=BOSS_INVISITILE;
            part->Weapon=WPN_NONE;
        }
        else {
            part->CollDetection=OrigCollDetection;
            part->OriginalTile=OrigTile;
            part->Weapon=OrigWeapon;
        }
    }
}