← Back to context

Comment by zzo38computer

2 years ago

Here is the updated code. Push D to destroy the selected white piece (if it meets the criteria for being destroyed).

  ; Echo Chess
  
  (InputXY)
  
  (Control
    (INIT $Cursor 1 1 0 0 Create =@cur)
  )
  
  ($Cursor
    Player
    (Image "Cursor0" "Cursor1")
    (DefaultImage ())
    (Density -10)
    (CREATE LOOP 0 1 50 Animate)
  )
  
  ($Tile
    (Image "Tile0" "Tile1")
    (Density 10)
    (INIT Loc + 1 band =Image)
    (CLICK @cur ,ObjBelow #Move Loc ,Send . 1)
  )
  
  ($White
    Input
    (Image "P" "N" "B" "R" "Q" "K")
    (CLICK @cur Loc ,MoveTo)
    (#Move
      ,:movable
      if
        Arg1 Arg2 MoveTo .
        Arg3 if
          From ,Image =Image
          From ,Destroy .
          (=P $Black) lnot if WinLevel then
        then
        @cur Loc ,MoveTo .
      then
    )
    (:movable
      Image (case
        (0 :pawn)
        (1 :knight)
        (2 :bishop)
        (3 :rook)
        (4 :queen)
        (5 :king)
      )
    )
    (:pawn Yloc Arg2 1 + eq Xloc Arg1 Delta Arg3 eq land)
    (:knight Xloc Arg1 Delta dup * Yloc Arg2 Delta dup * + 5 eq)
    (:bishop Xloc Arg1 Delta Yloc Arg2 Delta eq if =:queen else 0 then)
    (:rook Xloc Arg1 Delta Yloc Arg2 Delta land if 0 else =:queen then)
    (:queen From Seek =%d Loc begin %d NewXY over over ObjTopAt dup From eq if . . ret then ,Class $Tile ne until . . 0)
    (:king From Chebyshev 1 eq)
    (#Destroy
      From Self ne if
        From #Move Loc 1 ,SendEx .
      then
      Destroyed lnot
    )
    ('D
      @cur Coloc if
        $White #Destroy Loc BroadcastAnd .
      then
    )
  )
  
  ($Black
    (Image "PB" "NB" "BB" "RB" "QB" "KB")
    (CLICK @cur ,ObjBelow #Move Loc 1 ,SendEx . 1)
  )

It is also possible to add more pieces e.g. Chinese cannon, or other kind of changes if desired.