diff --git a/board.lua b/board.lua index e379fa1..d2cde39 100644 --- a/board.lua +++ b/board.lua @@ -149,6 +149,7 @@ function board:update() if (not was_idle and is_idle) then self:on_idle() end + if (is_idle) self.cursor:update() end function board:draw() diff --git a/checkpoint.lua b/checkpoint.lua index 8b654d5..e503ddb 100644 --- a/checkpoint.lua +++ b/checkpoint.lua @@ -36,4 +36,5 @@ function checkpoint:apply(board) add(board.wells[w].contents,i) end end + board.cursor.grabbed=nil end \ No newline at end of file diff --git a/completion_tracker.lua b/completion_tracker.lua index ca4c109..61d8fff 100644 --- a/completion_tracker.lua +++ b/completion_tracker.lua @@ -7,7 +7,7 @@ end function completion_tracker:reset() for i=0,63 do - dset(i,0) + if (i!=59) dset(i,0) -- don't clear music pref flag end end diff --git a/cursor.lua b/cursor.lua index 9351e02..e4a8911 100644 --- a/cursor.lua +++ b/cursor.lua @@ -10,12 +10,13 @@ function cursor:init(board) self.board=board self.hover_x=self.ruleset.n_slots\2 self.hover_y=1 + self.saved_hover_x_y=nil self.grabbed=nil end function cursor:acceptance_state() + local hover=self:hover_slot() if self.grabbed then - local hover=self:hover_slot() if hover==self.grabbed then return acceptance_state.no_move end @@ -28,7 +29,37 @@ function cursor:acceptance_state() return acceptance_state.would_not_accept end else - return acceptance_state.not_grabbed + if (self.board.slots[hover]:peek()) return acceptance_state.not_grabbed + return acceptance_state.would_not_accept + end +end + +function cursor:save_hover() + self.saved_hover_x_y={self.hover_x,self.hover_y} +end + +function cursor:restore_hover() + self.wants_to_restore_hover=true +end + +function cursor:actually_restore_hover() + if (not self.saved_hover_x_y) return + self.wants_to_restore_hover=false + + -- try restoring hover x + local old_hover_x,old_hover_y=self.hover_x,self.hover_y + self.hover_x,self.hover_y=unpack(self.saved_hover_x_y) + + -- try very hard to be in a valid spot + for i in all{ + function() self.hover_x,self.hover_y=old_hover_x,old_hover_y end, + function() self:move_x(-1) end, + function() self:move_y(1) end, + function() self:move_x(-1) end, + function() self:move_y(-1) end + } do + if (self:acceptance_state()!=acceptance_state.would_not_accept) return + i() end end @@ -38,6 +69,7 @@ function cursor:toggle_grab() if acc==acceptance_state.not_grabbed then if (not self.board.watcher:intercept("grab",slot)) sounds:dire() return if (self.board.slots[slot]:peek()) self.grabbed=slot + self:save_hover() sounds:menu() elseif acc==acceptance_state.would_accept then if (not self.board.watcher:intercept("drop",slot)) sounds:dire() return @@ -46,25 +78,40 @@ function cursor:toggle_grab() tar:add(card) self.grabbed=nil self.board:on_move(card) + self:restore_hover() sounds:menu() elseif acc==acceptance_state.no_move or acc==acceptance_state.would_not_accept then if (not self.board.watcher:intercept("cancel")) sounds:dire() return self.grabbed=nil + self:restore_hover() sounds:menu() else assert(false,"invalid acceptance state") end end +function cursor:update() + if (self.wants_to_restore_hover) self:actually_restore_hover() +end + function cursor:move_x(dx) if (self.hover_y==0) return - self.hover_x+=dx - self.hover_x%=self.ruleset.n_slots -- TODO: Don't hard-code + if (dx==0) return + local orig_x=self.hover_x + while true do + self.hover_x+=dx + self.hover_x%=self.ruleset.n_slots + if (self.hover_x==orig_x) return + if (self:acceptance_state()!=acceptance_state.would_not_accept) return true + end + return end function cursor:move_y(dy) + local old_y=self.hover_y if (self.hover_y==0 and dy==1) self.hover_y=1 if (self.hover_y==1 and dy==-1) self.hover_y=0 + if (self:acceptance_state()==acceptance_state.would_not_accept) if (not self:move_x(-1)) self.hover_y=old_y end function cursor:hover_slot() @@ -84,22 +131,15 @@ function cursor:draw_at(l,i) local card=self:grabbed_card() local acc=self:acceptance_state() - local dx,dy=0,0 - if card and acc!=acceptance_state.would_accept and acc!=acceptance_state.no_move then - dx=flr(sin(time()/2)*2+0.5) - dy=flr(sin(time()/4)+0.5+1) - end - if card then i+=1 local x,y=l:place_card(i) - local card_fg=self.ruleset.deck:draw_card(x+dx,y+dy,card,{rotate=l.rotated}) + local card_fg=self.ruleset.deck:draw_card(x,y,card,{rotate=l.rotated}) local fg=card_fg - if (acc==acceptance_state.would_accept) fg=9 - draw_layout_hint(l,i,fg,false,dx,dy) + draw_layout_hint(l,i,9,false,0,0) else local filled=false if (i<1) i=1 filled=true - draw_layout_hint(l,i,9,filled,dx,dy) + draw_layout_hint(l,i,12,filled,0,0) end end \ No newline at end of file