Basic animations
This commit is contained in:
parent
a5c76557d2
commit
bdc8c91078
26
animator.lua
Normal file
26
animator.lua
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
animator=klass()
|
||||||
|
function animator:init()
|
||||||
|
self.operations={}
|
||||||
|
end
|
||||||
|
function animator:update()
|
||||||
|
while true do
|
||||||
|
if (#self.operations==0) return
|
||||||
|
local op=self.operations[1]
|
||||||
|
if op:update() then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
deli(self.operations,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function animator:idle()
|
||||||
|
return #self.operations==0
|
||||||
|
end
|
||||||
|
function animator:add(op)
|
||||||
|
add(self.operations,op)
|
||||||
|
end
|
||||||
|
function animator:draw()
|
||||||
|
for i=#self.operations,1,-1 do
|
||||||
|
self.operations[i]:draw()
|
||||||
|
end
|
||||||
|
end
|
59
board.lua
59
board.lua
@ -3,6 +3,7 @@ board=klass()
|
|||||||
function board:init(ruleset)
|
function board:init(ruleset)
|
||||||
self.ruleset=ruleset
|
self.ruleset=ruleset
|
||||||
self.cursor=cursor:new(self)
|
self.cursor=cursor:new(self)
|
||||||
|
self.animator=animator:new()
|
||||||
self.slots={}
|
self.slots={}
|
||||||
self.wells={}
|
self.wells={}
|
||||||
|
|
||||||
@ -52,7 +53,8 @@ function board:deal()
|
|||||||
for i=1,#self.ruleset.deck.aces do
|
for i=1,#self.ruleset.deck.aces do
|
||||||
local well=self.wells[i]
|
local well=self.wells[i]
|
||||||
local ace=self.ruleset.deck.aces[i]
|
local ace=self.ruleset.deck.aces[i]
|
||||||
well:add(ace)
|
well:add(ace) -- temporarily, so would_accept will work
|
||||||
|
self:animate_move_ace_to_well(ace,i)
|
||||||
available[ace]=false
|
available[ace]=false
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -69,6 +71,11 @@ function board:deal()
|
|||||||
if (not skip) add(eligible_bottom_row,card)
|
if (not skip) add(eligible_bottom_row,card)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- let the animation install the aces for real
|
||||||
|
for w in all(self.wells) do
|
||||||
|
w:clear()
|
||||||
|
end
|
||||||
|
|
||||||
function i_to_slot(i)
|
function i_to_slot(i)
|
||||||
if (i<n_usable_slots\2) return i+1
|
if (i<n_usable_slots\2) return i+1
|
||||||
return i+2
|
return i+2
|
||||||
@ -93,18 +100,20 @@ function board:deal()
|
|||||||
for i=1,#eligible do
|
for i=1,#eligible do
|
||||||
local ix=i_to_slot((i-1)%n_usable_slots)
|
local ix=i_to_slot((i-1)%n_usable_slots)
|
||||||
local slot=self.slots[ix]
|
local slot=self.slots[ix]
|
||||||
slot:add(eligible[i])
|
self:animate_move_new_card_to_slot(eligible[i],ix)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function board:on_idle()
|
||||||
|
self:find_automove()
|
||||||
|
end
|
||||||
|
|
||||||
function board:on_move()
|
function board:on_move()
|
||||||
-- TODO: Make checkpoint
|
-- TODO: Make checkpoint
|
||||||
while true do
|
self:find_automove()
|
||||||
if (not self:_on_move_1()) break
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function board:_on_move_1()
|
function board:find_automove()
|
||||||
for s=1,#self.slots do
|
for s=1,#self.slots do
|
||||||
local top=self.slots[s]:peek()
|
local top=self.slots[s]:peek()
|
||||||
if top then
|
if top then
|
||||||
@ -112,7 +121,8 @@ function board:_on_move_1()
|
|||||||
if w<=self.ruleset.n_suits and self.slots[self.ruleset.n_slots+1]:peek()!=nil then
|
if w<=self.ruleset.n_suits and self.slots[self.ruleset.n_slots+1]:peek()!=nil then
|
||||||
-- the top wells are blocked
|
-- the top wells are blocked
|
||||||
elseif self.wells[w]:would_accept(top) then
|
elseif self.wells[w]:would_accept(top) then
|
||||||
self.wells[w]:add(self.slots[s]:pop())
|
self:animate_and_move_to_well(s,w)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -120,6 +130,19 @@ function board:_on_move_1()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function board:can_take_input()
|
||||||
|
return self.animator:idle()
|
||||||
|
end
|
||||||
|
|
||||||
|
function board:update()
|
||||||
|
local was_idle=self.animator:idle()
|
||||||
|
self.animator:update()
|
||||||
|
local is_idle=self.animator:idle()
|
||||||
|
if (not was_idle and is_idle) then
|
||||||
|
self:on_idle()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function board:draw()
|
function board:draw()
|
||||||
for w_ix=1,#self.wells do
|
for w_ix=1,#self.wells do
|
||||||
local w=self.wells[w_ix]
|
local w=self.wells[w_ix]
|
||||||
@ -131,7 +154,6 @@ function board:draw()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function forall_slots(cb)
|
local function forall_slots(cb)
|
||||||
for s_ix=1,#self.slots do
|
for s_ix=1,#self.slots do
|
||||||
local s=self.slots[s_ix]
|
local s=self.slots[s_ix]
|
||||||
@ -151,13 +173,17 @@ function board:draw()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
local hover_slot=self.cursor:hover_slot()
|
self.animator:draw()
|
||||||
forall_slots(function(x,y,s_ix,s,l,n)
|
|
||||||
if hover_slot==s_ix then
|
if self.animator:idle() then
|
||||||
local x,y=l:place_card(n+1)
|
local hover_slot=self.cursor:hover_slot()
|
||||||
self.cursor:draw_at(x,y)
|
forall_slots(function(x,y,s_ix,s,l,n)
|
||||||
end
|
if hover_slot==s_ix then
|
||||||
end)
|
local x,y=l:place_card(n+1)
|
||||||
|
self.cursor:draw_at(x,y)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
slot=klass()
|
slot=klass()
|
||||||
@ -202,4 +228,7 @@ function well:would_accept(new)
|
|||||||
end
|
end
|
||||||
function well:add(card)
|
function well:add(card)
|
||||||
add(self.contents,card)
|
add(self.contents,card)
|
||||||
|
end
|
||||||
|
function well:clear()
|
||||||
|
self.contents={}
|
||||||
end
|
end
|
68
board_animations.lua
Normal file
68
board_animations.lua
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
function board:animate_move_ace_to_well(card, well)
|
||||||
|
local slot_layout=self.ruleset.layouts:slot(
|
||||||
|
self.ruleset.n_slots\2+1
|
||||||
|
)
|
||||||
|
local well_layout=self.ruleset.layouts:well(well)
|
||||||
|
|
||||||
|
local start_x,start_y=slot_layout:place_card(1)
|
||||||
|
local end_x,end_y=well_layout:place_card(1) -- index shouldn't matter
|
||||||
|
|
||||||
|
local _self=self
|
||||||
|
self:_animate_move_card(
|
||||||
|
card,function() _self.wells[well]:add(card) end,
|
||||||
|
start_x,start_y,function() return end_x,end_y end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function board:animate_move_new_card_to_slot(card, slot)
|
||||||
|
local src_layout=self.ruleset.layouts:slot(self.ruleset.n_slots\2+1)
|
||||||
|
local dst_layout=self.ruleset.layouts:slot(slot)
|
||||||
|
local start_x,start_y=src_layout:place_card(1)
|
||||||
|
|
||||||
|
local _self=self
|
||||||
|
self:_animate_move_card(
|
||||||
|
card,function() _self.slots[slot]:add(card) end,
|
||||||
|
start_x,start_y,function()
|
||||||
|
return dst_layout:place_card(#_self.slots[slot].contents+1)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function board:animate_and_move_to_well(slot, well)
|
||||||
|
local slot_layout=self.ruleset.layouts:slot(slot)
|
||||||
|
local well_layout=self.ruleset.layouts:well(well)
|
||||||
|
local start_x,start_y=slot_layout:place_card(#self.slots[slot].contents)
|
||||||
|
local end_x,end_y=well_layout:place_card(1) -- index shouldn't matter
|
||||||
|
|
||||||
|
local card=self.slots[slot]:pop()
|
||||||
|
|
||||||
|
local _self=self
|
||||||
|
self:_animate_move_card(
|
||||||
|
card,function() _self.wells[well]:add(card) end,
|
||||||
|
start_x,start_y,function() return end_x,end_y end
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function board:_animate_move_card(card,on_end,start_x,start_y,compute_end)
|
||||||
|
local frame=0
|
||||||
|
local progress=0.0
|
||||||
|
|
||||||
|
local anim_obj={}
|
||||||
|
|
||||||
|
local end_x,end_y=start_x,start_y
|
||||||
|
local _self=self
|
||||||
|
function anim_obj:update()
|
||||||
|
if (frame==0) end_x,end_y=compute_end()
|
||||||
|
frame+=1
|
||||||
|
progress=frame/7
|
||||||
|
if (progress>=1.0) on_end() return false
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
function anim_obj:draw()
|
||||||
|
local x=start_x+(end_x-start_x)*progress
|
||||||
|
local y=start_y+(end_y-start_y)*progress
|
||||||
|
_self.ruleset.deck:draw_card(x,y,card,false)
|
||||||
|
end
|
||||||
|
|
||||||
|
self.animator:add(anim_obj)
|
||||||
|
end
|
14
main.lua
14
main.lua
@ -2,15 +2,19 @@ main={}
|
|||||||
add(modules,main)
|
add(modules,main)
|
||||||
|
|
||||||
function main:init()
|
function main:init()
|
||||||
|
extcmd("rec")
|
||||||
self.board=board:new(progression[1])
|
self.board=board:new(progression[1])
|
||||||
end
|
end
|
||||||
|
|
||||||
function main:update()
|
function main:update()
|
||||||
if (btnp(0)) self.board.cursor:move_x(-1)
|
self.board:update()
|
||||||
if (btnp(1)) self.board.cursor:move_x(1)
|
if self.board:can_take_input() then
|
||||||
if (btnp(2)) self.board.cursor:move_y(-1)
|
if (btnp(0)) self.board.cursor:move_x(-1)
|
||||||
if (btnp(3)) self.board.cursor:move_y(1)
|
if (btnp(1)) self.board.cursor:move_x(1)
|
||||||
if (btnp(4)) self.board.cursor:toggle_grab()
|
if (btnp(2)) self.board.cursor:move_y(-1)
|
||||||
|
if (btnp(3)) self.board.cursor:move_y(1)
|
||||||
|
if (btnp(4)) self.board.cursor:toggle_grab()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function main:draw()
|
function main:draw()
|
||||||
|
2
main.p8
2
main.p8
@ -2,7 +2,9 @@ pico-8 cartridge // http://www.pico-8.com
|
|||||||
version 41
|
version 41
|
||||||
__lua__
|
__lua__
|
||||||
#include engine.lua
|
#include engine.lua
|
||||||
|
#include animator.lua
|
||||||
#include board.lua
|
#include board.lua
|
||||||
|
#include board_animations.lua
|
||||||
#include cursor.lua
|
#include cursor.lua
|
||||||
#include layout.lua
|
#include layout.lua
|
||||||
#include ruleset.lua
|
#include ruleset.lua
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
progression={
|
progression={
|
||||||
-- level 1
|
-- level 1
|
||||||
ruleset:new(5,1,9,0),
|
--ruleset:new(5,1,9,0),
|
||||||
-- level 2
|
-- level 2
|
||||||
-- ruleset:new(5,2,9,0),
|
-- ruleset:new(5,2,9,0),
|
||||||
-- level 3
|
-- level 3
|
||||||
@ -10,7 +10,7 @@ progression={
|
|||||||
-- level 5
|
-- level 5
|
||||||
-- ruleset:new(9,3,11,18),
|
-- ruleset:new(9,3,11,18),
|
||||||
-- fortune's foundation
|
-- fortune's foundation
|
||||||
-- ruleset:new(11,4,13,22)
|
ruleset:new(11,4,13,22)
|
||||||
-- harder than fortune's foundation
|
-- harder than fortune's foundation
|
||||||
-- ruleset:new(11,5,10,25)
|
-- ruleset:new(11,5,10,25)
|
||||||
}
|
}
|
@ -84,7 +84,7 @@ function ruleset:generate_deck()
|
|||||||
local bg,shadowbg
|
local bg,shadowbg
|
||||||
if meta.suit=='a' then
|
if meta.suit=='a' then
|
||||||
bg,shadowbg=1,1
|
bg,shadowbg=1,1
|
||||||
if (shadow) bg,shadowbg=1,0
|
if (shadow) bg,shadowbg=1,1
|
||||||
if (is_extreme) bg,shadowbg=8,8
|
if (is_extreme) bg,shadowbg=8,8
|
||||||
else
|
else
|
||||||
bg,shadowbg=7,7
|
bg,shadowbg=7,7
|
||||||
|
Loading…
Reference in New Issue
Block a user