Hex Artifact Content
Not logged in

Artifact 53b62ad7dac6c148902b40886c0c5ed7ac38d8af:


0000: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0010: 54 6b 20 38 2e 34 0a 0a 70 72 6f 63 20 6d 61 69  Tk 8.4..proc mai
0020: 6e 20 7b 7d 20 7b 0a 20 20 20 20 63 61 74 63 68  n {} {.    catch
0030: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 41 6e 64   {.        # And
0040: 72 6f 69 64 20 6f 6e 6c 79 0a 20 20 20 20 20 20  roid only.      
0050: 20 20 62 6f 72 67 20 73 63 72 65 65 6e 6f 72 69    borg screenori
0060: 65 6e 74 61 74 69 6f 6e 20 6c 61 6e 64 73 63 61  entation landsca
0070: 70 65 0a 20 20 20 20 20 20 20 20 62 69 6e 64 20  pe.        bind 
0080: 61 6c 6c 20 3c 42 72 65 61 6b 3e 20 65 78 69 74  all <Break> exit
0090: 53 63 72 69 70 74 0a 20 20 20 20 20 20 20 20 62  Script.        b
00a0: 69 6e 64 20 2e 20 3c 3c 57 69 6c 6c 45 6e 74 65  ind . <<WillEnte
00b0: 72 42 61 63 6b 67 72 6f 75 6e 64 3e 3e 20 65 78  rBackground>> ex
00c0: 69 74 53 63 72 69 70 74 0a 09 75 70 64 61 74 65  itScript..update
00d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68  .    }.    catch
00e0: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 53 44 4c   {.        # SDL
00f0: 32 2c 20 73 63 72 65 65 6e 20 73 63 61 6c 69 6e  2, screen scalin
0100: 67 20 61 6e 64 20 6a 6f 79 73 74 69 63 6b 20 73  g and joystick s
0110: 75 70 70 6f 72 74 20 0a 20 20 20 20 20 20 20 20  upport .        
0120: 73 64 6c 74 6b 20 74 6f 75 63 68 74 72 61 6e 73  sdltk touchtrans
0130: 6c 61 74 65 20 30 0a 20 20 20 20 20 20 20 20 63  late 0.        c
0140: 61 74 63 68 20 7b 73 64 6c 74 6b 20 72 6f 6f 74  atch {sdltk root
0150: 20 34 35 30 20 35 30 30 7d 0a 09 73 64 6c 74 6b   450 500}..sdltk
0160: 20 76 72 6d 6f 64 65 20 31 0a 20 20 20 20 20 20   vrmode 1.      
0170: 20 20 73 64 6c 74 6b 20 73 63 72 65 65 6e 73 61    sdltk screensa
0180: 76 65 72 20 6f 66 66 0a 20 20 20 20 20 20 20 20  ver off.        
0190: 77 6d 20 61 74 74 72 69 62 75 74 65 73 20 2e 20  wm attributes . 
01a0: 2d 66 75 6c 6c 73 63 72 65 65 6e 20 31 0a 20 20  -fullscreen 1.  
01b0: 20 20 20 20 20 20 62 69 6e 64 20 2e 20 3c 3c 4a        bind . <<J
01c0: 6f 79 73 74 69 63 6b 42 75 74 74 6f 6e 44 6f 77  oystickButtonDow
01d0: 6e 3e 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n>> {.          
01e0: 20 20 69 66 20 7b 25 73 20 3d 3d 20 34 7d 20 7b    if {%s == 4} {
01f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0200: 20 23 20 69 67 6e 6f 72 65 0a 20 20 20 20 20 20   # ignore.      
0210: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
0220: 21 24 3a 3a 6b 65 79 53 74 61 74 75 73 28 46 49  !$::keyStatus(FI
0230: 52 45 29 7d 20 7b 0a 20 20 20 20 20 20 20 20 20  RE)} {.         
0240: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 6b 65 79         set ::key
0250: 53 74 61 74 75 73 28 46 49 52 45 29 20 31 0a 20  Status(FIRE) 1. 
0260: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0270: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
0280: 69 6e 64 20 2e 20 3c 3c 4a 6f 79 73 74 69 63 6b  ind . <<Joystick
0290: 42 75 74 74 6f 6e 55 70 3e 3e 20 7b 0a 20 20 20  ButtonUp>> {.   
02a0: 20 20 20 20 20 20 20 20 20 69 66 20 7b 25 73 20           if {%s 
02b0: 3d 3d 20 34 7d 20 7b 0a 20 20 20 20 20 20 20 20  == 4} {.        
02c0: 20 20 20 20 20 20 20 20 65 76 65 6e 74 20 67 65          event ge
02d0: 6e 65 72 61 74 65 20 2e 63 31 20 3c 4b 65 79 2d  nerate .c1 <Key-
02e0: 71 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  q>.            }
02f0: 20 65 6c 73 65 69 66 20 7b 25 73 20 3d 3d 20 31   elseif {%s == 1
0300: 20 7c 7c 20 25 73 20 3d 3d 20 32 7d 20 7b 0a 20   || %s == 2} {. 
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
0320: 76 65 6e 74 20 67 65 6e 65 72 61 74 65 20 2e 63  vent generate .c
0330: 31 20 3c 4b 65 79 2d 70 3e 0a 20 20 20 20 20 20  1 <Key-p>.      
0340: 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b        } elseif {
0350: 24 3a 3a 6b 65 79 53 74 61 74 75 73 28 46 49 52  $::keyStatus(FIR
0360: 45 29 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  E)} {.          
0370: 20 20 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53        set ::keyS
0380: 74 61 74 75 73 28 46 49 52 45 29 20 30 0a 20 20  tatus(FIRE) 0.  
0390: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
03a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 69      }.        bi
03b0: 6e 64 20 2e 20 3c 3c 4a 6f 79 73 74 69 63 6b 4d  nd . <<JoystickM
03c0: 6f 74 69 6f 6e 3e 3e 20 7b 0a 20 20 20 20 20 20  otion>> {.      
03d0: 20 20 20 20 20 20 69 66 20 7b 25 73 20 3d 3d 20        if {%s == 
03e0: 31 20 7c 7c 20 25 73 20 3d 3d 20 33 7d 20 7b 0a  1 || %s == 3} {.
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0400: 69 66 20 7b 25 78 20 3e 20 32 35 30 7d 20 7b 0a  if {%x > 250} {.
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0420: 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53 74 61      set ::keySta
0430: 74 75 73 28 52 49 47 48 54 29 20 31 0a 20 20 20  tus(RIGHT) 1.   
0440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0450: 20 73 65 74 20 3a 3a 6b 65 79 53 74 61 74 75 73   set ::keyStatus
0460: 28 4c 45 46 54 29 20 30 0a 20 20 20 20 20 20 20  (LEFT) 0.       
0470: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69           } elsei
0480: 66 20 7b 25 78 20 3c 20 2d 32 35 30 7d 20 7b 0a  f {%x < -250} {.
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04a0: 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53 74 61      set ::keySta
04b0: 74 75 73 28 52 49 47 48 54 29 20 30 0a 20 20 20  tus(RIGHT) 0.   
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 73 65 74 20 3a 3a 6b 65 79 53 74 61 74 75 73   set ::keyStatus
04e0: 28 4c 45 46 54 29 20 31 0a 20 20 20 20 20 20 20  (LEFT) 1.       
04f0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
0500: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0510: 20 20 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53        set ::keyS
0520: 74 61 74 75 73 28 52 49 47 48 54 29 20 30 0a 20  tatus(RIGHT) 0. 
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0540: 20 20 20 73 65 74 20 3a 3a 6b 65 79 53 74 61 74     set ::keyStat
0550: 75 73 28 4c 45 46 54 29 20 30 0a 20 20 20 20 20  us(LEFT) 0.     
0560: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
0570: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0580: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 23     }.    }.    #
0590: 20 41 6e 64 72 6f 69 64 20 63 61 6d 65 72 61 0a   Android camera.
05a0: 20 20 20 20 69 6d 61 67 65 20 63 72 65 61 74 65      image create
05b0: 20 70 68 6f 74 6f 20 63 61 6d 0a 20 20 20 20 63   photo cam.    c
05c0: 61 74 63 68 20 7b 0a 09 62 6f 72 67 20 63 61 6d  atch {..borg cam
05d0: 65 72 61 20 6f 70 65 6e 20 30 0a 09 62 6f 72 67  era open 0..borg
05e0: 20 63 61 6d 65 72 61 20 70 61 72 61 6d 65 74 65   camera paramete
05f0: 72 73 20 70 72 65 76 69 65 77 2d 73 69 7a 65 20  rs preview-size 
0600: 36 34 30 78 34 38 30 20 66 72 61 6d 65 2d 72 61  640x480 frame-ra
0610: 74 65 20 31 30 0a 09 61 66 74 65 72 20 31 30 30  te 10..after 100
0620: 30 20 7b 62 6f 72 67 20 63 61 6d 65 72 61 20 73  0 {borg camera s
0630: 74 61 72 74 7d 0a 09 62 69 6e 64 20 2e 20 3c 3c  tart}..bind . <<
0640: 49 6d 61 67 65 43 61 70 74 75 72 65 3e 3e 20 7b  ImageCapture>> {
0650: 69 6d 67 43 61 70 74 75 72 65 20 25 78 7d 0a 20  imgCapture %x}. 
0660: 20 20 20 7d 0a 20 20 20 20 77 6d 20 70 72 6f 74     }.    wm prot
0670: 6f 63 6f 6c 20 2e 20 57 4d 5f 44 45 4c 45 54 45  ocol . WM_DELETE
0680: 5f 57 49 4e 44 4f 57 20 65 78 69 74 53 63 72 69  _WINDOW exitScri
0690: 70 74 0a 20 20 20 20 2e 20 63 6f 6e 66 69 67 75  pt.    . configu
06a0: 72 65 20 2d 62 61 63 6b 67 72 6f 75 6e 64 20 62  re -background b
06b0: 6c 61 63 6b 0a 20 20 20 20 66 6f 6e 74 20 63 72  lack.    font cr
06c0: 65 61 74 65 20 42 69 67 46 6f 6e 74 20 2d 66 61  eate BigFont -fa
06d0: 6d 69 6c 79 20 41 72 69 61 6c 20 2d 73 69 7a 65  mily Arial -size
06e0: 20 2d 32 30 20 2d 77 65 69 67 68 74 20 62 6f 6c   -20 -weight bol
06f0: 64 0a 20 20 20 20 66 6f 6e 74 20 63 72 65 61 74  d.    font creat
0700: 65 20 53 6d 61 6c 6c 46 6f 6e 74 20 2d 66 61 6d  e SmallFont -fam
0710: 69 6c 79 20 41 72 69 61 6c 20 2d 73 69 7a 65 20  ily Arial -size 
0720: 2d 31 30 20 2d 77 65 69 67 68 74 20 62 6f 6c 64  -10 -weight bold
0730: 0a 20 20 20 20 62 75 69 6c 64 55 49 0a 20 20 20  .    buildUI.   
0740: 20 62 69 6e 64 4b 65 79 73 0a 20 20 20 20 61 64   bindKeys.    ad
0750: 64 54 72 61 63 65 73 0a 20 20 20 20 6c 6f 61 64  dTraces.    load
0760: 47 72 61 70 68 69 63 73 0a 20 20 20 20 63 72 65  Graphics.    cre
0770: 61 74 65 53 74 61 72 73 0a 20 20 20 20 63 72 65  ateStars.    cre
0780: 61 74 65 53 68 69 70 0a 20 20 20 20 6e 65 77 47  ateShip.    newG
0790: 61 6d 65 0a 7d 0a 0a 70 72 6f 63 20 69 6d 67 43  ame.}..proc imgC
07a0: 61 70 74 75 72 65 20 7b 66 6c 61 67 7d 20 7b 0a  apture {flag} {.
07b0: 20 20 20 20 69 66 20 7b 21 24 66 6c 61 67 7d 20      if {!$flag} 
07c0: 7b 0a 09 61 66 74 65 72 20 63 61 6e 63 65 6c 20  {..after cancel 
07d0: 7b 62 6f 72 67 20 63 61 6d 65 72 61 20 73 74 61  {borg camera sta
07e0: 72 74 7d 0a 09 61 66 74 65 72 20 31 30 30 30 20  rt}..after 1000 
07f0: 7b 62 6f 72 67 20 63 61 6d 65 72 61 20 73 74 61  {borg camera sta
0800: 72 74 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rt}.    }.    if
0810: 20 7b 21 5b 62 6f 72 67 20 63 61 6d 65 72 61 20   {![borg camera 
0820: 69 6d 61 67 65 20 63 61 6d 5d 7d 20 7b 0a 09 72  image cam]} {..r
0830: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 70  eturn.    }.}..p
0840: 72 6f 63 20 6e 65 77 47 61 6d 65 20 7b 7d 20 7b  roc newGame {} {
0850: 0a 20 20 20 20 2e 63 31 20 64 65 6c 65 74 65 20  .    .c1 delete 
0860: 77 69 74 68 74 61 67 73 20 22 63 6f 6e 74 69 6e  withtags "contin
0870: 75 65 22 20 22 67 61 6d 65 6f 76 65 72 22 0a 20  ue" "gameover". 
0880: 20 20 20 69 6e 69 74 56 61 72 73 0a 20 20 20 20     initVars.    
0890: 6e 65 78 74 4c 65 76 65 6c 0a 20 20 20 20 6f 70  nextLevel.    op
08a0: 65 6e 69 6e 67 53 63 72 65 65 6e 0a 7d 0a 0a 70  eningScreen.}..p
08b0: 72 6f 63 20 6f 70 65 6e 69 6e 67 53 63 72 65 65  roc openingScree
08c0: 6e 20 7b 7d 20 7b 0a 20 20 20 20 2e 63 31 20 63  n {} {.    .c1 c
08d0: 72 65 61 74 65 20 74 65 78 74 20 32 32 35 20 31  reate text 225 1
08e0: 33 30 20 2d 74 65 78 74 20 22 50 6c 61 79 20 54  30 -text "Play T
08f0: 6b 2d 42 75 67 7a 22 20 2d 66 69 6c 6c 20 79 65  k-Bugz" -fill ye
0900: 6c 6c 6f 77 20 2d 66 6f 6e 74 20 42 69 67 46 6f  llow -font BigFo
0910: 6e 74 20 5c 0a 20 20 20 20 20 20 20 20 2d 74 61  nt \.        -ta
0920: 67 20 22 70 6c 61 79 22 0a 20 20 20 20 2e 63 31  g "play".    .c1
0930: 20 63 72 65 61 74 65 20 74 65 78 74 20 32 32 35   create text 225
0940: 20 31 37 30 20 2d 74 65 78 74 20 22 51 75 69 74   170 -text "Quit
0950: 22 20 20 20 20 20 20 20 20 20 2d 66 69 6c 6c 20  "         -fill 
0960: 79 65 6c 6c 6f 77 20 2d 66 6f 6e 74 20 42 69 67  yellow -font Big
0970: 46 6f 6e 74 20 5c 0a 20 20 20 20 20 20 20 20 2d  Font \.        -
0980: 74 61 67 20 22 71 75 69 74 22 0a 20 20 20 20 2e  tag "quit".    .
0990: 63 31 20 62 69 6e 64 20 22 70 6c 61 79 22 20 3c  c1 bind "play" <
09a0: 45 6e 74 65 72 3e 20 7b 2e 63 31 20 69 74 65 6d  Enter> {.c1 item
09b0: 63 6f 6e 66 69 67 75 72 65 20 22 70 6c 61 79 22  configure "play"
09c0: 20 2d 66 69 6c 6c 20 72 65 64 7d 0a 20 20 20 20   -fill red}.    
09d0: 2e 63 31 20 62 69 6e 64 20 22 70 6c 61 79 22 20  .c1 bind "play" 
09e0: 3c 4c 65 61 76 65 3e 20 7b 2e 63 31 20 69 74 65  <Leave> {.c1 ite
09f0: 6d 63 6f 6e 66 69 67 75 72 65 20 22 70 6c 61 79  mconfigure "play
0a00: 22 20 2d 66 69 6c 6c 20 79 65 6c 6c 6f 77 7d 0a  " -fill yellow}.
0a10: 20 20 20 20 2e 63 31 20 62 69 6e 64 20 22 70 6c      .c1 bind "pl
0a20: 61 79 22 20 3c 31 3e 20 20 20 20 20 7b 64 6f 47  ay" <1>     {doG
0a30: 61 6d 65 7d 0a 20 20 20 20 2e 63 31 20 62 69 6e  ame}.    .c1 bin
0a40: 64 20 22 71 75 69 74 22 20 3c 45 6e 74 65 72 3e  d "quit" <Enter>
0a50: 20 7b 2e 63 31 20 69 74 65 6d 63 6f 6e 66 69 67   {.c1 itemconfig
0a60: 75 72 65 20 22 71 75 69 74 22 20 2d 66 69 6c 6c  ure "quit" -fill
0a70: 20 72 65 64 7d 0a 20 20 20 20 2e 63 31 20 62 69   red}.    .c1 bi
0a80: 6e 64 20 22 71 75 69 74 22 20 3c 4c 65 61 76 65  nd "quit" <Leave
0a90: 3e 20 7b 2e 63 31 20 69 74 65 6d 63 6f 6e 66 69  > {.c1 itemconfi
0aa0: 67 75 72 65 20 22 71 75 69 74 22 20 2d 66 69 6c  gure "quit" -fil
0ab0: 6c 20 79 65 6c 6c 6f 77 7d 0a 20 20 20 20 2e 63  l yellow}.    .c
0ac0: 31 20 62 69 6e 64 20 22 71 75 69 74 22 20 3c 31  1 bind "quit" <1
0ad0: 3e 20 20 20 20 20 7b 65 78 69 74 53 63 72 69 70  >     {exitScrip
0ae0: 74 7d 0a 7d 0a 0a 70 72 6f 63 20 65 78 69 74 53  t}.}..proc exitS
0af0: 63 72 69 70 74 20 7b 7d 20 7b 0a 20 20 20 20 63  cript {} {.    c
0b00: 61 74 63 68 20 7b 73 64 6c 74 6b 20 73 63 72 65  atch {sdltk scre
0b10: 65 6e 73 61 76 65 72 20 6f 6e 7d 0a 20 20 20 20  ensaver on}.    
0b20: 2e 63 31 20 64 65 6c 65 74 65 20 61 6c 6c 0a 20  .c1 delete all. 
0b30: 20 20 20 64 65 73 74 72 6f 79 20 2e 63 31 0a 20     destroy .c1. 
0b40: 20 20 20 65 78 69 74 0a 7d 0a 0a 70 72 6f 63 20     exit.}..proc 
0b50: 64 6f 47 61 6d 65 20 7b 7d 20 7b 0a 20 20 20 20  doGame {} {.    
0b60: 2e 63 31 20 64 65 6c 65 74 65 20 22 70 6c 61 79  .c1 delete "play
0b70: 22 0a 20 20 20 20 2e 63 31 20 64 65 6c 65 74 65  ".    .c1 delete
0b80: 20 22 71 75 69 74 22 0a 20 20 20 20 73 65 74 20   "quit".    set 
0b90: 3a 3a 67 6c 6f 62 61 6c 28 61 6c 69 76 65 29 20  ::global(alive) 
0ba0: 31 0a 20 20 20 20 67 61 6d 65 4c 6f 6f 70 0a 7d  1.    gameLoop.}
0bb0: 0a 0a 70 72 6f 63 20 61 64 64 54 72 61 63 65 73  ..proc addTraces
0bc0: 20 7b 7d 20 7b 0a 20 20 20 20 74 72 61 63 65 20   {} {.    trace 
0bd0: 76 61 72 69 61 62 6c 65 20 3a 3a 67 6c 6f 62 61  variable ::globa
0be0: 6c 28 6c 65 76 65 6c 29 20 77 20 75 70 64 61 74  l(level) w updat
0bf0: 65 54 65 78 74 0a 20 20 20 20 74 72 61 63 65 20  eText.    trace 
0c00: 76 61 72 69 61 62 6c 65 20 3a 3a 67 6c 6f 62 61  variable ::globa
0c10: 6c 28 73 63 6f 72 65 29 20 77 20 75 70 64 61 74  l(score) w updat
0c20: 65 54 65 78 74 0a 20 20 20 20 74 72 61 63 65 20  eText.    trace 
0c30: 76 61 72 69 61 62 6c 65 20 3a 3a 67 6c 6f 62 61  variable ::globa
0c40: 6c 28 73 68 69 70 73 29 20 77 20 75 70 64 61 74  l(ships) w updat
0c50: 65 54 65 78 74 0a 20 20 20 20 74 72 61 63 65 20  eText.    trace 
0c60: 76 61 72 69 61 62 6c 65 20 3a 3a 67 6c 6f 62 61  variable ::globa
0c70: 6c 28 66 70 73 29 20 20 20 77 20 75 70 64 61 74  l(fps)   w updat
0c80: 65 54 65 78 74 0a 7d 0a 0a 70 72 6f 63 20 69 6e  eText.}..proc in
0c90: 69 74 56 61 72 73 20 7b 7d 20 7b 0a 20 20 20 20  itVars {} {.    
0ca0: 73 65 74 20 3a 3a 67 6c 6f 62 61 6c 28 66 72 61  set ::global(fra
0cb0: 6d 65 43 6f 75 6e 74 29 20 30 0a 20 20 20 20 73  meCount) 0.    s
0cc0: 65 74 20 3a 3a 67 6c 6f 62 61 6c 28 6c 65 76 65  et ::global(leve
0cd0: 6c 29 20 20 20 20 20 20 30 0a 20 20 20 20 73 65  l)      0.    se
0ce0: 74 20 3a 3a 67 6c 6f 62 61 6c 28 6d 61 72 63 68  t ::global(march
0cf0: 44 69 72 29 20 20 20 31 0a 20 20 20 20 73 65 74  Dir)   1.    set
0d00: 20 3a 3a 67 6c 6f 62 61 6c 28 6f 66 66 73 65 74   ::global(offset
0d10: 29 20 20 20 20 20 30 0a 20 20 20 20 73 65 74 20  )     0.    set 
0d20: 3a 3a 67 6c 6f 62 61 6c 28 73 63 6f 72 65 29 20  ::global(score) 
0d30: 20 20 20 20 20 30 0a 20 20 20 20 73 65 74 20 3a       0.    set :
0d40: 3a 67 6c 6f 62 61 6c 28 73 68 69 70 73 29 20 20  :global(ships)  
0d50: 20 20 20 20 35 0a 20 20 20 20 73 65 74 20 3a 3a      5.    set ::
0d60: 67 6c 6f 62 61 6c 28 66 70 73 29 20 20 20 20 20  global(fps)     
0d70: 20 20 20 5b 66 6f 72 6d 61 74 20 25 36 2e 32 66     [format %6.2f
0d80: 20 30 5d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 61 64   0].}..proc load
0d90: 47 72 61 70 68 69 63 73 20 7b 7d 20 7b 0a 20 20  Graphics {} {.  
0da0: 20 20 73 65 74 20 70 61 74 68 20 5b 66 69 6c 65    set path [file
0db0: 20 64 69 72 6e 61 6d 65 20 5b 69 6e 66 6f 20 73   dirname [info s
0dc0: 63 72 69 70 74 5d 5d 0a 20 20 20 20 73 65 74 20  cript]].    set 
0dd0: 3a 3a 69 6d 67 28 73 68 6f 74 53 68 69 70 29 20  ::img(shotShip) 
0de0: 5b 69 6d 61 67 65 20 63 72 65 61 74 65 20 70 68  [image create ph
0df0: 6f 74 6f 20 2d 66 69 6c 65 20 5b 66 69 6c 65 20  oto -file [file 
0e00: 6a 6f 69 6e 20 24 70 61 74 68 20 73 68 6f 74 5f  join $path shot_
0e10: 73 68 69 70 2e 67 69 66 5d 5d 0a 20 20 20 20 73  ship.gif]].    s
0e20: 65 74 20 3a 3a 69 6d 67 28 73 68 6f 74 42 75 67  et ::img(shotBug
0e30: 29 20 20 5b 69 6d 61 67 65 20 63 72 65 61 74 65  )  [image create
0e40: 20 70 68 6f 74 6f 20 2d 66 69 6c 65 20 5b 66 69   photo -file [fi
0e50: 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 73 68  le join $path sh
0e60: 6f 74 5f 62 75 67 2e 67 69 66 5d 5d 0a 20 20 20  ot_bug.gif]].   
0e70: 20 73 65 74 20 3a 3a 69 6d 67 28 62 75 67 29 20   set ::img(bug) 
0e80: 20 20 20 20 20 5b 69 6d 61 67 65 20 63 72 65 61       [image crea
0e90: 74 65 20 70 68 6f 74 6f 20 2d 66 69 6c 65 20 5b  te photo -file [
0ea0: 66 69 6c 65 20 6a 6f 69 6e 20 24 70 61 74 68 20  file join $path 
0eb0: 62 75 67 2e 67 69 66 5d 5d 0a 20 20 20 20 73 65  bug.gif]].    se
0ec0: 74 20 3a 3a 69 6d 67 28 73 68 69 70 29 20 20 20  t ::img(ship)   
0ed0: 20 20 5b 69 6d 61 67 65 20 63 72 65 61 74 65 20    [image create 
0ee0: 70 68 6f 74 6f 20 2d 66 69 6c 65 20 5b 66 69 6c  photo -file [fil
0ef0: 65 20 6a 6f 69 6e 20 24 70 61 74 68 20 73 68 69  e join $path shi
0f00: 70 2e 67 69 66 5d 5d 0a 20 20 20 20 73 65 74 20  p.gif]].    set 
0f10: 3a 3a 69 6d 67 28 65 78 70 29 20 20 20 20 20 20  ::img(exp)      
0f20: 5b 69 6d 61 67 65 20 63 72 65 61 74 65 20 70 68  [image create ph
0f30: 6f 74 6f 20 2d 66 69 6c 65 20 5b 66 69 6c 65 20  oto -file [file 
0f40: 6a 6f 69 6e 20 24 70 61 74 68 20 65 78 70 6c 6f  join $path explo
0f50: 73 69 6f 6e 2e 67 69 66 5d 5d 0a 7d 0a 0a 70 72  sion.gif]].}..pr
0f60: 6f 63 20 63 72 65 61 74 65 53 68 69 70 20 7b 7d  oc createShip {}
0f70: 20 7b 0a 20 20 20 20 2e 63 31 20 64 65 6c 65 74   {.    .c1 delet
0f80: 65 20 77 69 74 68 74 61 67 20 22 73 68 69 70 22  e withtag "ship"
0f90: 0a 20 20 20 20 2e 63 31 20 63 72 65 61 74 65 20  .    .c1 create 
0fa0: 69 6d 61 67 65 20 32 32 35 20 34 38 30 20 2d 69  image 225 480 -i
0fb0: 6d 61 67 65 20 24 3a 3a 69 6d 67 28 73 68 69 70  mage $::img(ship
0fc0: 29 20 2d 74 61 67 20 22 73 68 69 70 22 0a 7d 0a  ) -tag "ship".}.
0fd0: 0a 70 72 6f 63 20 67 61 6d 65 4c 6f 6f 70 20 7b  .proc gameLoop {
0fe0: 7d 20 7b 0a 20 20 20 20 73 65 74 20 67 61 6d 65  } {.    set game
0ff0: 53 74 61 72 74 54 69 6d 65 20 5b 63 6c 6f 63 6b  StartTime [clock
1000: 20 63 6c 69 63 6b 73 20 2d 6d 69 6c 6c 69 73 65   clicks -millise
1010: 63 6f 6e 64 73 5d 0a 20 20 20 20 73 65 74 20 66  conds].    set f
1020: 63 20 30 0a 20 20 20 20 77 68 69 6c 65 20 7b 24  c 0.    while {$
1030: 3a 3a 67 6c 6f 62 61 6c 28 61 6c 69 76 65 29 7d  ::global(alive)}
1040: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 66   {.        set f
1050: 72 61 6d 65 53 74 61 72 74 54 69 6d 65 20 5b 63  rameStartTime [c
1060: 6c 6f 63 6b 20 63 6c 69 63 6b 73 20 2d 6d 69 6c  lock clicks -mil
1070: 6c 69 73 65 63 6f 6e 64 73 5d 0a 20 20 20 20 20  liseconds].     
1080: 20 20 20 73 65 74 20 66 72 61 6d 65 45 6e 64 54     set frameEndT
1090: 69 6d 65 20 20 20 5b 65 78 70 72 20 7b 24 66 72  ime   [expr {$fr
10a0: 61 6d 65 53 74 61 72 74 54 69 6d 65 20 2b 20 33  ameStartTime + 3
10b0: 33 7d 5d 0a 0a 20 20 20 20 20 20 20 20 6e 65 78  3}]..        nex
10c0: 74 46 72 61 6d 65 0a 0a 20 20 20 20 20 20 20 20  tFrame..        
10d0: 69 6e 63 72 20 66 63 0a 20 20 20 20 20 20 20 20  incr fc.        
10e0: 69 66 20 7b 21 28 24 66 63 20 25 20 33 30 29 7d  if {!($fc % 30)}
10f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
1100: 65 74 20 66 70 73 20 5b 65 78 70 72 20 7b 28 24  et fps [expr {($
1110: 66 63 20 2f 20 28 28 24 6e 6f 77 54 69 6d 65 20  fc / (($nowTime 
1120: 2d 20 24 67 61 6d 65 53 74 61 72 74 54 69 6d 65  - $gameStartTime
1130: 29 20 2a 20 2e 30 30 31 29 29 7d 5d 0a 20 20 20  ) * .001))}].   
1140: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 67           set ::g
1150: 6c 6f 62 61 6c 28 66 70 73 29 20 5b 66 6f 72 6d  lobal(fps) [form
1160: 61 74 20 25 36 2e 32 66 20 24 66 70 73 5d 0a 20  at %6.2f $fps]. 
1170: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1180: 20 20 75 70 64 61 74 65 0a 0a 20 20 20 20 20 20    update..      
1190: 20 20 73 65 74 20 6e 6f 77 54 69 6d 65 20 5b 63    set nowTime [c
11a0: 6c 6f 63 6b 20 63 6c 69 63 6b 73 20 2d 6d 69 6c  lock clicks -mil
11b0: 6c 69 73 65 63 6f 6e 64 73 5d 0a 20 20 20 20 20  liseconds].     
11c0: 20 20 20 77 68 69 6c 65 20 7b 24 6e 6f 77 54 69     while {$nowTi
11d0: 6d 65 20 3c 20 24 66 72 61 6d 65 45 6e 64 54 69  me < $frameEndTi
11e0: 6d 65 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  me} {.          
11f0: 20 20 73 65 74 20 6e 6f 77 54 69 6d 65 20 5b 63    set nowTime [c
1200: 6c 6f 63 6b 20 63 6c 69 63 6b 73 20 2d 6d 69 6c  lock clicks -mil
1210: 6c 69 73 65 63 6f 6e 64 73 5d 0a 20 20 20 20 20  liseconds].     
1220: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 65 74     }.        set
1230: 20 3a 3a 67 6c 6f 62 61 6c 28 66 72 61 6d 65 43   ::global(frameC
1240: 6f 75 6e 74 29 20 24 66 63 0a 20 20 20 20 7d 0a  ount) $fc.    }.
1250: 20 20 20 20 65 6e 64 47 61 6d 65 0a 7d 0a 0a 70      endGame.}..p
1260: 72 6f 63 20 65 6e 64 47 61 6d 65 20 7b 7d 20 7b  roc endGame {} {
1270: 0a 20 20 20 20 2e 63 31 20 63 72 65 61 74 65 20  .    .c1 create 
1280: 74 65 78 74 20 32 32 35 20 32 30 30 20 2d 66 6f  text 225 200 -fo
1290: 6e 74 20 42 69 67 46 6f 6e 74 20 2d 66 69 6c 6c  nt BigFont -fill
12a0: 20 79 65 6c 6c 6f 77 20 5c 0a 20 20 20 20 20 20   yellow \.      
12b0: 20 20 2d 74 65 78 74 20 22 47 61 6d 65 20 4f 76    -text "Game Ov
12c0: 65 72 22 20 2d 74 61 67 20 22 67 61 6d 65 6f 76  er" -tag "gameov
12d0: 65 72 22 0a 20 20 20 20 2e 63 31 20 63 72 65 61  er".    .c1 crea
12e0: 74 65 20 74 65 78 74 20 32 32 35 20 32 35 30 20  te text 225 250 
12f0: 2d 66 6f 6e 74 20 42 69 67 46 6f 6e 74 20 2d 66  -font BigFont -f
1300: 69 6c 6c 20 79 65 6c 6c 6f 77 20 5c 0a 20 20 20  ill yellow \.   
1310: 20 20 20 20 20 2d 74 65 78 74 20 22 43 6c 69 63       -text "Clic
1320: 6b 20 74 6f 20 43 6f 6e 74 69 6e 75 65 22 20 2d  k to Continue" -
1330: 74 61 67 20 22 63 6f 6e 74 69 6e 75 65 22 0a 20  tag "continue". 
1340: 20 20 20 2e 63 31 20 62 69 6e 64 20 22 63 6f 6e     .c1 bind "con
1350: 74 69 6e 75 65 22 20 3c 45 6e 74 65 72 3e 20 7b  tinue" <Enter> {
1360: 2e 63 31 20 69 74 65 6d 63 6f 6e 66 69 67 75 72  .c1 itemconfigur
1370: 65 20 22 63 6f 6e 74 69 6e 75 65 22 20 2d 66 69  e "continue" -fi
1380: 6c 6c 20 72 65 64 7d 0a 20 20 20 20 2e 63 31 20  ll red}.    .c1 
1390: 62 69 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20  bind "continue" 
13a0: 3c 4c 65 61 76 65 3e 20 7b 2e 63 31 20 69 74 65  <Leave> {.c1 ite
13b0: 6d 63 6f 6e 66 69 67 75 72 65 20 22 63 6f 6e 74  mconfigure "cont
13c0: 69 6e 75 65 22 20 2d 66 69 6c 6c 20 79 65 6c 6c  inue" -fill yell
13d0: 6f 77 7d 0a 20 20 20 20 2e 63 31 20 62 69 6e 64  ow}.    .c1 bind
13e0: 20 22 63 6f 6e 74 69 6e 75 65 22 20 3c 31 3e 20   "continue" <1> 
13f0: 20 20 20 20 6e 65 77 47 61 6d 65 0a 7d 0a 0a 70      newGame.}..p
1400: 72 6f 63 20 6e 65 78 74 46 72 61 6d 65 20 7b 7d  roc nextFrame {}
1410: 20 7b 0a 20 20 20 20 6d 6f 76 65 53 74 61 72 73   {.    moveStars
1420: 0a 20 20 20 20 6d 6f 76 65 42 75 67 73 0a 20 20  .    moveBugs.  
1430: 20 20 6d 6f 76 65 53 68 6f 74 73 0a 20 20 20 20    moveShots.    
1440: 73 68 69 70 45 76 65 6e 74 73 0a 20 20 20 20 66  shipEvents.    f
1450: 69 6e 64 43 6f 6c 6c 69 73 69 6f 6e 73 0a 7d 0a  indCollisions.}.
1460: 0a 70 72 6f 63 20 6e 65 78 74 4c 65 76 65 6c 20  .proc nextLevel 
1470: 7b 7d 20 7b 0a 20 20 20 20 2e 63 31 20 64 65 6c  {} {.    .c1 del
1480: 65 74 65 20 77 69 74 68 74 61 67 73 20 22 62 75  ete withtags "bu
1490: 67 73 68 6f 74 22 20 22 73 68 69 70 73 68 6f 74  gshot" "shipshot
14a0: 22 20 22 62 75 67 22 0a 20 20 20 20 61 72 72 61  " "bug".    arra
14b0: 79 20 75 6e 73 65 74 20 3a 3a 62 75 67 73 0a 20  y unset ::bugs. 
14c0: 20 20 20 69 6e 63 72 20 3a 3a 67 6c 6f 62 61 6c     incr ::global
14d0: 28 6c 65 76 65 6c 29 0a 20 20 20 20 63 72 65 61  (level).    crea
14e0: 74 65 42 75 67 73 0a 7d 0a 0a 70 72 6f 63 20 75  teBugs.}..proc u
14f0: 70 64 61 74 65 54 65 78 74 20 7b 61 72 72 61 79  pdateText {array
1500: 20 65 6c 65 6d 20 6f 70 7d 20 7b 0a 20 20 20 20   elem op} {.    
1510: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 24 65  switch -exact $e
1520: 6c 65 6d 20 7b 0a 20 20 20 20 20 20 20 20 22 73  lem {.        "s
1530: 63 6f 72 65 22 20 7b 0a 20 20 20 20 20 20 20 20  core" {.        
1540: 20 20 20 20 2e 63 31 20 69 74 65 6d 63 6f 6e 66      .c1 itemconf
1550: 69 67 75 72 65 20 22 73 63 6f 72 65 22 20 2d 74  igure "score" -t
1560: 65 78 74 20 5b 66 6f 72 6d 61 74 20 22 25 36 64  ext [format "%6d
1570: 22 20 24 3a 3a 67 6c 6f 62 61 6c 28 73 63 6f 72  " $::global(scor
1580: 65 29 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e)].        }.  
1590: 20 20 20 20 20 20 22 6c 65 76 65 6c 22 20 7b 0a        "level" {.
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 2e 63 31 20              .c1 
15b0: 69 74 65 6d 63 6f 6e 66 69 67 75 72 65 20 22 6c  itemconfigure "l
15c0: 65 76 65 6c 22 20 2d 74 65 78 74 20 5b 66 6f 72  evel" -text [for
15d0: 6d 61 74 20 22 25 32 64 22 20 24 3a 3a 67 6c 6f  mat "%2d" $::glo
15e0: 62 61 6c 28 6c 65 76 65 6c 29 5d 0a 20 20 20 20  bal(level)].    
15f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 22 73      }.        "s
1600: 68 69 70 73 22 20 7b 0a 20 20 20 20 20 20 20 20  hips" {.        
1610: 20 20 20 20 2e 63 31 20 69 74 65 6d 63 6f 6e 66      .c1 itemconf
1620: 69 67 75 72 65 20 22 73 68 69 70 73 22 20 2d 74  igure "ships" -t
1630: 65 78 74 20 5b 66 6f 72 6d 61 74 20 22 25 32 64  ext [format "%2d
1640: 22 20 24 3a 3a 67 6c 6f 62 61 6c 28 73 68 69 70  " $::global(ship
1650: 73 29 5d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s)].        }.  
1660: 20 20 20 20 20 20 22 66 70 73 22 20 7b 0a 20 20        "fps" {.  
1670: 20 20 20 20 20 20 20 20 20 20 2e 63 31 20 69 74            .c1 it
1680: 65 6d 63 6f 6e 66 69 67 75 72 65 20 22 66 70 73  emconfigure "fps
1690: 22 20 20 20 2d 74 65 78 74 20 24 3a 3a 67 6c 6f  "   -text $::glo
16a0: 62 61 6c 28 66 70 73 29 0a 20 20 20 20 20 20 20  bal(fps).       
16b0: 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63   }.    }.}..proc
16c0: 20 66 69 6e 64 43 6f 6c 6c 69 73 69 6f 6e 73 20   findCollisions 
16d0: 7b 7d 20 7b 0a 0a 20 20 20 20 23 20 2d 2d 2d 20  {} {..    # --- 
16e0: 73 65 65 20 69 66 20 74 68 65 20 73 68 69 70 20  see if the ship 
16f0: 68 61 73 20 73 68 6f 74 20 64 6f 77 6e 20 61 6e  has shot down an
1700: 79 20 62 75 67 73 2e 2e 2e 0a 20 20 20 20 66 6f  y bugs....    fo
1710: 72 65 61 63 68 20 73 68 6f 74 20 5b 2e 63 31 20  reach shot [.c1 
1720: 66 69 6e 64 20 77 69 74 68 74 61 67 20 22 73 68  find withtag "sh
1730: 69 70 73 68 6f 74 22 5d 20 7b 0a 20 20 20 20 20  ipshot"] {.     
1740: 20 20 20 66 6f 72 65 61 63 68 20 69 74 65 6d 20     foreach item 
1750: 5b 65 76 61 6c 20 2e 63 31 20 66 69 6e 64 20 6f  [eval .c1 find o
1760: 76 65 72 6c 61 70 70 69 6e 67 20 5b 2e 63 31 20  verlapping [.c1 
1770: 62 62 6f 78 20 24 73 68 6f 74 5d 5d 20 7b 0a 20  bbox $shot]] {. 
1780: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b             if {[
1790: 73 74 72 69 6e 67 20 65 71 75 61 6c 20 22 62 75  string equal "bu
17a0: 67 22 20 5b 2e 63 31 20 67 65 74 74 61 67 20 24  g" [.c1 gettag $
17b0: 69 74 65 6d 5d 5d 7d 20 7b 0a 20 20 20 20 20 20  item]]} {.      
17c0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 70 6f            set po
17d0: 69 6e 74 73 20 5b 65 78 70 72 20 7b 24 3a 3a 62  ints [expr {$::b
17e0: 75 67 73 28 24 69 74 65 6d 2c 70 6f 69 6e 74 73  ugs($item,points
17f0: 29 20 2b 20 28 35 30 20 2a 20 24 3a 3a 62 75 67  ) + (50 * $::bug
1800: 73 28 24 69 74 65 6d 2c 64 69 76 65 29 29 7d 5d  s($item,dive))}]
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1820: 20 69 6e 63 72 20 3a 3a 67 6c 6f 62 61 6c 28 73   incr ::global(s
1830: 63 6f 72 65 29 20 24 70 6f 69 6e 74 73 0a 0a 20  core) $points.. 
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1850: 65 74 20 6d 65 32 20 5b 65 76 61 6c 20 2e 63 31  et me2 [eval .c1
1860: 20 63 72 65 61 74 65 20 69 6d 61 67 65 20 5b 2e   create image [.
1870: 63 31 20 63 6f 6f 72 64 73 20 24 69 74 65 6d 5d  c1 coords $item]
1880: 20 2d 69 6d 61 67 65 20 24 3a 3a 69 6d 67 28 65   -image $::img(e
1890: 78 70 29 5d 0a 20 20 20 20 20 20 20 20 20 20 20  xp)].           
18a0: 20 20 20 20 20 73 65 74 20 6d 65 31 20 5b 65 76       set me1 [ev
18b0: 61 6c 20 2e 63 31 20 63 72 65 61 74 65 20 74 65  al .c1 create te
18c0: 78 74 20 5b 2e 63 31 20 63 6f 6f 72 64 73 20 24  xt [.c1 coords $
18d0: 69 74 65 6d 5d 20 5c 0a 20 20 20 20 20 20 20 20  item] \.        
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 66 6f 6e              -fon
18f0: 74 20 53 6d 61 6c 6c 46 6f 6e 74 20 2d 66 69 6c  t SmallFont -fil
1900: 6c 20 79 65 6c 6c 6f 77 20 2d 74 65 78 74 20 24  l yellow -text $
1910: 70 6f 69 6e 74 73 5d 0a 20 20 20 20 20 20 20 20  points].        
1920: 20 20 20 20 20 20 20 20 2e 63 31 20 64 65 6c 65          .c1 dele
1930: 74 65 20 24 69 74 65 6d 20 24 73 68 6f 74 0a 20  te $item $shot. 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1950: 66 74 65 72 20 32 30 30 20 5b 6c 69 73 74 20 2e  fter 200 [list .
1960: 63 31 20 64 65 6c 65 74 65 20 24 6d 65 32 5d 0a  c1 delete $me2].
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 61 66 74 65 72 20 35 30 30 20 5b 6c 69 73 74 20  after 500 [list 
1990: 2e 63 31 20 64 65 6c 65 74 65 20 24 6d 65 31 5d  .c1 delete $me1]
19a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19b0: 20 62 72 65 61 6b 3b 20 20 23 20 2d 2d 2d 20 61   break;  # --- a
19c0: 6c 6c 6f 77 20 61 20 73 69 6e 67 6c 65 20 73 68  llow a single sh
19d0: 6f 74 20 74 6f 20 6f 6e 6c 79 20 6b 69 6c 6c 20  ot to only kill 
19e0: 61 20 73 69 6e 67 6c 65 20 62 75 67 2e 2e 2e 0a  a single bug....
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1a10: 20 20 20 23 20 2d 2d 2d 20 73 65 65 20 69 66 20     # --- see if 
1a20: 74 68 65 20 73 68 69 70 20 68 61 73 20 62 65 65  the ship has bee
1a30: 6e 20 68 69 74 20 62 79 20 61 20 62 75 67 20 6f  n hit by a bug o
1a40: 72 20 61 20 62 75 67 20 73 68 6f 74 0a 20 20 20  r a bug shot.   
1a50: 20 66 6f 72 65 61 63 68 20 69 74 65 6d 20 5b 65   foreach item [e
1a60: 76 61 6c 20 2e 63 31 20 66 69 6e 64 20 6f 76 65  val .c1 find ove
1a70: 72 6c 61 70 70 69 6e 67 20 5b 2e 63 31 20 62 62  rlapping [.c1 bb
1a80: 6f 78 20 22 73 68 69 70 22 5d 5d 20 7b 0a 20 20  ox "ship"]] {.  
1a90: 20 20 20 20 20 20 73 65 74 20 74 61 67 20 5b 2e        set tag [.
1aa0: 63 31 20 67 65 74 74 61 67 20 24 69 74 65 6d 5d  c1 gettag $item]
1ab0: 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b 73 74  .        if {[st
1ac0: 72 69 6e 67 20 65 71 75 61 6c 20 24 74 61 67 20  ring equal $tag 
1ad0: 22 62 75 67 22 5d 20 7c 7c 20 5b 73 74 72 69 6e  "bug"] || [strin
1ae0: 67 20 65 71 75 61 6c 20 24 74 61 67 20 22 62 75  g equal $tag "bu
1af0: 67 73 68 6f 74 22 5d 7d 20 7b 0a 20 20 20 20 20  gshot"]} {.     
1b00: 20 20 20 20 20 20 20 2e 63 31 20 64 65 6c 65 74         .c1 delet
1b10: 65 20 24 69 74 65 6d 0a 20 20 20 20 20 20 20 20  e $item.        
1b20: 20 20 20 20 69 6e 63 72 20 3a 3a 67 6c 6f 62 61      incr ::globa
1b30: 6c 28 73 68 69 70 73 29 20 2d 31 0a 20 20 20 20  l(ships) -1.    
1b40: 20 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 67          if {$::g
1b50: 6c 6f 62 61 6c 28 73 68 69 70 73 29 20 3c 3d 20  lobal(ships) <= 
1b60: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0} {.           
1b70: 20 20 20 20 20 73 65 74 20 3a 3a 67 6c 6f 62 61       set ::globa
1b80: 6c 28 61 6c 69 76 65 29 20 30 0a 20 20 20 20 20  l(alive) 0.     
1b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ba0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20   }.    }..    # 
1bb0: 2d 2d 2d 20 69 66 20 6e 6f 20 6d 6f 72 65 20 62  --- if no more b
1bc0: 75 67 73 2c 20 67 6f 20 74 6f 20 6e 65 78 74 20  ugs, go to next 
1bd0: 6c 65 76 65 6c 0a 20 20 20 20 69 66 20 7b 21 5b  level.    if {![
1be0: 6c 6c 65 6e 67 74 68 20 5b 2e 63 31 20 66 69 6e  llength [.c1 fin
1bf0: 64 20 77 69 74 68 74 61 67 20 22 62 75 67 22 5d  d withtag "bug"]
1c00: 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  ]} {.        nex
1c10: 74 4c 65 76 65 6c 0a 20 20 20 20 7d 0a 7d 0a 0a  tLevel.    }.}..
1c20: 0a 70 72 6f 63 20 73 68 69 70 45 76 65 6e 74 73  .proc shipEvents
1c30: 20 7b 7d 20 7b 0a 20 20 20 20 66 6f 72 65 61 63   {} {.    foreac
1c40: 68 20 7b 78 6c 6f 63 20 79 6c 6f 63 7d 20 5b 2e  h {xloc yloc} [.
1c50: 63 31 20 63 6f 6f 72 64 73 20 22 73 68 69 70 22  c1 coords "ship"
1c60: 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 20 69  ] {break}..    i
1c70: 66 20 7b 24 3a 3a 6b 65 79 53 74 61 74 75 73 28  f {$::keyStatus(
1c80: 4c 45 46 54 29 20 26 26 20 24 78 6c 6f 63 20 3e  LEFT) && $xloc >
1c90: 20 32 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 2e   20} {.        .
1ca0: 63 31 20 6d 6f 76 65 20 22 73 68 69 70 22 20 2d  c1 move "ship" -
1cb0: 38 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  8 0.    }..    i
1cc0: 66 20 7b 24 3a 3a 6b 65 79 53 74 61 74 75 73 28  f {$::keyStatus(
1cd0: 52 49 47 48 54 29 20 26 26 20 24 78 6c 6f 63 20  RIGHT) && $xloc 
1ce0: 3c 20 34 33 30 7d 20 7b 0a 20 20 20 20 20 20 20  < 430} {.       
1cf0: 20 2e 63 31 20 6d 6f 76 65 20 22 73 68 69 70 22   .c1 move "ship"
1d00: 20 38 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20   8 0.    }..    
1d10: 69 66 20 7b 24 3a 3a 6b 65 79 53 74 61 74 75 73  if {$::keyStatus
1d20: 28 46 49 52 45 29 20 26 26 20 5b 6c 6c 65 6e 67  (FIRE) && [lleng
1d30: 74 68 20 5b 2e 63 31 20 66 69 6e 64 20 77 69 74  th [.c1 find wit
1d40: 68 74 61 67 20 22 73 68 69 70 73 68 6f 74 22 5d  htag "shipshot"]
1d50: 5d 20 3c 20 34 7d 20 7b 0a 20 20 20 20 20 20 20  ] < 4} {.       
1d60: 20 73 65 74 20 73 68 6f 74 20 5b 2e 63 31 20 63   set shot [.c1 c
1d70: 72 65 61 74 65 20 69 6d 61 67 65 20 24 78 6c 6f  reate image $xlo
1d80: 63 20 5b 65 78 70 72 20 7b 24 79 6c 6f 63 20 2d  c [expr {$yloc -
1d90: 20 31 30 7d 5d 20 2d 69 6d 61 67 65 20 24 3a 3a   10}] -image $::
1da0: 69 6d 67 28 73 68 6f 74 53 68 69 70 29 20 2d 74  img(shotShip) -t
1db0: 61 67 20 22 73 68 69 70 73 68 6f 74 22 5d 0a 20  ag "shipshot"]. 
1dc0: 20 20 20 20 20 20 20 2e 63 31 20 6c 6f 77 65 72         .c1 lower
1dd0: 20 24 73 68 6f 74 20 22 73 68 69 70 22 0a 20 20   $shot "ship".  
1de0: 20 20 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53        set ::keyS
1df0: 74 61 74 75 73 28 46 49 52 45 29 20 30 0a 20 20  tatus(FIRE) 0.  
1e00: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 6d 6f 76 65    }.}..proc move
1e10: 53 74 61 72 73 20 7b 7d 20 7b 0a 20 20 20 20 66  Stars {} {.    f
1e20: 6f 72 65 61 63 68 20 73 74 61 72 20 5b 2e 63 31  oreach star [.c1
1e30: 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 22 73   find withtag "s
1e40: 74 61 72 22 5d 20 7b 0a 20 20 20 20 20 20 20 20  tar"] {.        
1e50: 2e 63 31 20 6d 6f 76 65 20 24 73 74 61 72 20 30  .c1 move $star 0
1e60: 20 34 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61   4.        forea
1e70: 63 68 20 7b 78 6c 6f 77 20 79 6c 6f 77 20 78 68  ch {xlow ylow xh
1e80: 69 67 68 20 79 68 69 67 68 7d 20 5b 2e 63 31 20  igh yhigh} [.c1 
1e90: 63 6f 6f 72 64 73 20 24 73 74 61 72 5d 20 7b 62  coords $star] {b
1ea0: 72 65 61 6b 7d 0a 20 20 20 20 20 20 20 20 69 66  reak}.        if
1eb0: 20 7b 24 79 68 69 67 68 20 3e 20 35 30 30 7d 20   {$yhigh > 500} 
1ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 63  {.            .c
1ed0: 31 20 6d 6f 76 65 20 24 73 74 61 72 20 30 20 2d  1 move $star 0 -
1ee0: 35 30 30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  500.        }.  
1ef0: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 6d 6f 76 65    }.}..proc move
1f00: 53 68 6f 74 73 20 7b 7d 20 7b 0a 20 20 20 20 66  Shots {} {.    f
1f10: 6f 72 65 61 63 68 20 73 68 6f 74 20 5b 2e 63 31  oreach shot [.c1
1f20: 20 66 69 6e 64 20 77 69 74 68 74 61 67 20 22 62   find withtag "b
1f30: 75 67 73 68 6f 74 22 5d 20 7b 0a 20 20 20 20 20  ugshot"] {.     
1f40: 20 20 20 2e 63 31 20 6d 6f 76 65 20 24 73 68 6f     .c1 move $sho
1f50: 74 20 30 20 31 32 0a 20 20 20 20 20 20 20 20 66  t 0 12.        f
1f60: 6f 72 65 61 63 68 20 7b 78 6c 6f 63 20 79 6c 6f  oreach {xloc ylo
1f70: 63 7d 20 5b 2e 63 31 20 63 6f 6f 72 64 73 20 24  c} [.c1 coords $
1f80: 73 68 6f 74 5d 20 7b 62 72 65 61 6b 7d 0a 20 20  shot] {break}.  
1f90: 20 20 20 20 20 20 69 66 20 7b 24 79 6c 6f 63 20        if {$yloc 
1fa0: 3e 20 35 30 30 7d 20 7b 0a 20 20 20 20 20 20 20  > 500} {.       
1fb0: 20 20 20 20 20 2e 63 31 20 64 65 6c 65 74 65 20       .c1 delete 
1fc0: 24 73 68 6f 74 0a 20 20 20 20 20 20 20 20 7d 0a  $shot.        }.
1fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 65 61      }..    forea
1fe0: 63 68 20 73 68 6f 74 20 5b 2e 63 31 20 66 69 6e  ch shot [.c1 fin
1ff0: 64 20 77 69 74 68 74 61 67 20 22 73 68 69 70 73  d withtag "ships
2000: 68 6f 74 22 5d 20 7b 0a 20 20 20 20 20 20 20 20  hot"] {.        
2010: 2e 63 31 20 6d 6f 76 65 20 24 73 68 6f 74 20 30  .c1 move $shot 0
2020: 20 2d 31 34 0a 20 20 20 20 20 20 20 20 66 6f 72   -14.        for
2030: 65 61 63 68 20 7b 78 6c 6f 63 20 79 6c 6f 63 7d  each {xloc yloc}
2040: 20 5b 2e 63 31 20 63 6f 6f 72 64 73 20 24 73 68   [.c1 coords $sh
2050: 6f 74 5d 20 7b 62 72 65 61 6b 7d 0a 20 20 20 20  ot] {break}.    
2060: 20 20 20 20 69 66 20 7b 24 79 6c 6f 63 20 3c 20      if {$yloc < 
2070: 30 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0} {.           
2080: 20 2e 63 31 20 64 65 6c 65 74 65 20 24 73 68 6f   .c1 delete $sho
2090: 74 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  t.        }.    
20a0: 7d 0a 7d 0a 0a 70 72 6f 63 20 6d 6f 76 65 42 75  }.}..proc moveBu
20b0: 67 73 20 7b 7d 20 7b 0a 20 20 20 20 73 65 74 20  gs {} {.    set 
20c0: 6c 65 76 65 6c 20 24 3a 3a 67 6c 6f 62 61 6c 28  level $::global(
20d0: 6c 65 76 65 6c 29 0a 20 20 20 20 66 6f 72 65 61  level).    forea
20e0: 63 68 20 7b 73 68 69 70 78 20 73 68 69 70 79 7d  ch {shipx shipy}
20f0: 20 5b 2e 63 31 20 63 6f 6f 72 64 73 20 22 73 68   [.c1 coords "sh
2100: 69 70 22 5d 20 7b 62 72 65 61 6b 7d 0a 20 20 20  ip"] {break}.   
2110: 20 66 6f 72 65 61 63 68 20 7b 78 6c 6f 77 20 79   foreach {xlow y
2120: 6c 6f 77 20 78 68 69 67 68 20 79 68 69 67 68 7d  low xhigh yhigh}
2130: 20 5b 2e 63 31 20 62 62 6f 78 20 22 62 75 67 22   [.c1 bbox "bug"
2140: 5d 20 7b 62 72 65 61 6b 7d 0a 0a 20 20 20 20 69  ] {break}..    i
2150: 66 20 7b 24 78 6c 6f 77 20 3c 20 31 30 7d 20 7b  f {$xlow < 10} {
2160: 0a 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 67  .        set ::g
2170: 6c 6f 62 61 6c 28 6d 61 72 63 68 44 69 72 29 20  lobal(marchDir) 
2180: 31 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b  1.    }.    if {
2190: 24 78 68 69 67 68 20 3e 20 34 34 30 7d 20 7b 0a  $xhigh > 440} {.
21a0: 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 67 6c          set ::gl
21b0: 6f 62 61 6c 28 6d 61 72 63 68 44 69 72 29 20 2d  obal(marchDir) -
21c0: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 6e 63  1.    }..    inc
21d0: 72 20 3a 3a 67 6c 6f 62 61 6c 28 6f 66 66 73 65  r ::global(offse
21e0: 74 29 20 24 3a 3a 67 6c 6f 62 61 6c 28 6d 61 72  t) $::global(mar
21f0: 63 68 44 69 72 29 0a 0a 20 20 20 20 73 65 74 20  chDir)..    set 
2200: 62 75 67 4c 69 73 74 20 5b 2e 63 31 20 66 69 6e  bugList [.c1 fin
2210: 64 20 77 69 74 68 74 61 67 20 22 62 75 67 22 5d  d withtag "bug"]
2220: 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 62 75  ..    foreach bu
2230: 67 20 24 62 75 67 4c 69 73 74 20 7b 0a 0a 20 20  g $bugList {..  
2240: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 78        foreach {x
2250: 6c 6f 63 20 79 6c 6f 63 7d 20 5b 2e 63 31 20 63  loc yloc} [.c1 c
2260: 6f 6f 72 64 73 20 24 62 75 67 5d 20 7b 62 72 65  oords $bug] {bre
2270: 61 6b 7d 0a 0a 20 20 20 20 20 20 20 20 23 20 2d  ak}..        # -
2280: 2d 2d 20 72 65 74 75 72 6e 20 62 75 67 73 20 68  -- return bugs h
2290: 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 74 6f 70  ome from the top
22a0: 20 6f 66 20 74 68 65 20 73 63 72 65 65 6e 0a 20   of the screen. 
22b0: 20 20 20 20 20 20 20 69 66 20 7b 24 3a 3a 62 75         if {$::bu
22c0: 67 73 28 24 62 75 67 2c 72 65 74 75 72 6e 29 7d  gs($bug,return)}
22d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
22e0: 66 20 7b 24 79 6c 6f 63 20 3e 3d 20 24 3a 3a 62  f {$yloc >= $::b
22f0: 75 67 73 28 24 62 75 67 2c 79 68 6f 6d 65 29 7d  ugs($bug,yhome)}
2300: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2310: 20 20 20 73 65 74 20 3a 3a 62 75 67 73 28 24 62     set ::bugs($b
2320: 75 67 2c 79 6d 29 20 30 0a 20 20 20 20 20 20 20  ug,ym) 0.       
2330: 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62           set ::b
2340: 75 67 73 28 24 62 75 67 2c 72 65 74 75 72 6e 29  ugs($bug,return)
2350: 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   0.             
2360: 20 20 20 2e 63 31 20 63 6f 6f 72 64 73 20 24 62     .c1 coords $b
2370: 75 67 20 5b 65 78 70 72 20 7b 24 3a 3a 62 75 67  ug [expr {$::bug
2380: 73 28 24 62 75 67 2c 78 68 6f 6d 65 29 20 2b 20  s($bug,xhome) + 
2390: 24 3a 3a 67 6c 6f 62 61 6c 28 6f 66 66 73 65 74  $::global(offset
23a0: 29 7d 5d 20 24 3a 3a 62 75 67 73 28 24 62 75 67  )}] $::bugs($bug
23b0: 2c 79 68 6f 6d 65 29 0a 20 20 20 20 20 20 20 20  ,yhome).        
23c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
23d0: 0a 20 20 20 20 20 20 20 20 23 20 2d 2d 2d 20 68  .        # --- h
23e0: 61 6e 64 6c 65 20 64 69 76 69 6e 67 20 62 75 67  andle diving bug
23f0: 73 0a 20 20 20 20 20 20 20 20 69 66 20 7b 24 3a  s.        if {$:
2400: 3a 62 75 67 73 28 24 62 75 67 2c 64 69 76 65 29  :bugs($bug,dive)
2410: 7d 20 7b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  } {..           
2420: 20 23 20 2d 2d 2d 20 61 6c 6c 6f 77 20 64 69 76   # --- allow div
2430: 69 6e 67 20 62 75 67 73 20 74 6f 20 22 74 72 61  ing bugs to "tra
2440: 63 6b 22 20 73 68 69 70 20 69 6e 20 74 6f 70 20  ck" ship in top 
2450: 68 61 6c 66 20 6f 66 20 73 63 72 65 65 6e 0a 20  half of screen. 
2460: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24             if {$
2470: 79 6c 6f 63 20 3c 20 32 35 30 7d 20 7b 0a 20 20  yloc < 250} {.  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2490: 74 20 78 73 70 65 65 64 20 24 3a 3a 62 75 67 73  t xspeed $::bugs
24a0: 28 24 62 75 67 2c 78 6d 29 0a 20 20 20 20 20 20  ($bug,xm).      
24b0: 20 20 20 20 20 20 20 20 20 20 69 66 20 7b 24 78            if {$x
24c0: 6c 6f 63 20 3c 20 24 73 68 69 70 78 20 26 26 20  loc < $shipx && 
24d0: 24 78 73 70 65 65 64 20 3c 20 34 7d 20 7b 0a 20  $xspeed < 4} {. 
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 69 6e 63 72 20 3a 3a 62 75 67 73 28 24     incr ::bugs($
2500: 62 75 67 2c 78 6d 29 0a 20 20 20 20 20 20 20 20  bug,xm).        
2510: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 69 66          } elseif
2520: 20 7b 24 78 6c 6f 63 20 3e 20 24 73 68 69 70 78   {$xloc > $shipx
2530: 20 26 26 20 24 78 73 70 65 65 64 20 3e 20 2d 34   && $xspeed > -4
2540: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2550: 20 20 20 20 20 20 20 20 69 6e 63 72 20 3a 3a 62          incr ::b
2560: 75 67 73 28 24 62 75 67 2c 78 6d 29 20 2d 31 0a  ugs($bug,xm) -1.
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20 2d  .            # -
25a0: 2d 2d 20 70 72 6f 67 72 65 73 73 69 76 65 6c 79  -- progressively
25b0: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73 70   increase the sp
25c0: 65 65 64 20 6f 66 20 74 68 65 20 64 69 76 69 6e  eed of the divin
25d0: 67 20 62 75 67 73 0a 20 20 20 20 20 20 20 20 20  g bugs.         
25e0: 20 20 20 69 66 20 7b 24 3a 3a 67 6c 6f 62 61 6c     if {$::global
25f0: 28 66 72 61 6d 65 43 6f 75 6e 74 29 20 25 20 31  (frameCount) % 1
2600: 30 20 3d 3d 20 30 7d 20 7b 0a 20 20 20 20 20 20  0 == 0} {.      
2610: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 79 73            set ys
2620: 70 65 65 64 20 24 3a 3a 62 75 67 73 28 24 62 75  peed $::bugs($bu
2630: 67 2c 79 6d 29 0a 20 20 20 20 20 20 20 20 20 20  g,ym).          
2640: 20 20 20 20 20 20 69 66 20 7b 24 79 73 70 65 65        if {$yspee
2650: 64 20 3c 20 31 30 7d 20 7b 0a 20 20 20 20 20 20  d < 10} {.      
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
2670: 63 72 20 79 73 70 65 65 64 0a 20 20 20 20 20 20  cr yspeed.      
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
2690: 74 20 3a 3a 62 75 67 73 28 24 62 75 67 2c 79 6d  t ::bugs($bug,ym
26a0: 29 20 24 79 73 70 65 65 64 0a 20 20 20 20 20 20  ) $yspeed.      
26b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26c0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
26d0: 20 20 20 20 20 20 20 23 20 2d 2d 2d 20 69 66 20         # --- if 
26e0: 61 20 64 69 76 69 6e 67 20 62 75 67 20 68 61 73  a diving bug has
26f0: 20 72 65 61 63 68 65 64 20 74 68 65 20 62 6f 74   reached the bot
2700: 74 6f 6d 20 6f 66 20 74 68 65 20 73 63 72 65 65  tom of the scree
2710: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  n,.            #
2720: 20 20 20 20 20 73 65 6e 64 20 69 74 20 68 6f 6d       send it hom
2730: 65 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  e....           
2740: 20 69 66 20 7b 24 79 6c 6f 63 20 3e 20 35 30 30   if {$yloc > 500
2750: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2760: 20 20 20 20 73 65 74 20 3a 3a 62 75 67 73 28 24      set ::bugs($
2770: 62 75 67 2c 64 69 76 65 29 20 20 30 0a 20 20 20  bug,dive)  0.   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
2790: 20 3a 3a 62 75 67 73 28 24 62 75 67 2c 72 65 74   ::bugs($bug,ret
27a0: 75 72 6e 29 20 31 0a 20 20 20 20 20 20 20 20 20  urn) 1.         
27b0: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 67         set ::bug
27c0: 73 28 24 62 75 67 2c 78 6d 29 20 31 0a 20 20 20  s($bug,xm) 1.   
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 63 31               .c1
27e0: 20 63 6f 6f 72 64 73 20 24 62 75 67 20 5b 65 78   coords $bug [ex
27f0: 70 72 20 7b 24 3a 3a 62 75 67 73 28 24 62 75 67  pr {$::bugs($bug
2800: 2c 78 68 6f 6d 65 29 20 2b 20 24 3a 3a 67 6c 6f  ,xhome) + $::glo
2810: 62 61 6c 28 6f 66 66 73 65 74 29 7d 5d 20 30 0a  bal(offset)}] 0.
2820: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2830: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
2840: 20 23 20 2d 2d 2d 20 6d 61 6b 65 20 62 75 67 73   # --- make bugs
2850: 20 64 69 76 65 20 6f 63 63 61 73 69 6f 6e 61 6c   dive occasional
2860: 6c 79 0a 20 20 20 20 20 20 20 20 69 66 20 7b 5b  ly.        if {[
2870: 6c 6c 65 6e 67 74 68 20 24 62 75 67 4c 69 73 74  llength $bugList
2880: 5d 20 3e 20 38 7d 20 7b 0a 20 20 20 20 20 20 20  ] > 8} {.       
2890: 20 20 20 20 20 73 65 74 20 64 69 76 65 46 61 63       set diveFac
28a0: 74 6f 72 20 5b 65 78 70 72 20 7b 69 6e 74 28 72  tor [expr {int(r
28b0: 61 6e 64 28 29 20 2a 20 33 32 37 36 37 29 20 25  and() * 32767) %
28c0: 20 69 6e 74 28 31 30 30 30 2f 24 6c 65 76 65 6c   int(1000/$level
28d0: 29 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  )}].            
28e0: 69 66 20 7b 21 24 64 69 76 65 46 61 63 74 6f 72  if {!$diveFactor
28f0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  } {.            
2900: 20 20 20 20 73 65 74 20 3a 3a 62 75 67 73 28 24      set ::bugs($
2910: 62 75 67 2c 64 69 76 65 29 20 31 0a 20 20 20 20  bug,dive) 1.    
2920: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2930: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2940: 20 20 20 20 20 20 20 73 65 74 20 3a 3a 62 75 67         set ::bug
2950: 73 28 24 62 75 67 2c 64 69 76 65 29 20 31 0a 20  s($bug,dive) 1. 
2960: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2970: 20 20 23 20 2d 2d 2d 20 6d 61 6b 65 20 62 75 67    # --- make bug
2980: 73 20 73 68 6f 6f 74 20 6f 63 63 61 73 69 6f 6e  s shoot occasion
2990: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 73 65 74  ally.        set
29a0: 20 73 68 6f 6f 74 46 61 63 74 6f 72 20 5b 65 78   shootFactor [ex
29b0: 70 72 20 7b 69 6e 74 28 72 61 6e 64 28 29 20 2a  pr {int(rand() *
29c0: 20 33 32 37 36 37 29 20 25 20 28 31 30 30 30 20   32767) % (1000 
29d0: 2d 20 28 39 30 30 20 2a 20 24 3a 3a 62 75 67 73  - (900 * $::bugs
29e0: 28 24 62 75 67 2c 64 69 76 65 29 29 29 7d 5d 0a  ($bug,dive)))}].
29f0: 20 20 20 20 20 20 20 20 69 66 20 7b 21 24 73 68          if {!$sh
2a00: 6f 6f 74 46 61 63 74 6f 72 7d 20 7b 0a 20 20 20  ootFactor} {.   
2a10: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 68 6f           set sho
2a20: 74 20 5b 2e 63 31 20 63 72 65 61 74 65 20 69 6d  t [.c1 create im
2a30: 61 67 65 20 24 78 6c 6f 63 20 24 79 6c 6f 63 20  age $xloc $yloc 
2a40: 2d 69 6d 61 67 65 20 24 3a 3a 69 6d 67 28 73 68  -image $::img(sh
2a50: 6f 74 42 75 67 29 20 2d 74 61 67 20 22 62 75 67  otBug) -tag "bug
2a60: 73 68 6f 74 22 5d 0a 20 20 20 20 20 20 20 20 20  shot"].         
2a70: 20 20 20 2e 63 31 20 6c 6f 77 65 72 20 24 73 68     .c1 lower $sh
2a80: 6f 74 20 22 73 68 69 70 22 0a 20 20 20 20 20 20  ot "ship".      
2a90: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 23 20 2d    }..        # -
2aa0: 2d 2d 20 6d 6f 76 65 20 74 68 65 20 62 75 67 73  -- move the bugs
2ab0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 6c   according to al
2ac0: 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 0a 20  l of the above. 
2ad0: 20 20 20 20 20 20 20 69 66 20 7b 21 24 3a 3a 62         if {!$::b
2ae0: 75 67 73 28 24 62 75 67 2c 64 69 76 65 29 7d 20  ugs($bug,dive)} 
2af0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 63  {.            .c
2b00: 31 20 6d 6f 76 65 20 24 62 75 67 20 5b 65 78 70  1 move $bug [exp
2b10: 72 20 7b 24 3a 3a 62 75 67 73 28 24 62 75 67 2c  r {$::bugs($bug,
2b20: 78 6d 29 20 2a 20 24 3a 3a 67 6c 6f 62 61 6c 28  xm) * $::global(
2b30: 6d 61 72 63 68 44 69 72 29 7d 5d 20 24 3a 3a 62  marchDir)}] $::b
2b40: 75 67 73 28 24 62 75 67 2c 79 6d 29 0a 20 20 20  ugs($bug,ym).   
2b50: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
2b60: 20 20 20 20 20 20 20 20 20 20 2e 63 31 20 6d 6f            .c1 mo
2b70: 76 65 20 24 62 75 67 20 24 3a 3a 62 75 67 73 28  ve $bug $::bugs(
2b80: 24 62 75 67 2c 78 6d 29 20 24 3a 3a 62 75 67 73  $bug,xm) $::bugs
2b90: 28 24 62 75 67 2c 79 6d 29 0a 20 20 20 20 20 20  ($bug,ym).      
2ba0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f    }.    }.}..pro
2bb0: 63 20 63 72 65 61 74 65 53 74 61 72 73 20 7b 7d  c createStars {}
2bc0: 20 7b 0a 20 20 20 20 2e 63 31 20 64 65 6c 65 74   {.    .c1 delet
2bd0: 65 20 77 69 74 68 74 61 67 20 22 73 74 61 72 73  e withtag "stars
2be0: 22 0a 20 20 20 20 73 65 74 20 69 20 31 0a 20 20  ".    set i 1.  
2bf0: 20 20 77 68 69 6c 65 20 7b 24 69 20 3c 3d 20 32    while {$i <= 2
2c00: 35 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74  5} {.        set
2c10: 20 72 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61   r [expr {int(ra
2c20: 6e 64 28 29 20 2a 20 31 35 35 29 20 2b 20 31 30  nd() * 155) + 10
2c30: 30 7d 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20  0}].        set 
2c40: 67 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e  g [expr {int(ran
2c50: 64 28 29 20 2a 20 31 35 35 29 20 2b 20 31 30 30  d() * 155) + 100
2c60: 7d 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 62  }].        set b
2c70: 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e 64   [expr {int(rand
2c80: 28 29 20 2a 20 31 35 35 29 20 2b 20 31 30 30 7d  () * 155) + 100}
2c90: 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20 78 20  ].        set x 
2ca0: 5b 65 78 70 72 20 7b 69 6e 74 28 72 61 6e 64 28  [expr {int(rand(
2cb0: 29 20 2a 20 34 35 30 29 7d 5d 0a 20 20 20 20 20  ) * 450)}].     
2cc0: 20 20 20 73 65 74 20 79 20 5b 65 78 70 72 20 7b     set y [expr {
2cd0: 69 6e 74 28 72 61 6e 64 28 29 20 2a 20 35 30 30  int(rand() * 500
2ce0: 29 7d 5d 0a 20 20 20 20 20 20 20 20 2e 63 31 20  )}].        .c1 
2cf0: 63 72 65 61 74 65 20 6c 69 6e 65 20 24 78 20 24  create line $x $
2d00: 79 20 24 78 20 5b 65 78 70 72 20 7b 24 79 20 2b  y $x [expr {$y +
2d10: 20 32 7d 5d 20 2d 66 69 6c 6c 20 5b 66 6f 72 6d   2}] -fill [form
2d20: 61 74 20 22 23 25 30 32 78 25 30 32 78 25 30 32  at "#%02x%02x%02
2d30: 78 22 20 24 72 20 24 67 20 24 62 5d 20 2d 74 61  x" $r $g $b] -ta
2d40: 67 73 20 22 73 74 61 72 22 0a 20 20 20 20 20 20  gs "star".      
2d50: 20 20 69 6e 63 72 20 69 0a 20 20 20 20 7d 0a 7d    incr i.    }.}
2d60: 0a 0a 70 72 6f 63 20 63 72 65 61 74 65 42 75 67  ..proc createBug
2d70: 73 20 7b 7d 20 7b 0a 20 20 20 20 66 6f 72 20 7b  s {} {.    for {
2d80: 73 65 74 20 79 20 31 7d 20 7b 24 79 20 3c 3d 20  set y 1} {$y <= 
2d90: 35 7d 20 7b 69 6e 63 72 20 79 7d 20 7b 0a 20 20  5} {incr y} {.  
2da0: 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74 20 78        for {set x
2db0: 20 31 7d 20 7b 24 78 20 3c 3d 20 31 30 7d 20 7b   1} {$x <= 10} {
2dc0: 69 6e 63 72 20 78 7d 20 7b 0a 20 20 20 20 20 20  incr x} {.      
2dd0: 20 20 20 20 20 20 73 65 74 20 78 6c 6f 63 20 5b        set xloc [
2de0: 65 78 70 72 20 7b 24 78 20 2a 20 33 30 20 2b 20  expr {$x * 30 + 
2df0: 35 30 7d 5d 0a 20 20 20 20 20 20 20 20 20 20 20  50}].           
2e00: 20 73 65 74 20 79 6c 6f 63 20 5b 65 78 70 72 20   set yloc [expr 
2e10: 7b 24 79 20 2a 20 32 35 20 2b 20 35 30 7d 5d 0a  {$y * 25 + 50}].
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
2e30: 62 75 67 20 5b 2e 63 31 20 63 72 65 61 74 65 20  bug [.c1 create 
2e40: 69 6d 61 67 65 20 24 78 6c 6f 63 20 24 79 6c 6f  image $xloc $ylo
2e50: 63 20 2d 69 6d 61 67 65 20 24 3a 3a 69 6d 67 28  c -image $::img(
2e60: 62 75 67 29 20 2d 74 61 67 73 20 22 62 75 67 22  bug) -tags "bug"
2e70: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  ].            se
2e80: 74 20 3a 3a 62 75 67 73 28 24 62 75 67 2c 64 69  t ::bugs($bug,di
2e90: 76 65 29 20 20 20 30 0a 20 20 20 20 20 20 20 20  ve)   0.        
2ea0: 20 20 20 20 73 65 74 20 3a 3a 62 75 67 73 28 24      set ::bugs($
2eb0: 62 75 67 2c 72 65 74 75 72 6e 29 20 30 0a 20 20  bug,return) 0.  
2ec0: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
2ed0: 62 75 67 73 28 24 62 75 67 2c 78 6d 29 20 20 20  bugs($bug,xm)   
2ee0: 20 20 31 0a 20 20 20 20 20 20 20 20 20 20 20 20    1.            
2ef0: 73 65 74 20 3a 3a 62 75 67 73 28 24 62 75 67 2c  set ::bugs($bug,
2f00: 78 68 6f 6d 65 29 20 20 24 78 6c 6f 63 0a 20 20  xhome)  $xloc.  
2f10: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
2f20: 62 75 67 73 28 24 62 75 67 2c 79 68 6f 6d 65 29  bugs($bug,yhome)
2f30: 20 20 24 79 6c 6f 63 0a 20 20 20 20 20 20 20 20    $yloc.        
2f40: 20 20 20 20 73 65 74 20 3a 3a 62 75 67 73 28 24      set ::bugs($
2f50: 62 75 67 2c 79 6d 29 20 20 20 20 20 30 0a 20 20  bug,ym)     0.  
2f60: 20 20 20 20 20 20 20 20 20 20 73 65 74 20 3a 3a            set ::
2f70: 62 75 67 73 28 24 62 75 67 2c 70 6f 69 6e 74 73  bugs($bug,points
2f80: 29 20 5b 65 78 70 72 20 7b 36 30 20 2d 20 28 24  ) [expr {60 - ($
2f90: 79 20 2a 20 31 30 29 7d 5d 0a 20 20 20 20 20 20  y * 10)}].      
2fa0: 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 70 72 6f    }.    }.}..pro
2fb0: 63 20 62 75 69 6c 64 55 49 20 7b 7d 20 7b 0a 20  c buildUI {} {. 
2fc0: 20 20 20 77 6d 20 74 69 74 6c 65 20 2e 20 22 54     wm title . "T
2fd0: 6b 2d 42 75 67 7a 22 0a 20 20 20 20 63 61 6e 76  k-Bugz".    canv
2fe0: 61 73 20 2e 63 31 20 2d 77 69 64 74 68 20 34 35  as .c1 -width 45
2ff0: 30 20 2d 68 65 69 67 68 74 20 35 30 30 20 2d 62  0 -height 500 -b
3000: 67 20 62 6c 61 63 6b 20 2d 68 69 67 68 6c 69 67  g black -highlig
3010: 68 74 74 68 69 63 6b 6e 65 73 73 20 30 20 2d 62  htthickness 0 -b
3020: 6f 72 64 65 72 77 69 64 74 68 20 30 0a 20 20 20  orderwidth 0.   
3030: 20 2e 63 31 20 63 72 65 61 74 65 20 74 65 78 74   .c1 create text
3040: 20 31 30 20 31 30 20 2d 61 6e 63 68 6f 72 20 6e   10 10 -anchor n
3050: 77 20 2d 74 65 78 74 20 22 53 63 6f 72 65 3a 22  w -text "Score:"
3060: 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f   -fill white -fo
3070: 6e 74 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20  nt SmallFont.   
3080: 20 2e 63 31 20 63 72 65 61 74 65 20 74 65 78 74   .c1 create text
3090: 20 36 30 20 31 30 20 2d 61 6e 63 68 6f 72 20 6e   60 10 -anchor n
30a0: 77 20 2d 74 61 67 20 22 73 63 6f 72 65 22 20 2d  w -tag "score" -
30b0: 66 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f 6e 74  fill white -font
30c0: 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20 20 2e   SmallFont.    .
30d0: 63 31 20 63 72 65 61 74 65 20 74 65 78 74 20 32  c1 create text 2
30e0: 30 30 20 31 30 20 2d 61 6e 63 68 6f 72 20 6e 77  00 10 -anchor nw
30f0: 20 2d 74 65 78 74 20 22 4c 65 76 65 6c 3a 20 22   -text "Level: "
3100: 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f   -fill white -fo
3110: 6e 74 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20  nt SmallFont.   
3120: 20 2e 63 31 20 63 72 65 61 74 65 20 74 65 78 74   .c1 create text
3130: 20 32 35 30 20 31 30 20 2d 61 6e 63 68 6f 72 20   250 10 -anchor 
3140: 6e 77 20 2d 74 61 67 20 22 6c 65 76 65 6c 22 20  nw -tag "level" 
3150: 2d 66 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f 6e  -fill white -fon
3160: 74 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20 20  t SmallFont.    
3170: 2e 63 31 20 63 72 65 61 74 65 20 74 65 78 74 20  .c1 create text 
3180: 33 37 35 20 31 30 20 2d 61 6e 63 68 6f 72 20 6e  375 10 -anchor n
3190: 77 20 2d 74 65 78 74 20 22 53 68 69 70 73 3a 20  w -text "Ships: 
31a0: 22 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 2d 66  " -fill white -f
31b0: 6f 6e 74 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20  ont SmallFont.  
31c0: 20 20 2e 63 31 20 63 72 65 61 74 65 20 74 65 78    .c1 create tex
31d0: 74 20 34 32 35 20 31 30 20 2d 61 6e 63 68 6f 72  t 425 10 -anchor
31e0: 20 6e 77 20 2d 74 61 67 20 22 73 68 69 70 73 22   nw -tag "ships"
31f0: 20 2d 66 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f   -fill white -fo
3200: 6e 74 20 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20  nt SmallFont.   
3210: 20 2e 63 31 20 63 72 65 61 74 65 20 74 65 78 74   .c1 create text
3220: 20 31 30 20 34 39 35 20 2d 61 6e 63 68 6f 72 20   10 495 -anchor 
3230: 73 77 20 2d 74 61 67 20 22 66 70 73 22 20 2d 66  sw -tag "fps" -f
3240: 69 6c 6c 20 77 68 69 74 65 20 2d 66 6f 6e 74 20  ill white -font 
3250: 53 6d 61 6c 6c 46 6f 6e 74 0a 20 20 20 20 2e 63  SmallFont.    .c
3260: 31 20 63 72 65 61 74 65 20 69 6d 61 67 65 20 32  1 create image 2
3270: 32 35 20 32 35 30 20 2d 61 6e 63 68 6f 72 20 63  25 250 -anchor c
3280: 65 6e 74 65 72 20 2d 69 6d 61 67 65 20 63 61 6d  enter -image cam
3290: 20 2d 74 61 67 73 20 22 63 61 6d 22 0a 20 20 20   -tags "cam".   
32a0: 20 2e 63 31 20 6c 6f 77 65 72 20 22 63 61 6d 22   .c1 lower "cam"
32b0: 0a 20 20 20 20 70 61 63 6b 20 2e 63 31 20 2d 65  .    pack .c1 -e
32c0: 78 70 61 6e 64 20 31 0a 20 20 20 20 62 69 6e 64  xpand 1.    bind
32d0: 20 2e 63 31 20 3c 4b 65 79 50 72 65 73 73 2d 7a   .c1 <KeyPress-z
32e0: 3e 20 7b 73 65 74 20 3a 3a 73 68 69 70 28 78 6d  > {set ::ship(xm
32f0: 29 20 2d 38 7d 0a 20 20 20 20 62 69 6e 64 20 2e  ) -8}.    bind .
3300: 63 31 20 3c 4b 65 79 50 72 65 73 73 2d 78 3e 20  c1 <KeyPress-x> 
3310: 7b 73 65 74 20 3a 3a 73 68 69 70 28 78 6d 29 20  {set ::ship(xm) 
3320: 38 7d 0a 20 20 20 20 66 6f 63 75 73 20 2e 63 31  8}.    focus .c1
3330: 0a 7d 0a 0a 70 72 6f 63 20 62 69 6e 64 4b 65 79  .}..proc bindKey
3340: 73 20 7b 7d 20 7b 0a 20 20 20 20 73 65 74 20 4c  s {} {.    set L
3350: 45 46 54 5f 50 52 45 53 53 20 20 20 20 20 22 3c  EFT_PRESS     "<
3360: 4b 65 79 50 72 65 73 73 2d 4c 65 66 74 3e 22 0a  KeyPress-Left>".
3370: 20 20 20 20 73 65 74 20 4c 45 46 54 5f 52 45 4c      set LEFT_REL
3380: 45 41 53 45 20 20 20 22 3c 4b 65 79 52 65 6c 65  EASE   "<KeyRele
3390: 61 73 65 2d 4c 65 66 74 3e 22 0a 20 20 20 20 73  ase-Left>".    s
33a0: 65 74 20 52 49 47 48 54 5f 50 52 45 53 53 20 20  et RIGHT_PRESS  
33b0: 20 20 22 3c 4b 65 79 50 72 65 73 73 2d 52 69 67    "<KeyPress-Rig
33c0: 68 74 3e 22 0a 20 20 20 20 73 65 74 20 52 49 47  ht>".    set RIG
33d0: 48 54 5f 52 45 4c 45 41 53 45 20 20 22 3c 4b 65  HT_RELEASE  "<Ke
33e0: 79 52 65 6c 65 61 73 65 2d 52 69 67 68 74 3e 22  yRelease-Right>"
33f0: 0a 20 20 20 20 73 65 74 20 46 49 52 45 5f 50 52  .    set FIRE_PR
3400: 45 53 53 20 20 20 20 20 22 3c 4b 65 79 50 72 65  ESS     "<KeyPre
3410: 73 73 2d 43 6f 6e 74 72 6f 6c 5f 4c 3e 22 0a 20  ss-Control_L>". 
3420: 20 20 20 73 65 74 20 46 49 52 45 5f 52 45 4c 45     set FIRE_RELE
3430: 41 53 45 20 20 20 22 3c 4b 65 79 52 65 6c 65 61  ASE   "<KeyRelea
3440: 73 65 2d 43 6f 6e 74 72 6f 6c 5f 4c 3e 22 0a 0a  se-Control_L>"..
3450: 20 20 20 20 73 65 74 20 3a 3a 6b 65 79 53 74 61      set ::keySta
3460: 74 75 73 28 4c 45 46 54 29 20 20 30 0a 20 20 20  tus(LEFT)  0.   
3470: 20 73 65 74 20 3a 3a 6b 65 79 53 74 61 74 75 73   set ::keyStatus
3480: 28 52 49 47 48 54 29 20 30 0a 20 20 20 20 73 65  (RIGHT) 0.    se
3490: 74 20 3a 3a 6b 65 79 53 74 61 74 75 73 28 46 49  t ::keyStatus(FI
34a0: 52 45 29 20 20 30 0a 0a 20 20 20 20 62 69 6e 64  RE)  0..    bind
34b0: 20 2e 63 31 20 24 4c 45 46 54 5f 50 52 45 53 53   .c1 $LEFT_PRESS
34c0: 20 20 20 7b 73 65 74 20 3a 3a 6b 65 79 53 74 61     {set ::keySta
34d0: 74 75 73 28 4c 45 46 54 29 20 31 7d 0a 20 20 20  tus(LEFT) 1}.   
34e0: 20 62 69 6e 64 20 2e 63 31 20 24 52 49 47 48 54   bind .c1 $RIGHT
34f0: 5f 50 52 45 53 53 20 20 7b 73 65 74 20 3a 3a 6b  _PRESS  {set ::k
3500: 65 79 53 74 61 74 75 73 28 52 49 47 48 54 29 20  eyStatus(RIGHT) 
3510: 31 7d 0a 20 20 20 20 62 69 6e 64 20 2e 63 31 20  1}.    bind .c1 
3520: 24 46 49 52 45 5f 50 52 45 53 53 20 20 20 7b 73  $FIRE_PRESS   {s
3530: 65 74 20 3a 3a 6b 65 79 53 74 61 74 75 73 28 46  et ::keyStatus(F
3540: 49 52 45 29 20 31 7d 0a 0a 20 20 20 20 62 69 6e  IRE) 1}..    bin
3550: 64 20 2e 63 31 20 24 4c 45 46 54 5f 52 45 4c 45  d .c1 $LEFT_RELE
3560: 41 53 45 20 20 20 7b 73 65 74 20 3a 3a 6b 65 79  ASE   {set ::key
3570: 53 74 61 74 75 73 28 4c 45 46 54 29 20 30 7d 0a  Status(LEFT) 0}.
3580: 20 20 20 20 62 69 6e 64 20 2e 63 31 20 24 52 49      bind .c1 $RI
3590: 47 48 54 5f 52 45 4c 45 41 53 45 20 20 7b 73 65  GHT_RELEASE  {se
35a0: 74 20 3a 3a 6b 65 79 53 74 61 74 75 73 28 52 49  t ::keyStatus(RI
35b0: 47 48 54 29 20 30 7d 0a 20 20 20 20 62 69 6e 64  GHT) 0}.    bind
35c0: 20 2e 63 31 20 24 46 49 52 45 5f 52 45 4c 45 41   .c1 $FIRE_RELEA
35d0: 53 45 20 20 20 7b 73 65 74 20 3a 3a 6b 65 79 53  SE   {set ::keyS
35e0: 74 61 74 75 73 28 46 49 52 45 29 20 30 7d 0a 0a  tatus(FIRE) 0}..
35f0: 20 20 20 20 62 69 6e 64 20 2e 63 31 20 3c 4b 65      bind .c1 <Ke
3600: 79 2d 70 3e 20 7b 0a 20 20 20 20 20 20 20 20 69  y-p> {.        i
3610: 66 20 7b 5b 2e 63 31 20 66 69 6e 64 20 77 69 74  f {[.c1 find wit
3620: 68 74 61 67 20 22 70 6c 61 79 22 5d 20 6e 65 20  htag "play"] ne 
3630: 22 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ""} {.          
3640: 20 20 64 6f 47 61 6d 65 0a 20 20 20 20 20 20 20    doGame.       
3650: 20 7d 20 65 6c 73 65 69 66 20 7b 5b 2e 63 31 20   } elseif {[.c1 
3660: 66 69 6e 64 20 77 69 74 68 74 61 67 20 22 63 6f  find withtag "co
3670: 6e 74 69 6e 75 65 22 5d 20 6e 65 20 22 22 7d 20  ntinue"] ne ""} 
3680: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  {.            ne
3690: 77 47 61 6d 65 0a 20 20 20 20 20 20 20 20 7d 0a  wGame.        }.
36a0: 20 20 20 20 7d 0a 20 20 20 20 62 69 6e 64 20 2e      }.    bind .
36b0: 63 31 20 3c 4b 65 79 2d 71 3e 20 7b 0a 20 20 20  c1 <Key-q> {.   
36c0: 20 20 20 20 20 69 66 20 7b 5b 2e 63 31 20 66 69       if {[.c1 fi
36d0: 6e 64 20 77 69 74 68 74 61 67 20 22 71 75 69 74  nd withtag "quit
36e0: 22 5d 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20  "] ne ""} {.    
36f0: 20 20 20 20 20 20 20 20 65 78 69 74 53 63 72 69          exitScri
3700: 70 74 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  pt.        } els
3710: 65 69 66 20 7b 5b 2e 63 31 20 66 69 6e 64 20 77  eif {[.c1 find w
3720: 69 74 68 74 61 67 20 22 63 6f 6e 74 69 6e 75 65  ithtag "continue
3730: 22 5d 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20 20  "] ne ""} {.    
3740: 20 20 20 20 20 20 20 20 65 78 69 74 53 63 72 69          exitScri
3750: 70 74 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  pt.        } els
3760: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
3770: 73 65 74 20 3a 3a 67 6c 6f 62 61 6c 28 61 6c 69  set ::global(ali
3780: 76 65 29 20 30 0a 20 20 20 20 20 20 20 20 7d 0a  ve) 0.        }.
3790: 20 20 20 20 7d 0a 7d 0a 0a 6d 61 69 6e 0a            }.}..main.