Code:
// Zora King
// Will work best with a Freeform Combo set to Combo W: 32, Combo H: 32, Tile W: 2, Tile H: 2, with provided graphics.
// NOTE: Using a SkipX setting of 1 on the combo will allow
// you to animate using 2x2 tile chunks.
// D0 - The number pointing to another Freeform Combo
// Used to display the diving, as well as house more variables.
// (Check below for details)
// D1 - The total duration the zora will stay on the screen.
// D2 - Enemy Type to use for ghosting
// D3 - Total hit points
// D4 - Fire every this amount of frames when above water;
// D5 - Damage of projectile;
// D6 - Fireballs Per Shot (set to an odd number up to 9. Even numbers may function but are not recommended)
// D7 - Sprite to use for fireball
// As mentioned above, further customization is allowed by
// By using the D variables stored in the FFC called by D0
// D0 = Projectile movement pattern(0 for normal shot)
// D1 = Projectile movement argument (0 for none)
// See ghost.zh for its EWM constants for what to use as patterns
// See ghost_zh_readme.txt for what to use as argument.
// Use ZRB_CHECKPOINT Floats to specify in percentages when the Zora will be submerged, rise, appear, and sink.
const float ZRB_CHECKPOINT1 = 0.30;// Time From Phase 1 to 2. Decimal indicates a percentage.
const float ZRB_CHECKPOINT2 = 0.45;// Time From Phase 2 to 3. Decimal indicates a percentage.
const float ZRB_CHECKPOINT3 = 0.60;// Time from Phase 3 to 4. Decimal indicates a percentage.
const float ZRB_CHECKPOINT4 = 0.75;// Time from Phase 4 to end(staytime). Decimal indicates a percentage.
const int ZRB_PRJ_X_OFFSET = 8; // Offset of projectile from origin in X
const int ZRB_PRJ_Y_OFFSET = 16; // Offset of projectile from origin in Y
ffc script zora_king
{
//Running part of script
void run(int diveffc_s, int staytime, int enemtype, int enemhp, int fireat, int firedmg, int fireperarc, int firesprite)
{
npc zoraboss;
eweapon zora_fire;
//Loads an FFC
ffc diveffc = Screen->LoadFFC(diveffc_s);
int fire_mtype = diveffc->InitD[0];
int fire_arg = diveffc->InitD[1];
TraceNL();
Trace(fire_mtype);
TraceNL();
Trace(fire_arg);
int time_check = 0;
int water_check = 1;
int checkpoint_1 = (staytime*ZRB_CHECKPOINT1);
int checkpoint_2 = (staytime*ZRB_CHECKPOINT2);
int checkpoint_3 = (staytime*ZRB_CHECKPOINT3);
int checkpoint_4 = (staytime*ZRB_CHECKPOINT4);
int pop_up_x = 16 * Rand(15);
int pop_up_y = 16 * Rand(10);
zoraboss = GhostInitCreate(this,enemtype);
SetHP(this,zoraboss,enemhp);
while(true){
if(water_check == 1){pop_up_x = 16 * Rand(15);pop_up_y = 16 * Rand(10); water_check = 0;}
if(IsWater(ComboAt(pop_up_x,pop_up_y)) && IsWater(ComboAt(pop_up_x + 16,pop_up_y)) && IsWater(ComboAt(pop_up_x,pop_up_y + 16)) && IsWater(ComboAt(pop_up_x + 16,pop_up_y + 16))){} else {pop_up_x = 16 * Rand(15);pop_up_y = 16 * Rand(10);}
if(time_check < staytime) time_check++;
if(time_check <= checkpoint_1){
change_x_y_2(this, 256, 176, diveffc, 256, 176);
}
if(time_check > checkpoint_1 && time_check <= checkpoint_2){
change_x_y_2(this, 256, 176, diveffc, pop_up_x, pop_up_y);
}
if(time_check > checkpoint_2 && time_check <= checkpoint_3){
change_x_y_2(this, pop_up_x, pop_up_y, diveffc, 256, 176);
if(time_check % fireat == 0){
if (fireperarc >= 1){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0) SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
if (fireperarc >= 3){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, -0.1, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0.1, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
if (fireperarc >= 5){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, -0.2, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0.2, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
if (fireperarc >= 7){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, -0.3, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0.3, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
if (fireperarc >= 9){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, -0.4, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0.4, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
if (fireperarc >= 11){
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, -0.5, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
zora_fire=FireAimedEWeapon(129, this->X + ZRB_PRJ_X_OFFSET, this->Y + ZRB_PRJ_Y_OFFSET, 0.5, 200, firedmg,false, firesprite, false, 0);
if(fire_mtype > 0)SetEWeaponMovement(zora_fire, fire_mtype, fire_arg);
}
}
}
if(time_check > checkpoint_3 && time_check <= checkpoint_4){
change_x_y_2(this, pop_up_x, pop_up_y, diveffc, 256, 176);
}
if(time_check > checkpoint_4 && time_check <= staytime){
change_x_y_2(this, 256, 176, diveffc, pop_up_x, pop_up_y);
}
if(time_check >= staytime){water_check = 1; time_check = 0;}
GhostWaitframeF(this, zoraboss, true, true);
}
}
void change_x_y_2(ffc f1, int x1, int y1, ffc f2, int x2, int y2)
{
f1->X = x1;
f1->Y = y1;
f2->X = x2;
f2->Y = y2;
}
}