function Angolo(float xgiocatore, float xpersonaggio, float ygiocatore, float ypersonaggio)

{

float x;

float y;

float angle;

float degangle;

int angolo;

x= xgiocatore-xpersonaggio;

y= ygiocatore-ypersonaggio;

angle = Maths.ArcTan2(x,y);

degangle=Maths.RadiansToDegrees(angle);

angolo = FloatToInt(degangle);

if (angolo<0) angolo=360+angolo;

return angolo;

}

String direzione(int angolo)

{

if ((angolo>=337&&angolo<=360)||(angolo>=0&&angolo<22))

return "D";

else if (angolo>=22&&angolo<67)

return "RD";

else if (angolo>=67&&angolo<112)

return "R";

else if (angolo>=112&&angolo<157)

return "RU";

else if (angolo>=157&&angolo<202)

return "U";

else if (angolo>=202&&angolo<247)

return "LU";

else if (angolo>=247&&angolo<292)

return "L";

else if (angolo>=292&&angolo<337)

return "LD";

}

bool SightBlocked(float fx, float fy) {

int x = FloatToInt(fx, eRoundNearest);

int y = FloatToInt(fy, eRoundNearest);

// check if room pixel x, y is blocking

return GetLocationType(x - GetViewportX(), y - GetViewportY()) == eLocationObject;

}

bool IsVisibleTo(this Character*, Character* enemy) {

float x = IntToFloat(enemy.x), y = IntToFloat(enemy.y);

float dx = IntToFloat(this.x - enemy.x);

float dy = IntToFloat(this.y - enemy.y);

float l;

l = Maths.Sqrt(IntToFloat(((this.y - enemy.y)*(this.y - enemy.y))+((this.x - enemy.x)*(this.x - enemy.x))));

//check every 2 pixels

if (l == 0.0) return true;

dx /= l / 2.0;

dy /= l / 2.0;

int steps = FloatToInt(l / 2.0, eRoundDown);

for (int i = 0; i < steps; i++) {

x += dx; y += dy;

if (SightBlocked(x, y)) return false;

}

return true;

}

void VerificaAngolo(Character *giocatore, Character *nemico){

angolus=Angolo(IntToFloat(giocatore.x), IntToFloat(nemico.x), IntToFloat(giocatore.y), IntToFloat(nemico.y));

dir=direzione(angolus);

if (distanza(giocatore.x, giocatore.y, nemico.x, nemico.y)<167)

{

if (giocatore.IsVisibleTo(nemico))

{

if (nemico.Loop==0)

{

if (dir=="D")

{

giocatore.SayBackground("Mi ha visto.");

}

else giocatore.SayBackground("");

}

else if (nemico.Loop==1)

{

if (dir=="L")

{

giocatore.SayBackground("Mi ha visto.");

}

else giocatore.SayBackground("");

}

else if (nemico.Loop==2)

{

if (dir=="R")

{

giocatore.SayBackground("Mi ha visto.");

}

else giocatore.SayBackground("");

}

else if (nemico.Loop==3)

{

if (dir=="U")

{

giocatore.SayBackground("Mi ha visto.");

}

else giocatore.SayBackground("");

}

}

}

}

function repeatedly_execute_always()

{

VerificaAngolo(cEgo, cGen3);

VerificaAngolo(cEgo, cGen4);

VerificaAngolo(cEgo, cGen5);

VerificaAngolo(cGen1, cGen3);

VerificaAngolo(cGen1, cGen4);

VerificaAngolo(cGen1, cGen5);

VerificaAngolo(cGen2, cGen3);

VerificaAngolo(cGen2, cGen4);

VerificaAngolo(cGen2, cGen5);

}