To można zrobić jednym if'em.
Zaraz wrócę z editem.
GML (step przeciwnika)
angle=((((direction - point_direction(x,y,gracz.x,gracz.y)) mod 360) + 540) mod 360) - 180
if(angle<=20 and point_distance(x,y,gracz.x,gracz.y)<=100)
if(!collision_line(x,y,gracz.x,gracz.y,ściana,1,1))
{
//widzi gracza
}
Do angle jest zapisywana różnica pomiędzy kierunkiem w który patrzy przeciwnik, a kierunkiem w jaki snajdyje się gracz.
PIerwszy warunek (angle<=20) sprawdza czy różnica jest mniejsza od 20, z każdej strony. Więc daje nam to zasięg widzenia 40 stopni. Możesz to sobie dostroić.
Drugi warunek (point_distance(x,y,gracz.x,gracz.y)<=100) sprawdza czy gracz jest w zasięgu 100px. To też możesz to sobie dostroić.
Trzeci warunek (!collision_line(x,y,gracz.x,gracz.y,ściana,1,1)) sprawdza czy pomiędzy graczem a przeciwnikiem jest jakiś obiekt ściana.
Taki zapis sprawi że trzeci warunek (teoretycznie najtrudniejszy dla procesora) wykonywać się będzie tylko gdy pozostałe dwa będę spełnione. Trochę optymalizacji nikomu nie zaszkodzi. ;)