{"id":451,"date":"2014-07-22T06:24:32","date_gmt":"2014-07-22T06:24:32","guid":{"rendered":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/?p=451"},"modified":"2014-07-22T06:39:55","modified_gmt":"2014-07-22T06:39:55","slug":"gravity-wars","status":"publish","type":"post","link":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/2014\/07\/22\/gravity-wars\/","title":{"rendered":"Gravity Wars"},"content":{"rendered":"<p>Here is the main module of Gravity Wars by Ed Bartz. This was probably originally written for TDI Modula-2. I suspect I don&#8217;t have the source code for FindImages module which might prove interesting.<\/p>\n<p>The blurb for Gravity Wars states:<\/p>\n<blockquote><p>GravityWars&#8230;&#8230;<br \/>\nThe object of the game is for one player to hit the other with a missle before being hit yourself. Since the ships don&#8217;t move and the planets don&#8217;t move the game sounds easy right&#8230;Wrong. All the planets have gravity, so the missles bend an twist, even reverse. It&#8217;s very easy to hit yourself. The two players take turns firing missles by entering firing angles and velocities. The winner is the ship left alive.<\/p><\/blockquote>\n<p>Sound familiar? I just did a google search for &#8216;Gravity Wars&#8217;, expecting to retrieve a link to the <a href=\"http:\/\/en.wikipedia.org\/wiki\/Spacewar_%28video_game%29\">PDP-1 game Spacewar<\/a>, but was instead treated to a link for <a href=\"http:\/\/en.wikipedia.org\/wiki\/Gravity_Wars\">this very game!<\/a> However the picture below is for a clone &#8211; the game appears to have inspired quite a few <a href=\"http:\/\/www.gravitywars.co.uk\/\">clones<\/a>, and there is even a little <a href=\"https:\/\/en.wikipedia.org\/wiki\/Talk:Gravity_Wars\">controversy about its&#8217; origins<\/a> (I&#8217;ve added a comment to the Wikipedia article indicating that I have the source code and providing a more accurate copyright date).<\/p>\n<div id=\"attachment_454\" style=\"width: 456px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-454\" data-attachment-id=\"454\" data-permalink=\"http:\/\/www.wickensonline.co.uk\/rc2012sc\/2014\/07\/22\/gravity-wars\/gravitywarspc\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?fit=446%2C335\" data-orig-size=\"446,335\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"Gravity Wars\" data-image-description=\"\" data-image-caption=\"&lt;p&gt;Gravity Wars from the Wikipedia article!&lt;\/p&gt;\n\" data-medium-file=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?fit=300%2C225\" data-large-file=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?fit=446%2C335\" class=\"size-full wp-image-454\" src=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?resize=446%2C335\" alt=\"Gravity Wars from the Wikipedia article!\" width=\"446\" height=\"335\" srcset=\"https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?w=446 446w, https:\/\/i0.wp.com\/www.wickensonline.co.uk\/rc2012sc\/wp-content\/uploads\/2014\/07\/GravityWarsPC.jpg?resize=300%2C225 300w\" sizes=\"(max-width: 446px) 100vw, 446px\" \/><\/a><p id=\"caption-attachment-454\" class=\"wp-caption-text\">Gravity Wars from the Wikipedia article!<\/p><\/div>\n<p>Let battle (between me and the source code) commence!<\/p>\n<pre class=\"height-set:true height:600 lang:delphi decode:true\" title=\"MODULE GravityWars\">MODULE GravityWars;\r\n\r\n(**********************************************************************\r\n***************           Written by Ed Bartz           ***************\r\n***************           Copyright  9\/15\/87            ***************\r\n***************    This program may be redistributed    ***************\r\n***************    or modified as long as these         ***************\r\n***************    notices and all other references     ***************\r\n***************    to the author remain intack.         ***************\r\n***************    Also this may not be used for        ***************\r\n***************    profit by anyone without the         ***************\r\n***************    express permission of the author.    ***************\r\n**********************************************************************)\r\n\r\nFROM Sounds IMPORT OpenAudio,CloseAudio,FireSound,InitSound;\r\nFROM Intuition  IMPORT\r\n     WindowPtr, ScreenPtr, Menu, Window,\r\n     MenuItemFlagsSet, ItemEnabled, MenuToggle, MenuItem, ItemText,\r\n     SetMenuStrip, HighComp, Image, DrawImage,\r\n     OpenWindow, CloseWindow,\r\n     NewScreen, OpenScreen, CloseScreen, ShowTitle;\r\nFROM FindImages IMPORT ImageDescTablePtr, ImageDesc, FindImageTable;\r\nIMPORT RandomNumbers;\r\nFROM MathLib0 IMPORT MathTransBase,real,entier,sin,cos,ln,exp;\r\nFROM GW IMPORT \r\n     Pl, Mdata, Shell, String, DrawPlanet, Distance, Pposition,\r\n     Sposition, Stars, Sexplosion, Pexplosion, DrawLine,\r\n     DrawShip;\r\nFROM MyWindow IMPORT\r\n     OpenLibraries, InitScreen, InitWindow, OpenIOWin, CloseIOWin,\r\n     InitMenu, SetColors, ReadMenu, MenuData, ReadMouse;\r\nFROM Rasters IMPORT SetRast,RastPort,Jam1,Jam2;\r\nFROM Console IMPORT  \r\n     OpenWConsole, CloseWConsole, PutChar, PutStr, GetChar, GetStr,\r\n     QueueRead,  Conport, OpenRConsole, CloseRConsole, MayGetChar;\r\nFROM Conversions IMPORT ConvStringToNumber, ConvNumberToString;\r\nFROM RealConversions IMPORT ConvStringToReal, ConvRealToString, Decimal;\r\nFROM Drawing IMPORT SetAPen, WritePixel, ReadPixel,Move,Draw,SetDrMd;\r\nFROM Options IMPORT\r\n     DeletePlanet, MakePlanet, MovePlanet, CleanScreen,\r\n     MoveShip,  IdentifyS, MakeHole;\r\nFROM Libraries IMPORT CloseLibrary;\r\nFROM SYSTEM IMPORT BYTE;\r\n\r\nVAR\r\n     wp                            : WindowPtr;\r\n     IOwp                          : WindowPtr;\r\n     sp                            : ScreenPtr;\r\n     Wport,Rport                   : Conport;\r\n     GravityWarsmenu               : MenuData;\r\n     ptype,Pnum,MaxPlan            : CARDINAL;\r\n     erase,SoundOn,SoundAvail      : BOOLEAN;\r\n     id                            : ImageDescTablePtr;\r\n     ImgCount                      : CARDINAL;\r\n\r\n(* Random - 16-bit version of RandomNumbers.Random *)\r\nPROCEDURE Random(max: CARDINAL): CARDINAL;\r\nVAR \r\n  i : CARDINAL;\r\n  \r\nBEGIN\r\n  i:= RandomNumbers.Random(max);\r\n  i := i + 1;\r\n  RETURN i;\r\nEND Random;\r\n\r\nPROCEDURE ShowPic(wp : WindowPtr);\r\n  VAR\r\n     bg         : Image;\r\n\r\n  BEGIN\r\n    SetDrMd(wp^.RPort^,Jam2);\r\n    SetRast(wp^.RPort^,0);\r\n    Stars(wp);\r\n    id := FindImageTable(087654321H, ImgCount);\r\n    IF (id # NIL) THEN\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[0].Width;\r\n        Height := id^[0].Height;\r\n        Depth := id^[0].Depth;\r\n        ImageData := id^[0].Data;\r\n        PlanePick := BYTE(03H);\r\n        PlaneOnOff := BYTE(03H);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,195,80);\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[25].Width;\r\n        Height := id^[25].Height;\r\n        Depth := id^[25].Depth;\r\n        ImageData := id^[25].Data;\r\n        PlanePick := BYTE(0FH);\r\n        PlaneOnOff := BYTE(0FH);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,270,130);\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[16].Width;\r\n        Height := id^[16].Height;\r\n        Depth := id^[16].Depth;\r\n        ImageData := id^[16].Data;\r\n        PlanePick := BYTE(0FH);\r\n        PlaneOnOff := BYTE(0FH);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,540,300);\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[19].Width;\r\n        Height := id^[19].Height;\r\n        Depth := id^[19].Depth;\r\n        ImageData := id^[19].Data;\r\n        PlanePick := BYTE(0FH);\r\n        PlaneOnOff := BYTE(0FH);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,60,290);\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[12].Width;\r\n        Height := id^[12].Height;\r\n        Depth := id^[12].Depth;\r\n        ImageData := id^[12].Data;\r\n        PlanePick := BYTE(0FH);\r\n        PlaneOnOff := BYTE(0FH);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,50,30);\r\n      WITH bg DO\r\n        LeftEdge := 0;\r\n        TopEdge := 0;\r\n        Width := id^[11].Width;\r\n        Height := id^[11].Height;\r\n        Depth := id^[11].Depth;\r\n        ImageData := id^[11].Data;\r\n        PlanePick := BYTE(0FH);\r\n        PlaneOnOff := BYTE(0FH);\r\n        NextImage := NIL;\r\n      END;\r\n      DrawImage(wp^.RPort^,bg,550,40);\r\n    END;\r\n  END ShowPic;\r\n\r\n  PROCEDURE Game ();\r\n    CONST\r\n      round = 0.83;\r\n\r\n    VAR\r\n      playernum,color,index,Qpointer : CARDINAL;\r\n      PlanetPos\t: ARRAY [0..15] OF Pl;\r\n      Ship : ARRAY [0..1] OF Pl;\r\n      trail : ARRAY [0..299] OF ARRAY [0..3] OF INTEGER;\r\n      p,player : INTEGER;\r\n      temp,Set,GameOn,Quit,Set1 : BOOLEAN;\r\n      Outmsg,Inmsg : String;\r\n      LastShot : Mdata;\r\n      Missle : Shell;\r\n      c,char : CHAR;\r\n      error : INTEGER;\r\n\r\n    PROCEDURE Setup;\r\n      BEGIN\r\n        SetRast(wp^.RPort^,0);\r\n        Set:=TRUE;\r\n        Set1:=TRUE;\r\n        Pnum:= Random(MaxPlan- 4)+4;\r\n        Stars(wp);\r\n        Pposition(PlanetPos,Pnum,id,wp);\r\n        Sposition(wp,Ship,PlanetPos,Pnum);\r\n      END Setup;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE Maximum;\r\n\r\n      VAR\r\n        results1,results : BOOLEAN;\r\n        str : ARRAY [0..80] OF CHAR;\r\n        li: LONGINT;\r\n      BEGIN\r\n        results:=OpenIOWin(Wport,IOwp,sp);\r\n        IF results THEN\r\n          PutStr(Wport,\"Input maximum number of planets (5 to 15) \");\r\n          results:= GetStr(Rport,Wport,str);\r\n          IF results THEN\r\n            (*ConvertToCardinal(str,results,MaxPlan);*)\r\n            (*IF NOT(results) THEN MaxPlan:=9; END;*)\r\n            IF ConvStringToNumber(str,li,FALSE,10) THEN\r\n              MaxPlan:=li;\r\n            ELSE (* Invalid Conv *)\r\n              MaxPlan:=9;\r\n            END;\r\n          ELSE MaxPlan:=9;\r\n          END;\r\n          IF MaxPlan&gt;15 THEN MaxPlan:= 15; END;\r\n          IF MaxPlan&lt;5 THEN MaxPlan:= 5; END;\r\n          (*ConvertCardinal(MaxPlan,2,str);*)\r\n          li := MaxPlan;\r\n          ConvNumberToString(str,li,FALSE,10,2,\" \");\r\n          WITH GravityWarsmenu DO\r\n            Text[14][18]:=str[0];\r\n            Text[14][19]:=str[1];\r\n          END;\r\n          CloseIOWin(Wport,IOwp);\r\n        END;\r\n   END Maximum;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE ChooseSide;\r\n\r\n      VAR\r\n        results1,results : BOOLEAN;\r\n        str : ARRAY [0..80] OF CHAR;\r\n        li: LONGINT;\r\n      BEGIN\r\n        results:=OpenIOWin(Wport,IOwp,sp);\r\n        IF results THEN\r\n          PutStr(Wport,\"Choose which ship to practice with (1 or 2):\");\r\n          results:= GetStr(Rport,Wport,str);\r\n          IF results THEN\r\n            (*ConvertToCardinal(str,results,playernum);*)\r\n            IF ConvStringToNumber(str,li,FALSE,10) THEN\r\n              playernum := li;\r\n            ELSE (* Invalid Conv *)\r\n              playernum := 0;\r\n            END;\r\n            IF playernum &gt; 2 THEN playernum := 0; END;\r\n          ELSE playernum := 0;\r\n          END;\r\n          CloseIOWin(Wport,IOwp);\r\n        END;\r\n   END ChooseSide;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE READMenu;\r\n\r\n      VAR\r\n        p,c : CARDINAL;\r\n\r\n      BEGIN\r\n         c:=0;\r\n         c:=ReadMenu(wp);\r\n             CASE c OF\r\n            1: (* Setup Game *)\r\n                Setup;                               |\r\n            2: (* Play Game *)\r\n                IF Set THEN\r\n                  GameOn := TRUE;\r\n                  FOR p := 19 TO 23 DO\r\n                    WITH GravityWarsmenu.Items[p] DO\r\n                      Flags:=Flags-MenuItemFlagsSet{ItemEnabled};\r\n                    END;\r\n                  END;\r\n                  WITH GravityWarsmenu.Items[9] DO\r\n                    Flags:=Flags-MenuItemFlagsSet{ItemEnabled};\r\n                  END;\r\n                END;                                 |\r\n            3: (* Replay Game *)\r\n                IF Set1 THEN\r\n                  Set := TRUE;\r\n                  CleanScreen(wp,id,Ship,PlanetPos,Pnum);\r\n                  GameOn := TRUE;\r\n                  FOR p := 19 TO 23 DO\r\n                    WITH GravityWarsmenu.Items[p] DO\r\n                      Flags:=Flags-MenuItemFlagsSet{ItemEnabled};\r\n                    END;\r\n                  END;\r\n                  WITH GravityWarsmenu.Items[9] DO\r\n                    Flags:=Flags-MenuItemFlagsSet{ItemEnabled};\r\n                  END;\r\n                END;                                 |\r\n            4: (* Stop Game *)\r\n                GameOn:=FALSE;\r\n                FOR p:=19 TO 23 DO\r\n                  WITH GravityWarsmenu.Items[p] DO\r\n                    Flags:=MenuItemFlagsSet{ItemText, ItemEnabled} + HighComp;\r\n                  END;\r\n                END;\r\n                WITH GravityWarsmenu.Items[9] DO\r\n                  Flags:=MenuItemFlagsSet{ItemText, ItemEnabled} + HighComp;\r\n                END;                                 |\r\n            5: (* QUIT *)\r\n                Quit:=TRUE;                          |\r\n            6: (* Set Maximum Planets *)\r\n                Maximum;                             |\r\n            7:(* erase trails *)\r\n                IF erase THEN \r\n                erase:= FALSE;\r\n                GravityWarsmenu.Text[15]:=\"Erase Missle Trails\";\r\n                ELSE erase := TRUE;\r\n                GravityWarsmenu.Text[15]:=\"Leave Missle Trails\";\r\n                END;                                 |\r\n            8:(* Redraw screen *)\r\n                CleanScreen(wp,id,Ship,PlanetPos,Pnum); |\r\n            9:(* One Player\/Two Player *)\r\n                IF playernum = 0 THEN\r\n                  ChooseSide;\r\n                ELSE playernum := 0;\r\n                END;   \r\n                IF playernum = 0 THEN\r\n                    GravityWarsmenu.Text[17]:=\"Practice\";\r\n                ELSE  GravityWarsmenu.Text[17]:=\"Compete\";\r\n                END;                                     |\r\n            10:(*Control Sound*)\r\n                IF SoundAvail THEN\r\n                  IF SoundOn THEN\r\n                    SoundOn := FALSE;\r\n                    GravityWarsmenu.Text[18]:=\"Turn Sound On \";\r\n                  ELSE\r\n                    SoundOn := TRUE;\r\n                    GravityWarsmenu.Text[18]:=\"Turn Sound OFF\";\r\n                  END;\r\n                END;                                     |\r\n            11: (* MoveShip *)\r\n                Set:=TRUE;\r\n                IF NOT(GameOn) THEN\r\n                  MoveShip(wp,Ship,PlanetPos,Pnum);\r\n                END;                                 |   \r\n            12: (* MovePlanet *)\r\n                Set:=TRUE;\r\n                IF NOT(GameOn) THEN\r\n                  MovePlanet(wp,id,Ship,PlanetPos,Pnum);\r\n                END;                                 |   \r\n            13: (*MakePlanet*)\r\n                Set:=TRUE;\r\n                IF NOT(GameOn) THEN\r\n                  MakePlanet(wp,id,Ship,PlanetPos,Pnum);\r\n                END;                                 |   \r\n            14: (* Make Black Hole *)\r\n                Set:=TRUE;\r\n                IF NOT(GameOn) THEN\r\n                  MakeHole(wp,id,Ship,PlanetPos,Pnum);\r\n                END;                                 |   \r\n            15: (*DeletePlanet*)\r\n                Set:=TRUE;\r\n                IF NOT(GameOn) THEN\r\n                  DeletePlanet(wp,id,PlanetPos,Pnum);\r\n                END;\r\n             ELSE;\r\n             END;\r\n    END READMenu;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n   PROCEDURE Newline;\r\n     BEGIN\r\n       PutChar(Wport,12C);\r\n       PutChar(Wport,15C);\r\n     END Newline;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE GetData(VAR ang,vel:REAL;player:INTEGER);\r\n\r\n      VAR\r\n        results,results1 : BOOLEAN;\r\n        p : CARDINAL;\r\n        String : ARRAY [0..80] OF CHAR;\r\n        c : CHAR;\r\n\r\n      BEGIN\r\n        results:=OpenIOWin(Wport,IOwp,sp);\r\n        IF results THEN\r\n          IF player=0 THEN PutStr(Wport,\"Player 1\");\r\n            ELSE PutStr(Wport,\"Player 2\");\r\n          END;\r\n          Newline;\r\n          PutStr(Wport,\"Input Firing angle [\");\r\n          (*ConvertReal(ang,9,6,String);*)\r\n          ConvRealToString(ang, String, 6, Decimal);\r\n          PutStr(Wport,String);\r\n          PutStr(Wport,\"]: \");\r\n          results:= GetStr(Rport,Wport,String);\r\n          IF results THEN\r\n            (*ConvertToReal(String,results,ang);*)\r\n            (*IF NOT(results) THEN ang:=0.0; END;*)\r\n            ang := ConvStringToReal(String);\r\n          END;\r\n          Newline;\r\n          PutStr(Wport,\"Input Firing Velocity [\");\r\n          (*ConvertReal(vel,9,6,String);*)\r\n          ConvRealToString(vel, String, 6, Decimal);\r\n          PutStr(Wport,String);\r\n          PutStr(Wport,\"]: \");\r\n          results:= GetStr(Rport,Wport,String);\r\n          IF results THEN\r\n            (*ConvertToReal(String,results,vel);*)\r\n            (*IF NOT(results) THEN vel:=1.0; END;*)\r\n            vel := ConvStringToReal(String);\r\n          END;\r\n        END;\r\n        CloseIOWin(Wport,IOwp);\r\n  END GetData;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE Gravity(VAR mis:Shell);\r\n\r\n      VAR\r\n        dr3,dr,dx,dy,ax,ay : REAL;\r\n        p,j,k : INTEGER;\r\n\r\n      BEGIN\r\n        ax := 0.0;\r\n        ay := 0.0;\r\n        FOR p:= 0 TO INTEGER(Pnum-1) DO\r\n          WITH PlanetPos[p] DO\r\n            dx:=real(x-mis.x);\r\n            dy:=real(y-mis.y);\r\n            IF (ABS(dx)&gt;5.0) OR (ABS(dy)&gt;5.0) THEN\r\n              dr:=1.5*ln(dx*dx+dy*dy);\r\n              dr3:=exp(dr);\r\n              ax:=ax+(m*dx)\/dr3;\r\n              ay:=ay+(m*dy)\/dr3;\r\n            END;\r\n          END;\r\n        END;\r\n        WITH mis DO\r\n          vx:=ax+vx;\r\n          vy:=ay+vy;\r\n          x:=INTEGER(entier(vx))+x;\r\n          y:=INTEGER(entier(vy))+y;\r\n        END;\r\n    END Gravity;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE PutString(msg:String);\r\n      \r\n      VAR\r\n       p : LONGCARD;\r\n       results,results1 : BOOLEAN;\r\n\r\n      BEGIN\r\n        results:= OpenIOWin(Wport,IOwp,sp);\r\n        IF results THEN \r\n          PutStr(Wport,msg);\r\n          FOR p := 0D TO 150000D DO;\r\n          END;\r\n        END;\r\n        CloseIOWin(Wport,IOwp);\r\n    END PutString;\r\n(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n   PROCEDURE queue(x1,y1,x2,y2 : INTEGER;VAR x3,y3,x4,y4 : INTEGER) :BOOLEAN;\r\n\r\n     BEGIN\r\n       trail[Qpointer][0] := x1;\r\n       trail[Qpointer][1] := y1;\r\n       trail[Qpointer][2] := x2;\r\n       trail[Qpointer][3] := y2;\r\n       Qpointer := (Qpointer + 1) MOD 300;\r\n       x3 := trail[Qpointer][0];\r\n       y3 := trail[Qpointer][1];\r\n       x4 := trail[Qpointer][2];\r\n       y4 := trail[Qpointer][3];\r\n       IF ((y3 = 1000) AND (y4 = 1000))THEN RETURN FALSE;\r\n       ELSE RETURN TRUE;\r\n       END;\r\n   END queue;       \r\n(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n   PROCEDURE clearqueue;\r\n     VAR\r\n       i : CARDINAL;\r\n     BEGIN\r\n       FOR i := 0 TO 299 DO\r\n         trail[i][0] := 1000;\r\n         trail[i][1] := 1000;\r\n         trail[i][2] := 1000;\r\n         trail[i][3] := 1000;\r\n       END;\r\n   END clearqueue;\r\n(*++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n   PROCEDURE DrawTrail (VAR x,y,oldx,oldy:INTEGER) :INTEGER;\r\n\r\n     VAR\r\n       x1,y1,x2,y2,i,k,l : INTEGER;\r\n       rp : RastPort;\r\n    \r\n     BEGIN\r\n      IF (x&lt;0) OR (x&gt;639) OR (y&lt;0) OR (y&gt;399) THEN RETURN 0;END;\r\n      rp := wp^.RPort^;\r\n      i:= 0;\r\n      l:=1;\r\n      x1:= (x - oldx);\r\n      y1:= (y - oldy);\r\n      x2:=oldx;\r\n      y2:=oldy;\r\n      IF ABS(x1) &gt; ABS(y1) THEN k:= ABS(x1);\r\n      ELSE k:= ABS(y1);\r\n      END;\r\n      WHILE (l &lt;= k)AND(i &lt; 3) DO\r\n        x:=x2;\r\n        y:=y2;\r\n        x2:= ((x1*l) DIV k) + oldx;\r\n        y2:= ((y1*l) DIV k) + oldy;\r\n        i:=ReadPixel(rp,x2,y2);\r\n        l:=l+1;\r\n      END;\r\n      IF i &lt; 3 THEN \r\n        x:=x2;\r\n        y:=y2;\r\n      END;\r\n      Move(rp,oldx,oldy);\r\n      Draw(rp,x,y);\r\n      RETURN i;\r\n    END DrawTrail;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE Launch(VAR Mis:Shell);\r\n      VAR\r\n       c,i,j,n : CARDINAL;\r\n       Outside,data,OnceAround : BOOLEAN;\r\n       oldx,oldy,x1,y1,x2,y2,k,l,r : INTEGER;\r\n       eMis : Shell;\r\n\r\n      BEGIN\r\n        SetDrMd(wp^.RPort^,Jam1);\r\n        eMis := Mis;\r\n        OnceAround := FALSE;\r\n        Qpointer := 0;\r\n        Outside:=FALSE;\r\n        REPEAT\r\n          Gravity (Mis);\r\n          IF (((Mis.x-eMis.x)&gt;18)OR((Mis.x-eMis.x)&lt;(-18))) THEN \r\n            Outside:=TRUE;\r\n          END;\r\n          IF (((Mis.y-eMis.y)&gt;7)OR((Mis.y-eMis.y)&lt;(-7))) THEN \r\n            Outside:=TRUE;\r\n          END;\r\n        UNTIL Outside;\r\n        IF SoundOn THEN  FireSound; END;\r\n        i:=0;\r\n        Outside:=FALSE;\r\n        oldx:=Mis.x;\r\n        oldy:=Mis.y;\r\n        WITH Mis DO\r\n          REPEAT \r\n            READMenu;\r\n            SetAPen(wp^.RPort^,1);\r\n            Gravity(Mis);\r\n            i := DrawTrail(x,y,oldx,oldy);\r\n            IF erase THEN\r\n              data := queue(x,y,oldx,oldy,x1,y1,x2,y2);\r\n              IF data THEN\r\n                SetAPen(wp^.RPort^,0);\r\n                n := DrawTrail(x1,y1,x2,y2);\r\n              END;\r\n              IF Qpointer = 0 THEN OnceAround := TRUE;END;\r\n            END;\r\n           oldx := x;\r\n           oldy := y;\r\n           IF (x&lt;(-320))OR(x&gt;940)OR(y&lt;(-200))OR(y&gt;600)THEN\r\n              Outside:=TRUE;\r\n            END;\r\n          UNTIL (Outside OR (i&gt;2) OR NOT(GameOn) OR Quit);\r\n        END;\r\n        IF Outside THEN\r\n          PutString(\"Missle Left The Solar System\");\r\n        END;\r\n        IF ((i&gt;3) AND (NOT(Outside))) THEN\r\n          Pexplosion(Mis,wp,SoundOn);\r\n        END;\r\n        IF erase AND NOT(i=3) THEN\r\n          IF NOT OnceAround THEN Qpointer := 299; END;\r\n          REPEAT\r\n            data := queue(1000,1000,1000,1000,x1,y1,x2,y2);\r\n            IF data THEN\r\n              SetAPen(wp^.RPort^,0);\r\n              n := DrawTrail(x1,y1,x2,y2);\r\n            END;\r\n          UNTIL (NOT data);\r\n        END;\r\n        IF ((i=3) AND (NOT(Outside))) THEN\r\n          j:= IdentifyS(Mis.x,Mis.y,Ship);\r\n          IF j&lt;2 THEN \r\n            clearqueue;\r\n            Sexplosion(Mis,wp,SoundOn);\r\n            IF j=0 THEN\r\n              PutString(\"Player 2 Wins!!!\");\r\n            ELSE\r\n              PutString(\"Player 1 Wins!!!\");\r\n            END;\r\n            FOR j:=19 TO 23 DO\r\n              WITH GravityWarsmenu.Items[j] DO\r\n                Flags:=MenuItemFlagsSet{ItemText, ItemEnabled} + HighComp;\r\n              END;\r\n            END;\r\n            WITH GravityWarsmenu.Items[9] DO\r\n              Flags:=MenuItemFlagsSet{ItemText, ItemEnabled} + HighComp;\r\n            END;\r\n            Set:=FALSE;\r\n            GameOn:=FALSE;\r\n          ELSE i:=0;\r\n          END;\r\n        END;\r\n    END Launch;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    PROCEDURE Play;\r\n\r\n      VAR\r\n        ang,vel : REAL;\r\n        p : INTEGER;\r\n \r\n      BEGIN\r\n        player := 1;\r\n        WITH LastShot DO\r\n          P1ang:=0.0;\r\n          P1vel:=0.0;\r\n          P2ang:=0.0;\r\n          P2vel:=0.0;\r\n        END;\r\n        WHILE GameOn AND NOT(Quit) DO\r\n          IF player=0 THEN\r\n            player:= 1;\r\n            ang:=LastShot.P2ang;\r\n            vel:=LastShot.P2vel;\r\n          ELSE\r\n            player:=0;\r\n            ang:=LastShot.P1ang;\r\n            vel:=LastShot.P1vel;\r\n          END;\r\n          IF playernum &gt; 0 THEN \r\n            player := playernum -1;\r\n            IF player=1 THEN\r\n              ang:=LastShot.P2ang;\r\n              vel:=LastShot.P2vel;\r\n            ELSE\r\n              ang:=LastShot.P1ang;\r\n              vel:=LastShot.P1vel;\r\n          END;\r\n          END;\r\n          GetData(ang,vel,player);\r\n          IF vel&gt;10.0 THEN vel:=10.0; END;\r\n          IF vel&lt;(-10.0) THEN vel:=(-10.0); END;\r\n          IF player=1 THEN\r\n            LastShot.P2ang:=ang;\r\n            LastShot.P2vel:=vel;\r\n          ELSE\r\n            LastShot.P1ang:=ang;\r\n            LastShot.P1vel:=vel;\r\n          END;\r\n          WITH Missle DO\r\n            vx:=vel*cos((-ang)*0.0174533);\r\n            vy:=vel*sin(0.0174533*(-ang));\r\n            x:=Ship[player].x;\r\n            y:=Ship[player].y;\r\n          END;\r\n          READMenu;\r\n          Launch(Missle);\r\n          READMenu;\r\n        END;\r\n    END Play;\r\n  (*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n    BEGIN\r\n(*      ShowTitle (sp^,FALSE);*)\r\n      ShowPic (wp);\r\n      IF OpenAudio() = 0 THEN\r\n        IF InitSound() = 0 THEN\r\n          SoundAvail := TRUE;\r\n          SoundOn := TRUE;\r\n        ELSE\r\n          SoundAvail := FALSE;\r\n          SoundOn := FALSE;\r\n          GravityWarsmenu.Text[18]:=\"Turn Sound OFF\";\r\n        END;\r\n      END;\r\n      Set := FALSE;\r\n      Set1 := FALSE;\r\n      Quit:=FALSE;\r\n      GameOn:=FALSE;\r\n      ptype := 1;\r\n      playernum := 0;\r\n      erase := FALSE;\r\n      clearqueue;\r\n\r\n      LOOP (***** Main GravityWars loop *****)\r\n        p:=Random(700);(*Randomize*)\r\n        READMenu;\r\n          IF GameOn THEN\r\n            Play;\r\n          END;\r\n          IF Quit THEN\r\n            EXIT;\r\n           END;\r\n      END; (* LOOP *)\r\n  END Game;\r\n(*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*)\r\n\r\n  BEGIN\r\n     (* Open assorted libraries *)\r\n     MaxPlan:= 9;\r\n     Pnum := 0;\r\n     IF  OpenLibraries () THEN\r\n        (* Intialize everything else *)\r\n        sp := InitScreen ();\r\n        wp := InitWindow (sp);\r\n        InitMenu (GravityWarsmenu);\r\n        (* Attach the menu to the window *)\r\n        SetMenuStrip (wp^, GravityWarsmenu.menu[0]);\r\n        (* Set up colors *)\r\n        SetColors (sp);\r\n        (* Lets Play*)\r\n        erase := OpenRConsole(Rport,wp);        \r\n        IF erase THEN\r\n          Game ();\r\n        END;\r\n        (* Close windows etc...*)\r\n        CloseRConsole(Rport);\r\n        CloseAudio;\r\n        CloseWindow (wp^);\r\n        CloseScreen (sp^);\r\n        CloseLibrary(MathTransBase^);\r\n      END\r\n END GravityWars.<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Here is the main module of Gravity Wars by Ed Bartz. This was probably originally written for TDI Modula-2. I suspect I don&#8217;t have the source code for FindImages module which might prove interesting. The blurb for Gravity Wars states: GravityWars&#8230;&#8230; The object of the game is for one player to hit the other with &#8230;<\/p>\n<p><a href=\"http:\/\/www.wickensonline.co.uk\/rc2012sc\/2014\/07\/22\/gravity-wars\/\" class=\"more-link\">Continue reading &lsquo;Gravity Wars&rsquo; &raquo;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[1],"tags":[],"class_list":["post-451","post","type-post","status-publish","format-standard","hentry","category-general"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p73JhD-7h","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/posts\/451"}],"collection":[{"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/comments?post=451"}],"version-history":[{"count":5,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/posts\/451\/revisions"}],"predecessor-version":[{"id":457,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/posts\/451\/revisions\/457"}],"wp:attachment":[{"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/media?parent=451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/categories?post=451"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wickensonline.co.uk\/rc2012sc\/wp-json\/wp\/v2\/tags?post=451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}