1 require 'animator_helper'
12 def specific_move!(piece, src, dst, opts = {})
13 path = if piece and piece.type == :knight and (not opts[:adjust])
18 move!(src, dst, path, opts)
21 def warp(state, opts = { :instant => true })
24 state.board.each_square do |p|
25 new_piece = state.board[p]
26 old_item = @board.items[p]
30 res << appear_on!(p, new_piece, opts)
31 elsif new_piece != old_item.name
32 res << morph_on!(p, new_piece, opts)
35 res << disappear_on!(p, opts) if old_item
42 def forward(state, move, opts = {})
43 piece = state.board[move.dst]
44 capture = disappear_on! move.dst
46 actual_move = if move.src.nil?
48 @board.items[move.dst] = opts[:dropped]
49 movement opts[:dropped], nil, move.dst, Path::Linear
50 elsif move.respond_to?(:dropped)
51 appear_on! move.dst, move.dropped
54 specific_move! piece, move.src, move.dst, opts
57 extra = if move.type == :king_side_castling
58 specific_move! piece, move.dst + Point.new(1, 0), move.dst - Point.new(1, 0)
59 elsif move.type == :queen_side_castling
60 specific_move! piece, move.dst - Point.new(2, 0), move.dst + Point.new(1, 0)
63 rest = warp(state, :instant => false)
64 main = group(capture, actual_move, extra)
69 def back(state, move, opts = {})
70 actual_move = if move.src.nil?
71 disappear_on! move.dst
73 piece = state.board[move.src]
74 specific_move! piece, move.dst, move.src
77 extra = if move.type == :king_side_castling
78 specific_move! piece, move.dst - Point.new(1, 0), move.dst + Point.new(1, 0)
79 elsif move.type == :queen_side_castling
80 specific_move! piece, move.dst + Point.new(1, 0), move.dst - Point.new(2, 0)
82 rest = warp(state, :instant => false)
84 main = group(actual_move, extra)