program spacefight ;

CONST
RES=1000;

GLOBAL
fpg;
ships=2;
ship_id[2];
swidth=1200;
sheight=600;
//GRAV=100;
GRAV=0;

joints=0;

collision_graph;
miss_graph;
STRUCT j_data[1000]
  v1;
  v2;
  restlength;
  length;
  jtype;
  id2;
  n;

END


LOCAL
i; j; v_centre;  v_nose;
v1; v2;
begin
collision_graph=new_map(9,9,4,4,30);
miss_graph=new_map(9,9,4,4,45);

set_fps(60,0);
set_mode(swidth*1000+sheight);
fpg=load_fpg("PRG/spacefight.FPG");


ship_id[1]=spaceship(1,1000,300,1,180000,_up,_down,_left,_right,_enter);
ship_id[2]=spaceship(2,200,300,2,0,_w,_s,_a,_d,_e);
suit_up(ship_id[1]);
suit_up(ship_id[2]);

updater();
//info();

Loop
frame;
end
end
//---------------------------------------------------------------------------------

PROCESS updater();
private
dr[21];
col=89;
struts=0;
px1; py1; px2; py2; qx1; qy1; qx2; qy2;
BEGIN
for( i=0; i< joints; i+=1)

dr[i]=draw(1,col,15,0,j_data[i].v1.x/RES,j_data[i].v1.y/RES,j_data[i].v2.x/RES,j_data[i].v2.y/RES);
END

LOOP
struts=0;
from i=0 to 21;
col=40+j_data[i].jtype*16;

IF(j_data[i].jtype==2)
FROM j=0 to 21:
IF(j_data[j].jtype==1 and j_data[i].id2<>j_data[j].id2)

px1=j_data[i].v1.x/RES;
py1=j_data[i].v1.y/RES;
px2=j_data[i].v2.x/RES;
py2=j_data[i].v2.y/RES;
qx1=j_data[j].v1.x/RES;
qy1=j_data[j].v1.y/RES;
qx2=j_data[j].v2.x/RES;
qy2=j_data[j].v2.y/RES;

get_intersection(px1,py1,px2,py2,qx1,qy1,qx2,qy2);
END


END
END

END
//check for inte
//clear intersections

from i=0 to 21;
col=40+j_data[i].jtype*16;

move_draw(dr[i],col,15,j_data[i].v1.x/RES,j_data[i].v1.y/RES,j_data[i].v2.x/RES,j_data[i].v2.y/RES);

END
FRAME;

END
END
//---------------------------------------------------------------------------------


PROCESS get_intersection(p0x,p0y,p1x,p1y,q0x,q0y,q1x,q1y)
PRIVATE
topP;
topQ;
bot;
R; Rx; Ry;
S;
fix=10000;
result ="NO RESULT";

BEGIN
    graph=collision_graph;
    bot=((p1x-p0x)*(q1y-q0y))-((q1x-q0x)*(p1y-p0y)) ;
    IF(bot==0)
        result = "COLINEAR" ;
    ELSE
        topP=((p1x-p0x)*(p0y-q0y))-((p1y-p0y)*(p0x-q0x));
        topQ=((q1x-q0x)*(p0y-q0y))-((q1y-q0y)*(p0x-q0x));
        R=fix*topP/bot;
        Rx=R*(q1x-q0x)/fix;
        x=q0x+Rx;
        Ry=R*(q1y-q0y)/fix;
        y=q0y+Ry;
        IF((q1x-x)*(q0x-x)<=0 AND (p1x-x)*(p0x-x)<=0)
            result="COLLISION DETECTED";
            graph=collision_graph;
        ELSE
            result ="NO COLLISION";
            graph=0;
        END

    END
   // write(0,100,60,0,result);
    FRAME;

END






//---------------------------------------------------------------------------------



Process spaceship(n,x,y,graph,angle,up,down,left,right,fire)
PRIVATE
 bullet_id;
begin
flags=4;
resolution=RES;
x=x*resolution;
y=y*resolution;
bullet_id=bullet(x,y,100,angle);
LOOP
IF(key(up))
v_nose.y+=get_disty(angle,1000);
v_nose.x+=get_distx(angle,1000);

END


IF(key(left))
v_nose.smallbro.x-=get_distx(angle,500);
v_nose.smallbro.y-=get_disty(angle,500);
v_nose.smallbro.smallbro.smallbro.x+=get_distx(angle,500);
v_nose.smallbro.smallbro.smallbro.y+=get_disty(angle,500);

