(*------------------------------------------------------------------------- little orbit simulator I just wrote (I guess thats what you could call it) I was going to add more use with the mouse.. and maybe make it into a starcontrol 2 type game, but ..I should really do that in c :) I hate using C tho! :) Borland, please come out with BP 8 ! code is.. freeware mail me if you have any comments/questions/suggestions I dont know if the math is 100% correct, but I'd like it to be as correct as possible.. if you add anything to this, mail it to me ryan@emiko.igcom.net (or if that fails, ryan@ripco.com) --------------------------------------------------------------------------*) {$G+,N+,E+} Uses mymouse, {stuff,} Crt; { mymouse is in MOUSE.SWG !! } Type Thing=record mass: real; x,y, Oldx,Oldy: real; {position} vx, vy : real; {x and y velocity} end; Var ch:char; st,s:string; ok:boolean; loops:longint; i:integer; ob,test:thing; oba:array[1..20] of thing; {--config stuff--} B,trail:byte; thedelay:word; do1,mouseshown:boolean; scale,maxspeed:integer; lastmouseuse:word; TotalThings,constant,gr:integer; {can you tell I wrote this in 2 hours?} procedure config; var t:text; i:integer; begin gr:= -1; {if -1, gravity, if 1, repluse } constant:=1; {constant of the universe "or something", 1} do1:=false; {false=obj 1 is center of universe} trail:=0; {0=none 1=grey 2=color} scale:=10; {drawing scale (pixles=mass/scale) not at all accurate, just for show} maxspeed:=5; {speed of light? :) fastest anything can go. 5. } {you might not have a pentium 90.. :) if so lower this} {*******} thedelay:=80; {milisecond delay in main loop.. 80 on my pentium90} {********} mouseshown:=true; {is mouse cursor shown on screen right now} lastmouseuse:=0000; {not used now} {assign(t,'data.dat'); reset(t);} i:=0; {totalthings:=0; repeat inc(i); inc(totalthings); with oba[i] do begin readln(t,mass); readln(t,x); readln(t,y); readln(t,vx); readln(t,vy); oldx:=0; oldy:=0; end; until eof(t); close(t); } totalthings:=3; with oba[1] do begin oldx:=10; oldy:=10; mass:=70; x:=150; y:=100; vx:=1; vy:=1; end; with oba[2] do begin mass:=4; x:=21; y:=84; vx:=2; vy:=0; end; with oba[3] do begin mass:=18; x:=122; y:=122; vx:=0; vy:=1; end; end; { ---------------------------------------------------------------------- } procedure SETMODE(mode : byte); assembler; asm MOV AH,0 MOV AL,MODE INT $10 end; (* begin regs.ah := 0; regs.al := mode; intr($10, regs) end; *) function i2s(i: Longint): string; {integer to string} var s: string[11]; begin Str(i, s); I2s := s; end; Procedure plot286(x,y:integer; c:byte); {very fast putpixel that uses 286 instructions} Inline( $58/$B9/$00/$A0/$8E/$C1/ $5B/$88/$DD/$5F/$01/$CF/ $C1/$E9/$02/$01/$CF/$AA); { ---------------------------------------------------------------------- } function update(var it:thing):string; var t,ax,ay,x2,y2,k:real; a,dist,tempreal:real; sx,sy,tempi:integer; ret:string; begin with it do begin Oldx:=x; Oldy:=y; ax:=0; ay:=0; x:=x+vx; y:=y+vy; for tempi:= 1 to totalthings do begin x2:=oba[tempi].x; y2:=oba[tempi].y; if (x<>x2) and (y<>y2) then begin tempreal:=((sqr(x-x2)+sqr(y-y2))); if tempreal<1 then tempreal:=1;{they touched..} {do this later: so add everything and kill one } k:=(oba[tempi].mass){ * mass)} * constant ; dist:=gr* (k / tempreal); a:=arctan((y-y2) / (x-x2)); if x=x2 then ay:=( dist*sin(a) )+ay else ay:=( dist * -sin(a) )+ay; end; vx:=vx+ax; vy:=vy+ay; {---} if vy>maxspeed then vy:=maxspeed; if vx>maxspeed then vx:=maxspeed; if vy<-maxspeed then vy:=-maxspeed; if vx<-maxspeed then vx:=-maxspeed; {gotoxy(1,24); write(a);} ret:=' ax: '+i2s(trunc(ax))+' ay: '+i2s(trunc(ay))+' '; {--screen edge stuff, more realistic without these 4 lines:----} if x<1 then x:=299; if x>299 then x:=1; if y<1 then y:=199; if y>199 then y:=1; update:=ret; end; end; procedure draw(it:thing; color:integer); var c,i,i2:integer; begin {this won't let it draw off screen} for i:=0 to trunc(it.mass / scale) do with it do begin for i2:=0 to trunc(mass / scale) do if ((oldy+i<200) and (oldx+i2<300)) then begin if trail=0 then c:=0 else if trail=1 then c:=8 else c:=color; plot286(trunc(Oldx+i2),trunc(Oldy+i),c); end; end; for i:=0 to trunc(it.mass / scale) do with it do for i2:=0 to trunc(mass / scale) do if ((y+i<200) and (x+i2<300)) then plot286(trunc(x+i2),trunc(y+i),color); end; { ---------------------------------------------------------------------- } begin config; loops:=0; initmouse(b,ok); if ok=false then begin writeln('no mouse found!'); halt; end else writeln('mouse found, ',b,' buttons.'); setmode($13); directvideo:=false; showmouse; repeat if mouseleftpressed then begin mouseshown:=not mouseshown; if mouseshown then showmouse else begin {gotoxy(1,1); for i:=1 to 38 do write(' ');} fillchar(ptr($A000,0)^,64000,0); hidemouse; end; end else if mouserightDOWN{pressed} then begin if totalthings<20 then begin inc(totalthings); oba[totalthings].mass:=RANDOM(5)+1; oba[totalthings].x:=mousex div 2; oba[totalthings].y:=mousey; oba[totalthings].vx:=1; oba[totalthings].vy:=1; end; {BEEP;} end; if mouseshown then begin getmousexy; gotoxy(1,1); write('mouseX:',mousex,' mouseY:',mousey,' '); end; inc(loops); s:='Loop:'+i2s(loops); for i:=1 to TotalThings do if (i<>1) or ((i=1) and (do1=true)) then st:=update(oba[i]); s:=s+st; for i:=1 to TotalThings do draw(oba[i],i); {gotoxy(1,25); write(s);} delay(thedelay); until keypressed; ch:=readkey; textmode(co80); end.