#include <Scratc.h>
int main (int arc, char **argv)
{
   whenGreenFlag ();
   startScene ("tg");
   wait_elapsed_from (0.01);
   startScene ("blank");
   whenIReceive ("Shutdown");
   startScene ("tg");
   clearPenTrails ();
   whenGreenFlag ();
   hide ();
   procDef ("draw tg intro %n", rot (), 1, true);
   if (StrEQ (readVariable ("stop intro flag"), "2")) {
      stopScripts ("this script");
   }
   setVar_to ("tg i", 0);
   if (StrGT (computeFunction_of ("cos", getParam ("rot", "r")), "0")) {
      setVar_to ("objects", StrDIV (lineCountOfList ("tailgunner logo"), 2));
   } else {
      setVar_to ("objects", "8");
   }
   {
   int _i;
      for (_i = 0; _i < readVariable ("objects"); _i++) {
	 changeVar_by ("tg i", 1);
	 setVar_to ("tg from",
		    getLine_ofList (readVariable ("tg i"),
				    "tailgunner logo"));
	 changeVar_by ("tg i", 1);
	 setVar_to ("tg to",
		    getLine_ofList (readVariable ("tg i"),
				    "tailgunner logo"));
	 call ("draw rotated line %n %n %n", readVariable ("tg from"),
	       readVariable ("tg to"), getParam ("rot", "r"));
      }
   }
   procDef ("draw rotated line %n %n %n", from ("to", "rot"), 1; 1; 1, true);
   if (not (StrEQ (getParam ("from", "r"), getParam ("to", "r")))) {
      call ("Unpack positive %n", getParam ("from", "r"));
      setVar_to ("tg x", readVariable ("Pack X"));
      setVar_to ("tg y", readVariable ("Pack Y"));
      setVar_to ("tg z", readVariable ("Pack Z"));
      call ("Unpack positive %n", getParam ("to", "r"));
      changeVar_by ("Pack Z",
		    StrMUL (readVariable ("Pack Y"),
			    computeFunction_of ("sin",
						getParam ("rot", "r"))));
      setVar_to ("Pack Y",
		 StrMUL (readVariable ("Pack Y"),
			 computeFunction_of ("cos", getParam ("rot", "r"))));
      setVar_to ("screen x",
		 StrDIV (StrMUL (512, readVariable ("Pack X")),
			 StrADD (512, readVariable ("Pack Z"))));
      setVar_to ("screen y",
		 StrDIV (StrMUL (512, readVariable ("Pack Y")),
			 StrADD (512, readVariable ("Pack Z"))));
      gotoX_y (StrADD (readVariable ("cur x"), readVariable ("screen x")),
	       StrADD (readVariable ("cur y"), readVariable ("screen y")));
      penColor (readVariable ("pen colour"));
      putPenDown ();
      changeVar_by ("tg z",
		    StrMUL (readVariable ("tg y"),
			    computeFunction_of ("sin",
						getParam ("rot", "r"))));
      setVar_to ("tg y",
		 StrMUL (readVariable ("tg y"),
			 computeFunction_of ("cos", getParam ("rot", "r"))));
      setVar_to ("screen x",
		 StrDIV (StrMUL (512, readVariable ("tg x")),
			 StrADD (512, readVariable ("tg z"))));
      setVar_to ("screen y",
		 StrDIV (StrMUL (512, readVariable ("tg y")),
			 StrADD (512, readVariable ("tg z"))));
      gotoX_y (StrADD (readVariable ("cur x"), readVariable ("screen x")),
	       StrADD (readVariable ("cur y"), readVariable ("screen y")));
      putPenUp ();
   }
   procDef ("Unpack positive %n", packed (), 1, true);
   setVar_to ("Pack X", %(getParam ("packed", "r"), 2048));
   setVar_to ("Pack Y",
	      %(computeFunction_of
		("floor", StrDIV (getParam ("packed", "r"), 2048)), 2048));
   setVar_to ("Pack Z",
	      %(computeFunction_of
		("floor",
		 StrDIV (getParam ("packed", "r"), StrMUL (2048, 2048))),
		2048));
   changeVar_by ("Pack X", -128);
   changeVar_by ("Pack Y", -128);
   changeVar_by ("Pack Z", readVariable ("cur z"));
   whenIReceive ("Kill banner");
   setVar_to ("stop intro flag", "2");
   whenIReceive ("Play Intro");
   call ("Play intro");
   procDef ("Play intro",,, true);
   setVar_to ("cur x", "0");
   setVar_to ("cur y", "0");
   setVar_to ("cur z", "206");
   setVar_to ("pen colour", StrMUL (220, 256));
   setVar_to ("rot", "90");
   setVar_to ("flashing", 0);
   setVar_to ("hide", 0);
   setVar_to ("stop intro flag", "0");
   whenIReceive ("Draw next frame");
   penColor (readVariable ("pen colour"));
   penSize (1);
   if (StrGT (readVariable ("flashing"), "0")) {
      changeVar_by ("flashing", -1);
      setVar_to ("pen colour",
		 StrMUL (computeFunction_of
			 ("floor",
			  StrADD (127,
				  StrMUL (64,
					  StrADD (computeFunction_of
						  ("sin",
						   StrMUL (readVariable
							   ("flashing"), 16)),
						  1)))), 256));
      if (StrEQ (readVariable ("flashing"), "0")) {
	 setVar_to ("rot", "90");
	 setVar_to ("cur z", "206");
	 setVar_to ("hide", "60");
      }
   }
   if (StrEQ (readVariable ("hide"), "0")) {
      call ("draw tg intro %n", readVariable ("rot"));
      if (StrEQ (readVariable ("flashing"), "0")) {
	 setVar_to ("rot", %(StrADD (readVariable ("rot"), -2), 360));
	 changeVar_by ("cur z", -1);
	 if (StrLT (readVariable ("cur z"), "-199")) {
	    if (StrEQ (readVariable ("stop intro flag"), "1")) {
	       clearPenTrails ();
	       stopScripts ("this script");
	    }
	    setVar_to ("pen colour", StrMUL (220, 256));
	    setVar_to ("flashing", "181");
	    setVar_to ("rot", 0);
	 }
      }
   } else {
      changeVar_by ("hide", -1);
      if (StrEQ (readVariable ("hide"), "0")) {
      null}
   }
   penColor (StrMUL (250, 256));
   setVar_to ("cur z", "-300");
   setVar_to ("stop intro flag", "0");
   call ("draw tg intro %n", 0);
   setVar_to ("stop intro flag", "2");
   broadcast ("Start new round");
   whenGreenFlag ();
   hide ();
   putPenUp ();
   setVar_to ("text x", "-220");
   setVar_to ("text y", "32");
   setVar_to ("ptr", "1");
   setVar_to ("flashing text timer", 0);
   whenIReceive ("Draw next frame");
   if (StrGT (readVariable ("#Mode"), getAttribute_of ("COINED", "CONSTS"))) {
      call ("Draw score");
      call ("Draw ships passed");
      call ("Draw shields left");
   } else {
      call ("Draw highscore");
      call ("Draw last game score");
      if (StrGT (readVariable ("#Credits"), "0")) {
	 broadcast ("Kill banner");
	 call ("Draw credits");
	 call ("Press start");
      } else {
      null}
   }
   setVar_to ("flashing text timer",
	      %(StrADD (readVariable ("flashing text timer"), 16), 360));
   procDef ("segment %n %n", coords ("text scale"), 1; 1, true);
   setVar_to ("to", %(getParam ("coords", "r"), 16));
   setVar_to ("to x",
	      StrMUL (%(readVariable ("to"), 5),
		      StrDIV (StrMUL (4, getParam ("text scale", "r")),
			      128)));
   setVar_to ("to y",
	      StrMUL (computeFunction_of
		      ("floor", StrDIV (readVariable ("to"), 5)),
		      StrDIV (StrMUL (12, getParam ("text scale", "r")),
			      128)));
   setVar_to ("from",
	      computeFunction_of ("floor",
				  StrDIV (getParam ("coords", "r"), 16)));
   setVar_to ("from x",
	      StrMUL (%(readVariable ("from"), 5),
		      StrDIV (StrMUL (4, getParam ("text scale", "r")),
			      128)));
   setVar_to ("from y",
	      StrMUL (computeFunction_of
		      ("floor", StrDIV (readVariable ("from"), 5)),
		      StrDIV (StrMUL (12, getParam ("text scale", "r")),
			      128)));
   call ("draw line 3d %n %n %n %n %n %n", readVariable ("from x"),
	 readVariable ("from y"), readVariable ("text z"),
	 readVariable ("to x"), readVariable ("to y"),
	 readVariable ("text z"));
   procDef ("draw line 3d %n %n %n %n %n %n",
	    from x ("from y", "from z", "to x", "to y", "to z"), 1; 1; 1; 1;
	    1; 1, true);
   gotoX_y (StrADD (readVariable ("from x"), readVariable ("text x")),
	    StrADD (readVariable ("from y"), readVariable ("text y")));
   putPenDown ();
   gotoX_y (StrADD (readVariable ("to x"), readVariable ("text x")),
	    StrADD (readVariable ("to y"), readVariable ("text y")));
   putPenUp ();
   procDef ("next char",,, true);
   call ("ch %n %n", readVariable ("ptr"), 128);
   changeVar_by ("ptr", 1);
   procDef ("Draw shields left",,, true);
   penColor (StrMUL (220, 256));
   call ("Draw num %n at %n %n", readVariable ("#Shields"), -10, 140);
   procDef ("Draw num %n at %n %n", num ("x", "y"), 1; 1; 1, true);
   setVar_to ("text x", getParam ("x", "r"));
   setVar_to ("text y", getParam ("y", "r"));
   setVar_to ("ptr", "1");
   {
   int _i;
      for (_i = 0; _i < stringLength (getParam ("num", "r")); _i++) {
	 call ("ch %n %n",
	       StrADD (letter_of
		       (readVariable ("ptr"), getParam ("num", "r")), 1),
	       128);
	 changeVar_by ("ptr", 1);
      }
   }
   procDef ("Insert Coin",,, true);
   setVar_to ("text x", "-135");
   setVar_to ("text y", "-120");
   setVar_to ("pen colour",
	      StrMUL (StrADD
		      (128,
		       computeFunction_of ("floor",
					   StrMUL (StrADD
						   (computeFunction_of
						    ("sin",
						     readVariable
						     ("flashing text timer")),
						    1), 64))), 256));
   penColor (readVariable ("pen colour"));
   call ("ch %n %n", 19, 128);
   call ("ch %n %n", 24, 128);
   call ("ch %n %n", 29, 128);
   call ("ch %n %n", 15, 128);
   call ("ch %n %n", 28, 128);
   call ("ch %n %n", 30, 128);
   call ("ch %n %n", 0, 128);
   call ("ch %n %n", 13, 128);
   call ("ch %n %n", 25, 128);
   call ("ch %n %n", 19, 128);
   call ("ch %n %n", 24, 128);
   procDef ("Draw score",,, false);
   penColor (StrMUL (220, 256));
   call ("Draw num %n at %n %n", readVariable ("#Score"), -220, 130);
   procDef ("Draw highscore",,, true);
   penColor (StrMUL (220, 256));
   setVar_to ("text x", "42");
   setVar_to ("text y", "130");
   call ("ch %n %n", 18, 96);
   call ("ch %n %n", 19, 96);
   call ("ch %n %n", 17, 96);
   call ("ch %n %n", 18, 96);
   call ("ch %n %n", 0, 96);
   call ("ch %n %n", 29, 96);
   call ("ch %n %n", 13, 96);
   call ("ch %n %n", 25, 96);
   call ("ch %n %n", 28, 96);
   call ("ch %n %n", 15, 96);
   if (StrGT (readVariable ("☁ Highscore"), readVariable ("#HighScore"))) {
      setVar_to ("#HighScore", readVariable ("☁ Highscore"));
   }
   if (StrGT (readVariable ("#HighScore"), readVariable ("☁ Highscore"))) {
      setVar_to ("☁ Highscore", readVariable ("#HighScore"));
   }
   call ("Draw small num %n at %n %n", readVariable ("#HighScore"),
	 StrSUB (208,
		 StrMUL (24,
			 StrSUB (stringLength (readVariable ("#HighScore")),
				 1))), 105);
   procDef ("Draw ships passed",,, true);
   penColor (StrMUL (220, 256));
   call ("Draw num %n at %n %n", readVariable ("#ShipsPassed"), 200, 130);
   call ("Insert Coin");
   procDef ("Draw small num %n at %n %n", num ("x", "y"), 1; 1; 1, true);
   setVar_to ("text x", getParam ("x", "r"));
   setVar_to ("text y", getParam ("y", "r"));
   setVar_to ("ptr", "1");
   {
   int _i;
      for (_i = 0; _i < stringLength (getParam ("num", "r")); _i++) {
	 call ("ch %n %n",
	       StrADD (letter_of
		       (readVariable ("ptr"), getParam ("num", "r")), 1), 96);
	 changeVar_by ("ptr", 1);
      }
   }
   procDef ("Press start",,, true);
   setVar_to ("text x", "-120");
   setVar_to ("text y", "-10");
   setVar_to ("pen colour",
	      StrMUL (StrADD
		      (128,
		       computeFunction_of ("floor",
					   StrMUL (StrADD
						   (computeFunction_of
						    ("sin",
						     readVariable
						     ("flashing text timer")),
						    1), 64))), 256));
   penColor (readVariable ("pen colour"));
   call ("ch %n %n", 26, 128);
   call ("ch %n %n", 28, 128);
   call ("ch %n %n", 15, 128);
   call ("ch %n %n", 29, 128);
   call ("ch %n %n", 29, 128);
   call ("ch %n %n", 0, 128);
   call ("ch %n %n", 29, 128);
   call ("ch %n %n", 30, 128);
   call ("ch %n %n", 11, 128);
   call ("ch %n %n", 28, 128);
   call ("ch %n %n", 30, 128);
   procDef ("Draw credits",,, true);
   penColor (StrMUL (220, 256));
   setVar_to ("text x", "-100");
   setVar_to ("text y", "-120");
   call ("ch %n %n", 13, 128);
   call ("ch %n %n", 28, 128);
   call ("ch %n %n", 15, 128);
   call ("ch %n %n", 14, 128);
   call ("ch %n %n", 19, 128);
   call ("ch %n %n", 30, 128);
   call ("ch %n %n", 29, 128);
   call ("ch %n %n", 0, 128);
   if (StrGT (readVariable ("#Credits"), "9")) {
      call ("ch %n %n", 10, 128);
   } else {
      call ("ch %n %n", StrADD (readVariable ("#Credits"), 1), 128);
   }
   procDef ("Draw last game score",,, true);
   penColor (StrMUL (220, 256));
   setVar_to ("text x", "-220");
   setVar_to ("text y", "130");
   call ("ch %n %n", 29, 96);
   call ("ch %n %n", 13, 96);
   call ("ch %n %n", 25, 96);
   call ("ch %n %n", 28, 96);
   call ("ch %n %n", 15, 96);
   call ("Draw small num %n at %n %n", readVariable ("#LastScore"), -220,
	 105);
   procDef ("alphabet test",,, true);
   setVar_to ("text x", "-220");
   setVar_to ("text y", "30");
   setVar_to ("ptr", "1");
   penColor (StrMUL (220, 256));
   {
   int _i;
      for (_i = 0; _i < 10; _i++) {
	 call ("next char");
      }
   }
   {
   int _i;
      for (_i = 0; _i < 8; _i++) {
	 call ("next char");
      }
   }
   changeVar_by ("text y", -32);
   setVar_to ("text x", "-220");
   {
   int _i;
      for (_i = 0; _i < 18; _i++) {
	 call ("next char");
      }
   }
   procDef ("ch %n %n", charno ("text scale"), 1; 1, true);
   if (StrGT (getParam ("charno", "r"), "0")) {
      setVar_to ("i", getLine_ofList (getParam ("charno", "r"), "encoded"));
      setVar_to ("char", %(readVariable ("i"), 256));
      setVar_to ("i",
		 computeFunction_of ("floor",
				     StrDIV (readVariable ("i"), 256)));
      setVar_to ("segments", %(readVariable ("i"), 7));
      setVar_to ("i",
		 computeFunction_of ("floor",
				     StrDIV (readVariable ("i"), 7)));
      {
   int _i;
	 for (_i = 0; _i < readVariable ("segments"); _i++) {
	    call ("segment %n %n", %(readVariable ("i"), 256),
		  getParam ("text scale", "r"));
	    setVar_to ("i",
		       computeFunction_of ("floor",
					   StrDIV (readVariable ("i"), 256)));
	 }
      }
   }
   changeVar_by ("text x",
		 StrMUL (24, StrDIV (getParam ("text scale", "r"), 128)));
   whenGreenFlag ();
   hide ();
   setVar_to ("star movement", "0.025");
   setVar_to ("my clone id", "0");
   {
   int _i;
      for (_i = 0; _i < 64; _i++) {
	 if (StrEQ (readVariable ("my clone id"), "0")) {
	    createCloneOf ("_myself_");
	    wait_elapsed_from (0.07);
	 }
      }
   }
   whenCloned ();
   changeVar_by ("my clone id", 1);
   call ("Reinit");
   whenIReceive ("Draw next frame");
   if (StrGT (readVariable ("my clone id"), "0")) {
      if (StrLT (distanceTo ("StarfieldCenter"), "20")) {
	 call ("Reinit");
      } else {
	 changeGraphicEffect_by ("ghost", 1);
	 if (StrGT (scale (), "10")) {
	    changeSizeBy (-10);
	 }
	 forward (StrMUL
		  (readVariable ("star movement"),
		   distanceTo ("StarfieldCenter")));
      }
   }
   whenIReceive ("Passing");
   if (StrEQ (readVariable ("my clone id"), "0")) {
      setVar_to ("star movement", "0.05");
      {
   int _i;
	 for (_i = 0; _i < 6; _i++) {
	    playSound ("star");
	    wait_elapsed_from (1);
	 }
      }
      setVar_to ("star movement", "0.025");
   }
   procDef ("Point to %n %n", x ("y"), 1; 1, false);
   heading (StrADD
	    (computeFunction_of
	     ("atan",
	      StrDIV (StrSUB (getParam ("x", "r"), xpos ()),
		      StrSUB (getParam ("y", "r"), ypos ()))), StrMUL (180,
								       StrLT
								       (getParam
									("y",
									 "r"),
									ypos
									()))));
   procDef ("Choose random edge to start on",,, false);
   setVar_to ("edge", randomFrom_to (1, 4));
   if (StrEQ (readVariable ("edge"), "1")) {
      gotoX_y (-239, randomFrom_to (-179, 180));
   } else {
      if (StrEQ (readVariable ("edge"), "2")) {
	 gotoX_y (239, randomFrom_to (-179, 180));
      } else {
	 if (StrEQ (readVariable ("edge"), "3")) {
	    gotoX_y (randomFrom_to (-239, 239), 179);
	 } else {
	    gotoX_y (randomFrom_to (-239, 239), -179);
	 }
	 ;
      }
   }
   procDef ("Reinit",,, true);
   hide ();
   call ("Choose random edge to start on");
   pointTowards ("StarfieldCenter");
   setGraphicEffect_to ("ghost", 25);
   setSizeTo (250);
   comeToFront ();
   show ();
   whenGreenFlag ();
   hide ();
   setVar_to ("shield segment", "0");
   setVar_to ("shield subticks left", "0");
   whenIReceive ("Draw next frame");
   if (StrAND
       (StrEQ (readVariable ("#Mode"), getAttribute_of ("PLAYING", "CONSTS")),
	StrEQ (readVariable ("?UsingShields"), "1"))) {
      call ("Shield");
   } else {
      setVar_to ("shield subticks left", 0);
   }
   procDef ("Shield",,, true);
   if (StrEQ (readVariable ("shield subticks left"), "0")) {
      playSound ("shield");
      setVar_to ("shield subticks left",
		 computeFunction_of ("ceiling", StrDIV (0.1, 0.03333)));
      changeVar_by ("#Shields", -1);
   } else {
      changeVar_by ("shield subticks left", -1);
   }
   if (StrGT (randomFrom_to (0, 3), "0")) {
      penColor (StrMUL (randomFrom_to (160, 255), 256));
      setVar_to ("shield segment", "1");
      while (!(StrGT (readVariable ("shield segment"), "25"))) {
	 gotoX_y (StrSUB
		  (StrMUL
		   (getLine_ofList
		    (readVariable ("shield segment"), "shieldvec"), 32), 256),
		  StrSUB (StrMUL
			  (getLine_ofList
			   (StrADD (readVariable ("shield segment"), 1),
			    "shieldvec"), 32), 192));
	 putPenDown ();
	 changeVar_by ("shield segment", 2);
      }
      putPenUp ();
   }
   whenGreenFlag ();
   deleteLine_ofList ("all", "debug");
   setVar_to ("drawing semaphore", 0);
   putPenUp ();
   hide ();
   setVar_to ("next wave ship type", "1");
   deleteLine_ofList ("all", "ships");
   deleteLine_ofList ("all", "projectiles");
   whenIReceive ("New game");
   deleteLine_ofList ("all", "ships");
   deleteLine_ofList ("all", "projectiles");
   procDef ("ship hit check %n %n", x ("y"), 1; 1, false);
   setVar_to ("e", 0);
   {
   int _i;
      for (_i = 0;
	   _i < StrDIV (lineCountOfList ("ships"),
			readVariable ("*SHIP_MULT")); _i++) {
	 call ("Get ship pos %n", readVariable ("e"));
	 call ("Get ship scale %n", readVariable ("e"));
	 call ("Get screen pos %n %n %n", readVariable ("X"),
	       readVariable ("Y"), readVariable ("Z"));
	 if (StrLT
	     (computeFunction_of
	      ("sqrt",
	       StrADD (StrMUL
		       (StrSUB (getParam ("x", "r"), readVariable ("X")),
			StrSUB (getParam ("x", "r"), readVariable ("X"))),
		       StrMUL (StrSUB
			       (getParam ("y", "r"), readVariable ("Y")),
			       StrSUB (getParam ("y", "r"),
				       readVariable ("Y"))))),
	      StrMUL (StrMUL (15, readVariable ("scale")),
		      StrDIV (readVariable ("focalLength"),
			      readVariable ("Z"))))) {
	    changeVar_by ("#Score", 5);
	    playSound ("explode");
	    call ("Delete ship %n", readVariable ("e"));
	 } else {
	    changeVar_by ("e", 1);
	 }
	 ;
      }
   }
   procDef ("Draw ship %n at %n %n %n rotated %n %n %n scale %n",
	    ship type ("x", "y", "z", "xrot", "yrot", "zrot", "scale"), 1; 1;
	    1; 1; 1; 1; 1; 1, true);
   penColor (StrMUL (170, 256));
   penSize (1);
   call ("Set rotation vars %n %n %n", getParam ("xrot", "r"),
	 getParam ("yrot", "r"), getParam ("zrot", "r"));
   setVar_to ("e",
	      getLine_ofList (getParam ("ship type", "r"),
			      "ShipMeshPointers"));
   {
   int _i;
      for (_i = 0;
	   _i <
	   StrSUB (getLine_ofList
		   (StrADD (getParam ("ship type", "r"), 1),
		    "ShipMeshPointers"), readVariable ("e")); _i++) {
	 call ("Transform point %n %n %n",
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 1),
			"ShipMeshes"), getParam ("scale", "r")),
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 2),
			"ShipMeshes"), getParam ("scale", "r")),
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 3),
			"ShipMeshes"), getParam ("scale", "r")));
	 call ("Get screen pos %n %n %n",
	       StrADD (getParam ("x", "r"), readVariable ("X")),
	       StrADD (getParam ("y", "r"), readVariable ("Y")),
	       StrADD (getParam ("z", "r"), readVariable ("Z")));
	 gotoX_y (readVariable ("X"), readVariable ("Y"));
	 putPenDown ();
	 call ("Transform point %n %n %n",
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 4),
			"ShipMeshes"), getParam ("scale", "r")),
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 5),
			"ShipMeshes"), getParam ("scale", "r")),
	       StrMUL (getLine_ofList
		       (StrADD (StrMUL (readVariable ("e"), 6), 6),
			"ShipMeshes"), getParam ("scale", "r")));
	 call ("Get screen pos %n %n %n",
	       StrADD (getParam ("x", "r"), readVariable ("X")),
	       StrADD (getParam ("y", "r"), readVariable ("Y")),
	       StrADD (getParam ("z", "r"), readVariable ("Z")));
	 gotoX_y (readVariable ("X"), readVariable ("Y"));
	 putPenUp ();
	 changeVar_by ("e", 1);
      }
   }
   procDef ("Update ship %n", id (), 1, false);
   call ("Get ship pos %n", getParam ("id", "r"));
   call ("Apply vel to ship pos %n", getParam ("id", "r"));
   call ("Change ship %n velocity by %n", getParam ("id", "r"),
	 readVariable ("*SHIP_ACCEL"));
   if (StrAND
       (StrLT (readVariable ("Z Pos"), "100"),
	StrEQ (readVariable ("?UsingShields"), "1"))) {
      playSound ("bounce");
      call ("Set ship %n destination to %n %n %n", getParam ("id", "r"),
	    randomFrom_to (-100, 100), randomFrom_to (-100, 100),
	    StrADD (readVariable ("*SHIP_SPAWN_Z"), 1000));
      call ("Get ship vel %n", getParam ("id", "r"));
      call ("Set ship %n velocity to %n", getParam ("id", "r"),
	    StrMUL (-1, readVariable ("vel")));
      call ("Apply vel to ship pos %n", getParam ("id", "r"));
      call ("Head ship towards destination %n", getParam ("id", "r"));
      call ("Change ship %n time by %n", getParam ("id", "r"), 1);
      call ("Get ship pos %n", getParam ("id", "r"));
   }
   if (StrGT
       (readVariable ("Z Pos"),
	StrADD (readVariable ("*SHIP_SPAWN_Z"), 500))) {
      call ("Delete ship %n", getParam ("id", "r"));
   }
   if (StrLT (readVariable ("Z Pos"), "30")) {
      call ("Delete ship %n", getParam ("id", "r"));
      changeVar_by ("#ShipsPassed", 1);
   } else {
      call ("Get ship destination %n", getParam ("id", "r"));
      if (not
	  (StrAND
	   (StrAND
	    (StrEQ (readVariable ("X"), "0"),
	     StrEQ (readVariable ("Y"), "0")), StrGT (readVariable ("Z"),
						      readVariable
						      ("*SHIP_SPAWN_Z"))))) {
	 call ("Get ship time %n", getParam ("id", "r"));
	 if (StrEQ (%(readVariable ("ship t"), 40), "39")) {
	    call ("Get ship pos %n", getParam ("id", "r"));
	    if (StrLT (readVariable ("Z Pos"), "1000")) {
	       call ("Set ship %n destination to %n %n %n",
		     getParam ("id", "r"), 0, 0, 0);
	    } else {
	       call ("Set ship %n destination to %n %n %n",
		     getParam ("id", "r"),
		     randomFrom_to (StrDIV
				    (StrMUL (-300, readVariable ("Z Pos")),
				     2000), StrDIV (StrMUL (300,
							    readVariable
							    ("Z Pos")),
						    2000)),
		     randomFrom_to (StrDIV
				    (StrMUL (-200, readVariable ("Z Pos")),
				     2000), StrDIV (StrMUL (200,
							    readVariable
							    ("Z Pos")),
						    2000)), -200);
	    }
	    ;
	 }
      }
      call ("Head ship towards destination %n", getParam ("id", "r"));
      call ("Change ship %n time by %n", getParam ("id", "r"), 1);
   }
   procDef ("Change ship %n time by %n", id ("dt"), 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       10), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 10), "ships"),
			      getParam ("dt", "r")));
   procDef ("Get ship pos %n", id (), 1, false);
   setVar_to ("X",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 2), "ships"));
   setVar_to ("Y",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 3), "ships"));
   setVar_to ("Z",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 4), "ships"));
   setVar_to ("X Pos",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 2), "ships"));
   setVar_to ("Y Pos",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 3), "ships"));
   setVar_to ("Z Pos",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 4), "ships"));
   procDef ("Transform point %n %n %n", x ("y", "z"), 1; 1; 1, false);
   setVar_to ("XY",
	      StrSUB (StrMUL (readVariable ("cosX"), getParam ("y", "r")),
		      StrMUL (readVariable ("sinX"), getParam ("z", "r"))));
   setVar_to ("XZ",
	      StrADD (StrMUL (readVariable ("sinX"), getParam ("y", "r")),
		      StrMUL (readVariable ("cosX"), getParam ("z", "r"))));
   setVar_to ("Z",
	      StrSUB (StrMUL (readVariable ("cosY"), readVariable ("XZ")),
		      StrMUL (readVariable ("sinY"), getParam ("x", "r"))));
   setVar_to ("YX",
	      StrADD (StrMUL (readVariable ("sinY"), readVariable ("XZ")),
		      StrMUL (readVariable ("cosY"), getParam ("x", "r"))));
   setVar_to ("X",
	      StrSUB (StrMUL (readVariable ("cosZ"), readVariable ("YX")),
		      StrMUL (readVariable ("sinZ"), readVariable ("XY"))));
   setVar_to ("Y",
	      StrADD (StrMUL (readVariable ("sinZ"), readVariable ("YX")),
		      StrMUL (readVariable ("cosZ"), readVariable ("XY"))));
   procDef ("Change ship %n pos by %n %n %n", id ("dx", "dy", "dz"), 1; 1; 1;
	    1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       2), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 2), "ships"),
			      getParam ("dx", "r")));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       3), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 3), "ships"),
			      getParam ("dy", "r")));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       4), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 4), "ships"),
			      getParam ("dz", "r")));
   procDef ("Change ship %n rotation by %n %n %n",
	    id ("xrot", "yrot", "zrot"), 1; 1; 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       5), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 5), "ships"),
			      getParam ("xrot", "r")));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       6), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 6), "ships"),
			      getParam ("yrot", "r")));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       7), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 7), "ships"),
			      getParam ("zrot", "r")));
   procDef ("Get ship rotation %n", id (), 1, false);
   setVar_to ("x rot",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 5), "ships"));
   setVar_to ("y rot",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 6), "ships"));
   setVar_to ("z rot",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 7), "ships"));
   procDef ("Get length of %n %n %n", x ("y", "z"), 1; 1; 1, false);
   setVar_to ("distance",
	      computeFunction_of ("sqrt",
				  StrADD (StrMUL
					  (getParam ("x", "r"),
					   getParam ("x", "r")),
					  StrADD (StrMUL
						  (getParam ("y", "r"),
						   getParam ("y", "r")),
						  StrMUL (getParam ("z", "r"),
							  getParam ("z",
								    "r"))))));
   procDef ("Get ship time %n", id (), 1, false);
   setVar_to ("ship t",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 10), "ships"));
   procDef ("Point to %n %n", x ("y"), 1; 1, false);
   heading (StrADD
	    (computeFunction_of
	     ("atan",
	      StrDIV (StrSUB (getParam ("x", "r"), xpos ()),
		      StrSUB (getParam ("y", "r"), ypos ()))), StrMUL (180,
								       StrLT
								       (getParam
									("y",
									 "r"),
									ypos
									()))));
   procDef ("Get ship scale %n", id (), 1, false);
   setVar_to ("scale",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 8), "ships"));
   procDef ("Get ship destination %n", id (), 1, false);
   setVar_to ("X",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 11), "ships"));
   setVar_to ("Y",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 12), "ships"));
   setVar_to ("Z",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 13), "ships"));
   setVar_to ("X Dest",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 11), "ships"));
   setVar_to ("Y Dest",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 12), "ships"));
   setVar_to ("Z Dest",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 13), "ships"));
   procDef ("Change ship %n velocity by %n", id ("accel"), 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       9), "ships",
		      StrADD (getLine_ofList
			      (StrADD
			       (StrMUL
				(readVariable ("*SHIP_MULT"),
				 getParam ("id", "r")), 9), "ships"),
			      getParam ("accel", "r")));
   if (StrGT
       (getLine_ofList
	(StrADD
	 (StrMUL (readVariable ("*SHIP_MULT"), getParam ("id", "r")), 9),
	 "ships"), readVariable ("*SHIP_MAXVEL"))) {
      setLine_ofList_to (StrADD
			 (StrMUL
			  (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
			  9), "ships", readVariable ("*SHIP_MAXVEL"));
   }
   procDef ("Create attack wave",,, false);
   setVar_to ("model", readVariable ("next wave ship type"));
   setVar_to ("x rot", "270");
   setVar_to ("y rot", "180");
   setVar_to ("Z", readVariable ("*SHIP_SPAWN_Z"));
   setVar_to ("scale", "2.0");
   {
   int _i;
      for (_i = 0; _i < getAttribute_of ("SHIPS PER WAVE", "CONSTS"); _i++) {
	 setVar_to ("random edge", randomFrom_to (1, 3));
	 if (StrEQ (readVariable ("random edge"), "1")) {
	    setVar_to ("X", "-900");
	    setVar_to ("Y", randomFrom_to (-500, 500));
	    setVar_to ("z rot", "90");
	    call ("New ship: type %n pos %n %n %n rot %n %n %n scale %n",
		  readVariable ("model"), readVariable ("X"),
		  readVariable ("Y"), readVariable ("Z"),
		  readVariable ("x rot"), readVariable ("y rot"),
		  readVariable ("z rot"), readVariable ("scale"));
	 } else {
	    if (StrEQ (readVariable ("random edge"), "2")) {
	       setVar_to ("X", randomFrom_to (-500, 500));
	       setVar_to ("Y", "700");
	       setVar_to ("z rot", "0");
	       call ("New ship: type %n pos %n %n %n rot %n %n %n scale %n",
		     readVariable ("model"), readVariable ("X"),
		     readVariable ("Y"), readVariable ("Z"),
		     readVariable ("x rot"), readVariable ("y rot"),
		     readVariable ("z rot"), readVariable ("scale"));
	    } else {
	       setVar_to ("X", "900");
	       setVar_to ("Y", randomFrom_to (-500, 500));
	       setVar_to ("z rot", "-90");
	       call ("New ship: type %n pos %n %n %n rot %n %n %n scale %n",
		     readVariable ("model"), readVariable ("X"),
		     readVariable ("Y"), readVariable ("Z"),
		     readVariable ("x rot"), readVariable ("y rot"),
		     readVariable ("z rot"), readVariable ("scale"));
	    }
	    ;
	 }
	 ;
      }
   }
   whenIReceive ("Draw next frame");
   call ("Draw frame");
   procDef ("Set ship %n pos to %n %n %n", id ("x", "y", "z"), 1;
	    1; 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       2), "ships", getParam ("x", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       3), "ships", getParam ("y", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       4), "ships", getParam ("z", "r"));
   procDef ("Get eigenvector to %n %n %n", x ("y", "z"), 1; 1; 1, false);
   setVar_to ("dirXZ",
	      StrADD (computeFunction_of
		      ("atan",
		       StrDIV (getParam ("x", "r"), getParam ("z", "r"))),
		      StrMUL (180, StrLT (getParam ("z", "r"), "0"))));
   setVar_to ("dirY",
	      computeFunction_of ("asin",
				  StrDIV (getParam ("y", "r"),
					  computeFunction_of ("sqrt",
							      StrADD (StrMUL
								      (getParam
								       ("x",
									"r"),
								       getParam
								       ("x",
									"r")),
								      StrADD
								      (StrMUL
								       (getParam
									("y",
									 "r"),
									getParam
									("y",
									 "r")),
								       StrMUL
								       (getParam
									("z",
									 "r"),
									getParam
									("z",
									 "r"))))))));
   procDef ("Apply vel to ship pos %n", id (), 1, false);
   call ("Get ship vel %n", getParam ("id", "r"));
   call ("Get ship rotation %n", getParam ("id", "r"));
   call ("Change ship %n pos by %n %n %n", getParam ("id", "r"),
	 StrMUL (readVariable ("vel"),
		 StrMUL (computeFunction_of ("sin", readVariable ("y rot")),
			 computeFunction_of ("cos", readVariable ("x rot")))),
	 StrMUL (readVariable ("vel"),
		 computeFunction_of ("sin", readVariable ("x rot"))),
	 StrMUL (readVariable ("vel"),
		 StrMUL (computeFunction_of ("cos", readVariable ("y rot")),
			 computeFunction_of ("cos",
					     readVariable ("x rot")))));
   procDef ("Set rotation vars %n %n %n", xrot ("yrot", "zrot"), 1; 1;
	    1, false);
   setVar_to ("sinX", computeFunction_of ("sin", getParam ("xrot", "r")));
   setVar_to ("cosX", computeFunction_of ("cos", getParam ("xrot", "r")));
   setVar_to ("sinY", computeFunction_of ("sin", getParam ("yrot", "r")));
   setVar_to ("cosY", computeFunction_of ("cos", getParam ("yrot", "r")));
   setVar_to ("sinZ", computeFunction_of ("sin", getParam ("zrot", "r")));
   setVar_to ("cosZ", computeFunction_of ("cos", getParam ("zrot", "r")));
   procDef ("Set ship %n rotation to %n %n %n", id ("xrot", "yrot", "zrot"),
	    1; 1; 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       5), "ships", getParam ("xrot", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       6), "ships", getParam ("yrot", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       7), "ships", getParam ("zrot", "r"));
   procDef ("Get ship vel %n", id (), 1, false);
   setVar_to ("vel",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 9), "ships"));
   procDef ("Head ship towards destination %n", id (), 1, false);
   call ("Get ship pos %n", getParam ("id", "r"));
   setVar_to ("old X", readVariable ("X"));
   setVar_to ("old Y", readVariable ("Y"));
   setVar_to ("old Z", readVariable ("Z"));
   call ("Get ship destination %n", getParam ("id", "r"));
   call ("Get length of %n %n %n",
	 StrSUB (readVariable ("X"), readVariable ("old X")),
	 StrSUB (readVariable ("Y"), readVariable ("old Y")),
	 StrSUB (readVariable ("Z"), readVariable ("old Z")));
   call ("Rotate ship %n toward %n %n %n by %n \\%", getParam ("id", "r"),
	 readVariable ("X"), readVariable ("Y"), readVariable ("Z"), 10);
   setVar_to ("Z", StrSUB (readVariable ("*SHIP_SPAWN_Z"), 1));
   procDef ("Draw frame",,, true);
   if (StrEQ (readVariable ("drawing semaphore"), "0")) {
      changeVar_by ("drawing semaphore", 1);
      if (StrGT
	  (readVariable ("#Mode"), getAttribute_of ("COINED", "CONSTS"))) {
	 call ("Update ships");
	 if (StrLT (readVariable ("#ShipsPassed"), "10")) {
	    if (StrEQ (lineCountOfList ("ships"), "0")) {
	       call ("Start attack wave");
	    }
	 } else {
	    if (StrGT (readVariable ("#Credits"), "0")) {
	       setVar_to ("#Mode", getAttribute_of ("COINED", "CONSTS"));
	    } else {
	       setVar_to ("#Mode", getAttribute_of ("PREGAME", "CONSTS"));
	       setVar_to ("#LastScore", readVariable ("#Score"));
	    }
	    ;
	 }
	 ;
	 if (StrGT (readVariable ("#Score"), readVariable ("#HighScore"))) {
	    setVar_to ("#HighScore", readVariable ("#Score"));
	 }
	 call ("Render ships");
	 call ("Render lasers");
      } else {
	 call ("Update ships");
	 call ("Render ships");
      }
      changeVar_by ("drawing semaphore", -1);
   }
   procDef ("Render lasers",,, true);
   setVar_to ("laser id", 0);
   {
   int _i;
      for (_i = 0; _i < StrDIV (lineCountOfList ("projectiles"), 3); _i++) {
	 setVar_to ("laser t",
		    getLine_ofList (StrADD
				    (StrMUL (3, readVariable ("laser id")),
				     1), "projectiles"));
	 setVar_to ("targetting x", mouseX ());
	 setVar_to ("targetting y", mouseY ());
	 if (StrLT (readVariable ("laser t"), "0.98")) {
	    setSizeTo (StrMUL (100, StrSUB (1, readVariable ("laser t"))));
	    gotoX_y (-240, -180);
	    call ("Point to %n %n", readVariable ("targetting x"),
		  readVariable ("targetting y"));
	    forward (StrMUL
		     (readVariable ("laser t"),
		      computeFunction_of ("sqrt",
					  StrADD (StrMUL
						  (StrSUB
						   (readVariable
						    ("targetting x"),
						    xpos ()),
						   StrSUB (readVariable
							   ("targetting x"),
							   xpos ())),
						  StrMUL (StrSUB
							  (readVariable
							   ("targetting y"),
							   ypos ()),
							  StrSUB (readVariable
								  ("targetting y"),
								  ypos
								  ()))))));
	    stampCostume ();
	    gotoX_y (240, -180);
	    call ("Point to %n %n", readVariable ("targetting x"),
		  readVariable ("targetting y"));
	    forward (StrMUL
		     (readVariable ("laser t"),
		      computeFunction_of ("sqrt",
					  StrADD (StrMUL
						  (StrSUB
						   (readVariable
						    ("targetting x"),
						    xpos ()),
						   StrSUB (readVariable
							   ("targetting x"),
							   xpos ())),
						  StrMUL (StrSUB
							  (readVariable
							   ("targetting y"),
							   ypos ()),
							  StrSUB (readVariable
								  ("targetting y"),
								  ypos
								  ()))))));
	    stampCostume ();
	    setLine_ofList_to (StrADD
			       (StrMUL (3, readVariable ("laser id")), 1),
			       "projectiles",
			       StrADD (readVariable ("laser t"),
				       StrMUL (0.25,
					       StrSUB (1,
						       readVariable
						       ("laser t")))));
	    changeVar_by ("laser id", 1);
	 } else {
	    call ("ship hit check %n %n", readVariable ("targetting x"),
		  readVariable ("targetting y"));
	    {
   int _i;
	       for (_i = 0; _i < 3; _i++) {
		  deleteLine_ofList (StrADD
				     (StrMUL (3, readVariable ("laser id")),
				      1), "projectiles");
	       }
	    }
	    ;
	 }
	 ;
      }
   }
   whenIReceive ("Start new round");
   setVar_to ("#Shields", "80");
   setVar_to ("#ShipsPassed", 0);
   deleteLine_ofList ("all", "ships");
   deleteLine_ofList ("all", "projectiles");
   call ("Start attack wave");
   procDef ("Start attack wave",,, true);
   call ("Create attack wave");
   setVar_to ("next wave ship type",
	      StrADD (%(readVariable ("next wave ship type"), 4), 1));
   procDef ("Render ships",,, true);
   setVar_to ("laser id", "0");
   {
   int _i;
      for (_i = 0;
	   _i < StrDIV (lineCountOfList ("ships"),
			readVariable ("*SHIP_MULT")); _i++) {
	 call ("Get ship type %n", readVariable ("laser id"));
	 call ("Get ship pos %n", readVariable ("laser id"));
	 call ("Get ship rotation %n", readVariable ("laser id"));
	 call ("Get ship scale %n", readVariable ("laser id"));
	 call ("Draw ship %n at %n %n %n rotated %n %n %n scale %n",
	       readVariable ("model"), readVariable ("X"), readVariable ("Y"),
	       readVariable ("Z"), StrSUB (0, readVariable ("x rot")),
	       readVariable ("y rot"), readVariable ("z rot"),
	       readVariable ("scale"));
	 changeVar_by ("laser id", 1);
      }
   }
   procDef ("Get screen pos %n %n %n", x ("y", "z"), 1; 1; 1, false);
   setVar_to ("X",
	      StrMUL (readVariable ("focalLength"),
		      StrDIV (getParam ("x", "r"), getParam ("z", "r"))));
   setVar_to ("Y",
	      StrMUL (readVariable ("focalLength"),
		      StrDIV (getParam ("y", "r"), getParam ("z", "r"))));
   procDef ("New ship: type %n pos %n %n %n rot %n %n %n scale %n",
	    type ("x", "y", "z", "xrot", "yrot", "zrot", "scale"), 1; 1; 1; 1;
	    1; 1; 1; 1, false);
   append_toList (getParam ("type", "r"), "ships");
   append_toList (getParam ("x", "r"), "ships");
   append_toList (getParam ("y", "r"), "ships");
   append_toList (getParam ("z", "r"), "ships");
   append_toList (getParam ("xrot", "r"), "ships");
   append_toList (getParam ("yrot", "r"), "ships");
   append_toList (getParam ("zrot", "r"), "ships");
   append_toList (getParam ("scale", "r"), "ships");
   append_toList (StrDIV
		  (StrMUL
		   (readVariable ("*SHIP_MAXVEL"), randomFrom_to (80, 120)),
		   100), "ships");
   append_toList ("0", "ships");
   append_toList (randomFrom_to (-400, 400), "ships");
   append_toList (randomFrom_to (-300, 300), "ships");
   append_toList (getParam ("z", "r"), "ships");
   procDef ("Set ship %n velocity to %n", id ("vel"), 1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       9), "ships", getParam ("vel", "r"));
   if (StrEQ (lineCountOfList ("ships"), "0")) {
      call ("Start attack wave");
   }
   setVar_to ("#ShipsPassed", 0);
   call ("Set ship %n velocity to %n", getParam ("id", "r"),
	 StrMUL (0.5, readVariable ("vel")));
   whenIReceive ("Init arcade");
   setVar_to ("*SHIP_MULT", "13");
   setVar_to ("*SHIP_ACCEL", "0.1");
   setVar_to ("*SHIP_MAXVEL", "20");
   setVar_to ("*SHIP_SPAWN_Z", "2000");
   setVar_to ("focalLength", "512");
   procDef ("Delete ship %n", id (), 1, false);
   {
   int _i;
      for (_i = 0; _i < readVariable ("*SHIP_MULT"); _i++) {
	 deleteLine_ofList (StrADD
			    (StrMUL
			     (readVariable ("*SHIP_MULT"),
			      getParam ("id", "r")), 1), "ships");
      }
   }
   setVar_to ("deleted ship id", getParam ("id", "r"));
   procDef ("Get ship type %n", id (), 1, false);
   setVar_to ("model",
	      getLine_ofList (StrADD
			      (StrMUL
			       (readVariable ("*SHIP_MULT"),
				getParam ("id", "r")), 1), "ships"));
   procDef ("Set ship %n destination to %n %n %n", id ("x", "y", "z"), 1; 1;
	    1; 1, false);
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       11), "ships", getParam ("x", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       12), "ships", getParam ("y", "r"));
   setLine_ofList_to (StrADD
		      (StrMUL
		       (readVariable ("*SHIP_MULT"), getParam ("id", "r")),
		       13), "ships", getParam ("z", "r"));
   procDef ("Update ships",,, true);
   setVar_to ("ship id", "0");
   setVar_to ("deleted ship id", "-1");
   while (!
	  (not
	   (StrLT
	    (readVariable ("ship id"),
	     StrDIV (lineCountOfList ("ships"),
		     readVariable ("*SHIP_MULT")))))) {
      call ("Update ship %n", readVariable ("ship id"));
      if (not
	  (StrEQ
	   (readVariable ("deleted ship id"), readVariable ("ship id")))) {
	 changeVar_by ("ship id", 1);
      }
   }
   procDef ("Rotate ship %n toward %n %n %n by %n \\%",
	    id ("x", "y", "z", "%"), 1; 1; 1; 1; 1, false);
   call ("Get ship pos %n", getParam ("id", "r"));
   call ("Get eigenvector to %n %n %n",
	 StrSUB (getParam ("x", "r"), readVariable ("X")),
	 StrSUB (getParam ("y", "r"), readVariable ("Y")),
	 StrSUB (getParam ("z", "r"), readVariable ("Z")));
   call ("Get ship rotation %n", getParam ("id", "r"));
   call ("Change ship %n rotation by %n %n %n", getParam ("id", "r"),
	 StrMUL (StrDIV (getParam ("%", "r"), 100),
		 StrSUB (%
			 (StrADD
			  (StrSUB
			   (readVariable ("dirY"), readVariable ("x rot")),
			   180), 360), 180)), StrMUL (StrDIV (getParam ("%",
									"r"),
							      100),
						      StrSUB (%
							      (StrADD
							       (StrSUB
								(readVariable
								 ("dirXZ"),
								 readVariable
								 ("y rot")),
								180), 360),
							      180)),
	 StrMUL (StrDIV (getParam ("%", "r"), 100),
		 StrSUB (0, readVariable ("z rot"))));
   whenGreenFlag ();
   setVar_to ("PREGAME", "1");
   setVar_to ("DEMO WAVE", "2");
   setVar_to ("COINED", "3");
   setVar_to ("PLAYING", "4");
   setVar_to ("PASSING", "5");
   setVar_to ("SHIPS PER WAVE", "3");
   setVar_to ("TUMBLING", "1.1");
   setVar_to ("INSERT COIN", "1.3");
   whenGreenFlag ();
   hide ();
   setVar_to ("?mouseDownPrev", 0);
   setVar_to ("last firing time", timer ());
   whenIReceive ("Fire");
   playSound ("laser");
   append_toList ("0", "projectiles");
   append_toList (mouseX (), "projectiles");
   append_toList (mouseY (), "projectiles");
   whenIReceive ("Check Mouse and Keyboard");
   gotoX_y (mouseX (), mouseY ());
   if (StrEQ (readVariable ("#Mode"), getAttribute_of ("PLAYING", "CONSTS"))) {
      comeToFront ();
      show ();
      if (mousePressed ()) {
	 if (StrEQ (readVariable ("?mouseDownPrev"), "0")) {
	    if (StrGT
		(StrSUB (timer (), readVariable ("last firing time")),
		 "0.6")) {
	       setVar_to ("last firing time", timer ());
	       broadcast ("Fire");
	    }
	 }
	 setVar_to ("?mouseDownPrev", "1");
      } else {
	 setVar_to ("?mouseDownPrev", 0);
      }
      if (StrAND
	  (keyPressed ("space"), StrGT (readVariable ("#Shields"), "0"))) {
	 setVar_to ("?UsingShields", "1");
      } else {
	 setVar_to ("?UsingShields", 0);
      }
   } else {
      setVar_to ("?mouseDownPrev", 0);
      hide ();
   }
   whenIReceive ("Start new round");
   setVar_to ("last firing time", timer ());
   changeVar_by ("#Shields", -1);
}