CODE
ffc script ArmosKnight{
void run(int enemy_id, int position){
while(Screen->NumNPCs() == 0) Waitframe();
npc enemy = CreateNPCAt(enemy_id, this->X, this->Y);
int smallradius = enemy->Attributes[0];
int largeradius = enemy->Attributes[1];
int speed = enemy->Attributes[2];
int wait = enemy->Attributes[3];
int CSet2 = enemy->Attributes[4];
int height = enemy->Attributes[5];
int angle = 60 * position;
int timer;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1){
enemy->Misc[1] = enemy->X;
enemy->Misc[2] = enemy->Y;
if(enemy->Misc[0] == 0) FormCircle(enemy, largeradius, angle);
else if(enemy->Misc[0] == 1 || enemy->Misc[0] == 4 || enemy->Misc[0] == 7){
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1){
for(int i = 1; i <= NumNPCsOf(enemy_id); i++){
npc e = LoadNPCOf(enemy_id, i);
if(e->Misc[0] == 0 || e->Misc[0] == 3 || e->Misc[0] == 6){
Waitframe();
continue;
}
}
enemy->Misc[0]++;
break;
}
}
else if(enemy->Misc[0] == 2){
Waitframes(wait);
timer = Rand(120,180);
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && timer > 0){
CircularMovement(enemy, largeradius, angle, speed);
angle %= 360;
angle++;
timer--;
Waitframe();
}
enemy->Misc[0]++;
}
else if(enemy->Misc[0] == 3) FormCircle(enemy, smallradius, angle);
else if(enemy->Misc[0] == 5){
timer = Rand(120,180);
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && timer > 0){
CircularMovement(enemy, smallradius, angle, speed);
angle %= 360;
angle++;
timer--;
Waitframe();
}
enemy->Misc[0]++;
}
else if(enemy->Misc[0] == 6) FormLine(enemy, position);
else if(enemy->Misc[0] == 8){
Waitframes(wait);
LinearMovement(enemy);
}
Wait(frame);
}
if(enemy->isValid()){
enemy->CSet = CSet2;
Waitframes(wait);
while(enemy->isValid()){
Stomp(enemy, height, wait);
Waitframes(wait);
}
}
else Quit();
npc trigger = LoadNPCOf(NPC_TRIGGER);
trigger->HP = HP_SILENT;
}
void FormCircle(npc enemy, int radius, int angle){
float pointx = 120 + radius*Cos(angle);
float pointy = 80 + radius*Sin(angle);
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
enemy->Misc[0]++;
}
void FormLine(npc enemy, int position){
float pointx = 32;
float pointy = 48 + (16 * position);
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
enemy->Misc[0]++;
}
void CircularMovement(npc enemy, int radius, int angle, int speed){
enemy->X = 120 + radius*Cos(angle*speed);
enemy->Y = 80 + radius*Sin(angle*speed);
}
void LinearMovement(npc enemy){
float pointx = 208;
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx))){
enemy->Misc[1] += enemy->Step/100;
enemy->X = enemy->Misc[1];
Waitframe();
}
enemy->Misc[0] = 0;
}
void Stomp(npc enemy, int height, int wait){
float pointx = Link->X;
float pointy = Link->Y;
for(int i = height; i > 0; i--){
enemy->Z++;
Waitframe();
}
while(enemy->isValid() && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
Waitframes(wait);
if(enemy->isValid()){
for(int i = height; i > 0; i--){
enemy->Z--;
Waitframe();
}
}
if(enemy->isValid()) Game->PlaySound(SFX_HAMMER);
}
}
void run(int enemy_id, int position){
while(Screen->NumNPCs() == 0) Waitframe();
npc enemy = CreateNPCAt(enemy_id, this->X, this->Y);
int smallradius = enemy->Attributes[0];
int largeradius = enemy->Attributes[1];
int speed = enemy->Attributes[2];
int wait = enemy->Attributes[3];
int CSet2 = enemy->Attributes[4];
int height = enemy->Attributes[5];
int angle = 60 * position;
int timer;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1){
enemy->Misc[1] = enemy->X;
enemy->Misc[2] = enemy->Y;
if(enemy->Misc[0] == 0) FormCircle(enemy, largeradius, angle);
else if(enemy->Misc[0] == 1 || enemy->Misc[0] == 4 || enemy->Misc[0] == 7){
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1){
for(int i = 1; i <= NumNPCsOf(enemy_id); i++){
npc e = LoadNPCOf(enemy_id, i);
if(e->Misc[0] == 0 || e->Misc[0] == 3 || e->Misc[0] == 6){
Waitframe();
continue;
}
}
enemy->Misc[0]++;
break;
}
}
else if(enemy->Misc[0] == 2){
Waitframes(wait);
timer = Rand(120,180);
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && timer > 0){
CircularMovement(enemy, largeradius, angle, speed);
angle %= 360;
angle++;
timer--;
Waitframe();
}
enemy->Misc[0]++;
}
else if(enemy->Misc[0] == 3) FormCircle(enemy, smallradius, angle);
else if(enemy->Misc[0] == 5){
timer = Rand(120,180);
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && timer > 0){
CircularMovement(enemy, smallradius, angle, speed);
angle %= 360;
angle++;
timer--;
Waitframe();
}
enemy->Misc[0]++;
}
else if(enemy->Misc[0] == 6) FormLine(enemy, position);
else if(enemy->Misc[0] == 8){
Waitframes(wait);
LinearMovement(enemy);
}
Wait(frame);
}
if(enemy->isValid()){
enemy->CSet = CSet2;
Waitframes(wait);
while(enemy->isValid()){
Stomp(enemy, height, wait);
Waitframes(wait);
}
}
else Quit();
npc trigger = LoadNPCOf(NPC_TRIGGER);
trigger->HP = HP_SILENT;
}
void FormCircle(npc enemy, int radius, int angle){
float pointx = 120 + radius*Cos(angle);
float pointy = 80 + radius*Sin(angle);
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
enemy->Misc[0]++;
}
void FormLine(npc enemy, int position){
float pointx = 32;
float pointy = 48 + (16 * position);
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
enemy->Misc[0]++;
}
void CircularMovement(npc enemy, int radius, int angle, int speed){
enemy->X = 120 + radius*Cos(angle*speed);
enemy->Y = 80 + radius*Sin(angle*speed);
}
void LinearMovement(npc enemy){
float pointx = 208;
int enemy_id = enemy->ID;
while(enemy->isValid() && NumNPCsOf(enemy_id) > 1 && (enemy->X != Round(pointx))){
enemy->Misc[1] += enemy->Step/100;
enemy->X = enemy->Misc[1];
Waitframe();
}
enemy->Misc[0] = 0;
}
void Stomp(npc enemy, int height, int wait){
float pointx = Link->X;
float pointy = Link->Y;
for(int i = height; i > 0; i--){
enemy->Z++;
Waitframe();
}
while(enemy->isValid() && (enemy->X != Round(pointx) || enemy->Y != Round(pointy))){
enemy->Misc[1] += VectorX(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->Misc[2] += VectorY(enemy->Step/100, Angle(enemy->X, enemy->Y, pointx, pointy));
enemy->X = enemy->Misc[1];
enemy->Y = enemy->Misc[2];
Waitframe();
}
Waitframes(wait);
if(enemy->isValid()){
for(int i = height; i > 0; i--){
enemy->Z--;
Waitframe();
}
}
if(enemy->isValid()) Game->PlaySound(SFX_HAMMER);
}
}
The bug is that they don't wait when they're suppose to which is after they reach they're destination after a FormCircle or FormLine function. They're suppose to wait until all of them "the npcs" have reached they're destination but they're not. And it's really starting to bug me. If someone could figure this out, that would be great.