REBOL [title: "Space Invaders"] alien1: load to-binary decompress 64#{ eJx9UzFLQzEQjijUOognHTIVhCd0cXJ1kLe3g7SbFKcsWQoWZ7MFhNKxg0PpH3Cx WbKUqpPoUNcOPim1Q+kPkCJekvf0NTx7cLl7d8l33+XywvL+FrFyhVpCPUY9QN0g LnG7ScjjrtM98iedToeM3kbW7/f71k4/p6R+USe9Xo/UqjUbi94jMhgMrL/8XpLm ZZP4spPyzxVTT35MM2Zir4vFYu4dM7GP2M483Fa8f8w0O/Vy24yzo8RXipfJmdb8 kJxwrdJ7K4gxiSs7/09czYpdW6vcsI+AtrEKQ7ScDPlLHO/aNQ8huzaVeSDaHrNi 3IlBjDI6mqVsWvIA0E5ZJ2OtlUIuAKHmqoS5kHOt9UPMP0sm3TU5PHdHQVIZMs3v qZTPmrMAQAj6ZXOSUtkwPKRwloKQNlexCDOvR4fpclGq76KNzC2mQPiG681i5gAw ZusVJEAh5JojBzrEGQYC2dncuh7+y83d7ASVAu8MpAQqkT9+3Gg3Q+wHI2AZSAFm 1+99FzMQkzllVUxeTFUrc4vC4Q4VV4wlLyaerjD1XPe+tLxK8SNbqTrJOIf/Bd4X V+VU7AfjSm0ZEgQAAA== } ship1: load to-binary decompress 64#{ eJx1Us9L3EAU/rTbMdHE9VlYukSQFhUpvXjQXrfizR8XkYAnt0oQVsTLGlgEFdSL l3jqpXgre6sEJAgDsidPIul/sHjopeIfILj0JdnV3ez0y7zJzLx533vvY2YXhzOI scs2yfaF7QNbDxLHjzfAu4HEhpKryAgDfccC4rfAws0IjF/96HsWyH7XMNXIon9Z QJvWsNQw8XZP4NPlKD73Whi/HcZO4z207fv7jyo8/jk4r1TdFQXcSrV+flEtq3x2 5amuB44lyU+BpHRKHq4dKXnZCbLkxl9kOF5BarPVDFWyBAWcEAVFsjrhENGmhyPK UXe+XNHf9HqZW9GgyzUUoloqXcXE1wv6iSTHohSkQ8yJQ5l2RCiSvPIGbaVkTFuu Ge5/erfdurb+wM3ETZHPyjaX5NzNHPATOHMsn894sMZJWX4uH78OYSvTrUU+paI2 q8nQl5JHMFaSOZLBbHPnoR2ndHUa5NtPwubfFKziT1YqRDdY2VV3JckT3X2ZIlwW KQjmUxGhGQ0Ecm5OlhBvUsSi/NpXmjLRoFx4YWuL0789fN24m+jsK2x+wGE+JjLR DePiqdbKZqZojf1qLZ2ptdO3ZrxXwjCODzuThK3Af4EF8jYSBAAA } alien-fire: load to-binary decompress 64#{ eJxz8o1jZACDMiDWAGI+IJYFYkYGFrD4CyAW5oZgAYhSBhZmFoaWphaG48eOMwQF BDFoaGgwPH36lGHZsmUM4uLiDFk5WQyzZs1iuHHzBsOfv38Ydu7cyWBhZsFQXlrO EBEVATTBaWlolAoDA/vp3bt37wHyZwPpTUCaedqpUBWGS6HLMj8AedpA0Z1QGqTK KXrNtCdgF/BLtrCD6GywOAPDabA6BobCTAMwXTfzFMh8uM7ZUBpi/p3QZdMMwLp2 796GbH7omrR2sH6Omc+h5m4C09pQuiKzHWp+O1R+D1QeQjstPQINIwag+wBUhlwj XgEAAA== } ship-fire: load to-binary decompress 64#{ eJxz8t3FAAFlQKwBxOxALAjEjAwsYHEXIBbmhmABqFo2FhYG9l4eBvajbAwKSTIM /H8FGFjUOBg4tnEyGP1VYWAXZWOwadNg4KhiYdA5JMLAacbJIHNLhUFnkgiDIpMg 2IyDd2UYVMqdGNLLyxoOz7RpCJ5p2pDi4sYAwlFpSz+AcEoJkF8O5KstZWhUkvig 4uLEoAIUO7f7zQcA8m8lvboAAAA= } the-score: 0 speed: 0 lowest: 0 random/seed now b: ['image 300x400 ship1] for row 60 220 40 [ for column 20 380 60 [ pos: to-pair rejoin [column "x" row] append b reduce ['image pos alien1] ] ] view center-face layout/tight [ scrn: box black 600x440 effect [draw b] rate 0 feel [ engage: func [f a e] [ if a = 'key [ if e/key = 'right [ b/2: b/2 + 5x0 ] if e/key = 'left [ b/2: b/2 - 5x0 ] if e/key = 'up [ if not find b ship-fire [ fire-pos: b/2 + 25x-20 append b reduce ['image fire-pos ship-fire] ] ] show scrn ] if a = 'time [ ; fire a bullet at random times from random aliens: if (random 10) > 1 [ ; increase "> x" value for more fire rand-alien: (random (((length? b) - 3) / 3)) * 3 - 1 ; only fire from bottom row - ; determine lowest alien coordinate: for q 1 (length? b) 1 [ if ( ((type? (pick b (q + 1))) = pair!) and ((pick b (q + 2)) = alien1) ) [ if ((second (pick b rand-alien)) > lowest) [ lowest: second (pick b rand-alien) ] ] ] fire-pos: ((pick b rand-alien) + 25x70) if (second fire-pos) > lowest [ ;print [b/62 " " lowest " " fire-pos] append b reduce ['image fire-pos alien-fire] ] ] for i 1 (length? b) 1 [ ; move ship fire: if ((pick b i) = ship-fire) [ either ((second (pick b (i - 1))) < -10) [ ; if at top of screen, remove: remove/part at b (i - 2) 3 ] [ ; otherwise, move up: do compose [b/(i - 1): b/(i - 1) - 0x8] ] ] ; move ships: if ((pick b i) = alien1) [ either ((second (pick b (i - 1))) > 400) [ ; if at bottom of screen, end game: alert "Game Over!" quit ] [ ; otherwise, move: ; move left: ; move right: ; move down: do compose [b/(i - 1): b/(i - 1) + 1x0] ] ] ; move alien fire: if ((pick b i) = alien-fire) [ either ((second (pick b (i - 1))) > 400) [ ; if at bottom of screen, remove: remove/part at b (i - 2) 3 ] [ ; otherwise, move down: do compose [b/(i - 1): b/(i - 1) + 0x1] ] ] ] the-score: the-score + 1 score/text: to-string the-score show scrn ] ] ] origin across at 20x5 h2 white "Score:" score: h2 white bold "000000" do [focus scrn] ] { do compose [ b/(index - 1): b/(index - 1) + 0x1 ] ; old-pos: pick b (index - 1) ; remove at b (index - 1) ; insert at b (index - 1) (old-pos + 0x1) ; change at b (index - 1) ((pick b (index - 1)) + 0x1) print "yes" foreach item b [ print item if item = ship-fire [print back b] ] { for item 1 (length? b) 1 [ print compose [b/(item)] if ((pick b item) = ship-fire) [ do compose [ b/(item - 1): b/(item - 1) - 0x5 ] ] ] } { delay: delay + 1 ; loop speed # of times before moving aliens ; (reduce speed value to move aliens faster): if delay = speed [delay: 0] ; if delay < 1 [(move aliens)] ] } { new-b: copy [] foreach item b [ either all [ ((type? item) = pair!) ((length? new-b) > 3) ] [ append new-b (item + 0x5) ] [ append new-b item ] coord: first back back (tail new-b) if ((type? coord) = pair!) [ if ((second coord) < -60) [ remove back tail new-b remove back tail new-b remove back tail new-b ] ] ] } if (length? new-b) < 4 [ alert "You killed all the aliens!" ] { b: copy new-b collision-b: remove/part (copy b) 3 foreach item collision-b [ if (type? item) = pair! [ if all [ ((item/1 - b/2/1) < 15) ((item/1 - b/2/1) > -40) ((b/2/2 - item/2) < 30) ((b/2/2 - item/2) > 5) ] [ alert "Ouch - you hit a tree!" alert rejoin ["Final Score: " the-score] quit ] ] ] } }