END


IF(key(right))
v_nose.smallbro.x+=get_distx(angle,500);
v_nose.smallbro.y+=get_disty(angle,500);
v_nose.smallbro.smallbro.smallbro.x-=get_distx(angle,500);
v_nose.smallbro.smallbro.smallbro.y-=get_disty(angle,500);

END


IF(key(fire) and bullet_id.z==100) bullet_id.z=-100;  END

if(v_centre)
x=v_centre.x;
y=v_centre.y;
angle=get_angle(v_nose);
END
frame;
END
end
//================================================================================

PROCESS suit_up(id2);
PRIVATE
verts=0;
edges=0;
i2;
v0=0;
//v1=0;
//v2=0;
e0;
e1;
BEGIN
v1=0;
v2=0;


   i=0;
//attach verts
    repeat
    get_point(0,id2.graph,i, &x,&y);

    if(x<>0 or y<>0)
        v1=vert(id2,i,x,y);  verts+=1;
    if(i==0) id2.v_centre=v1; END
    if(i==1) v0=v1;  id2.v_nose= v1; END
    i+=1;

    END
   until(x==0 and y==0)

//Attach joints/edges
        v1=v0;
        for (i=1; i<= verts-1; i+=1)
      if(i==verts-1) v2=v0; else
      v2=v1.smallbro;      END
       joint(id2,joints,v1,v2,1);

       joints+=1;   edges+=1;

      v1=v2;
      end
         joint(id2,joints,v0.bigbro,v0,2);
         joints+=1; joint(id2,joints,v0.bigbro,v0.smallbro,2);
         joints+=1; joint(id2,joints,v0.bigbro,v0.smallbro.smallbro,2);
         joints+=1; joint(id2,joints,v0.bigbro,v0.smallbro.smallbro.smallbro,2);
         joints+=1; joint(id2,joints,v0.bigbro,v0.smallbro.smallbro.smallbro.smallbro,2);
         joints+=1; joint(id2,joints,v0.smallbro,v0.smallbro.smallbro.smallbro.smallbro,3);
         joints+=1;


FRAME;
END
//================================================================================

PROCESS vert(id2,n,x,y)
private
X0; y0;
dx=0; dy=0;
fix=1000;
BEGIN
resolution=RES;
graph=new_map(5,5,2,2,15);
x*=resolution;
y*=resolution;
x+=id2.x;
y+=100*resolution;
x0=x; y0=y;
write_int(0,x+10,y,1,&n);
LOOP
y+=GRAV;
if(y>580*resolution) y=580*resolution; END
if(y<20*resolution)  y=20*resolution; END
if(x>1180*resolution) x=1180*resolution; END
if(x<20*resolution) x=20*resolution; END


dy=(fix-10)*(y-y0)/fix;
dx=(fix-10)*(x-x0)/fix;
x0=x;
y0=y;
x+=dx;
y+=dy;
//x0+=dx;
//y0+=dy;
FRAME;
END
END
//================================================================================

PROCESS joint(id2,n,v1,v2,jtype)
PRIVATE
dr;
col;
lenR;
len;
Dlen;
text;
inc=2;

BEGIN

       j_data[n].id2=id2;
       j_data[n].n=n;
       j_data[n].v1=v1;
       j_data[n].v2=v2;
       j_data[n].jtype=jtype;
       j_data[n].restlength=fget_dist(v2.x,v2.y,v1.x,v1.y);

resolution=RES;


lenR=fget_dist(v2.x,v2.y,v1.x,v1.y);

LOOP
x=(v2.x+v1.x)/2  ; y=(v2.y+v1.y)/2 ;


len=fget_dist(v2.x,v2.y,v1.x,v1.y);
Dlen=lenR-len;
if(abs(Dlen) >100)
v2.x+=get_distx(get_angle(v2),Dlen/inc);
v2.y+=get_disty(get_angle(v2),Dlen/inc);
v1.x+=get_distx(get_angle(v1),Dlen/inc);
v1.y+=get_disty(get_angle(v1),Dlen/inc);

END
FRAME;
//delete_text(text);
END
END
//===================================================================================

PROCESS info()
PRIVATE
BEGIN
LOOP
FRAME;
END
END
//================================================================================

Process bullet(x,y,z,angle)
Begin
graph=3;
Loop
if(z==-100)
advance(20);
if(x<0 or x>1200 or y<0 or y>600)   z=100; END
END
if(z==100) x=father.x; y=father.y;angle=father.angle; END
frame;
end
end