From 2ad6a0bc3ad0a88195f002fd032c032cd1f133a8 Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Sat, 10 Feb 2024 17:44:38 -0800 Subject: [PATCH] Add state manager and ironman mode --- board.lua | 8 ++++++++ main.lua | 31 ++++--------------------------- main.p8 | 3 +++ progression.lua | 1 - state_gameround.lua | 42 ++++++++++++++++++++++++++++++++++++++++++ state_ironman.lua | 27 +++++++++++++++++++++++++++ state_manager.lua | 34 ++++++++++++++++++++++++++++++++++ 7 files changed, 118 insertions(+), 28 deletions(-) create mode 100644 state_gameround.lua create mode 100644 state_ironman.lua create mode 100644 state_manager.lua diff --git a/board.lua b/board.lua index 4ceffb4..23b9a95 100644 --- a/board.lua +++ b/board.lua @@ -85,6 +85,14 @@ function board:on_move() self:find_automove() end +function board:is_won() + if (not self:can_take_input()) return false + for s=1,#self.slots do + if (self.slots[s]:peek()) return false + end + return true +end + function board:find_automove() for s=1,#self.slots do local top=self.slots[s]:peek() diff --git a/main.lua b/main.lua index fcd5a66..372dc7d 100644 --- a/main.lua +++ b/main.lua @@ -3,37 +3,14 @@ add(modules,main) function main:init() extcmd("rec") - self.board=board:new(progression[1]) + self.state_manager=state_manager:new() -- instantiate one global + self.state_manager:push(state_ironman:new()) end function main:update() - self.board:update() - if self.board:can_take_input() then - if (btnp(0)) self.board.cursor:move_x(-1) - if (btnp(1)) self.board.cursor:move_x(1) - 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() - if (btnp(5)) self.board:undo() - end + self.state_manager:update() end function main:draw() - cls(13) - self.board:draw() - -- bg - pal(13,-3,1) - - -- arcana - -- pal(1,0,1) - pal(15,-9,1) - - -- suits - pal(4,-11,1) -- first suit - pal(12,12,1) - pal(2,-8,1) - pal(3,-5,1) - - -- pal(8,-9,1) - -- pal(14,8,1) + self.state_manager:draw() end diff --git a/main.p8 b/main.p8 index 06e5114..9812438 100644 --- a/main.p8 +++ b/main.p8 @@ -13,6 +13,9 @@ __lua__ #include progression.lua #include seed_constants.lua #include seeds.lua +#include state_manager.lua +#include state_gameround.lua +#include state_ironman.lua #include main.lua --[[ diff --git a/progression.lua b/progression.lua index be1415f..97c366a 100644 --- a/progression.lua +++ b/progression.lua @@ -1,5 +1,4 @@ progression={ - ruleset:new(11,5,10,25,"l7"), -- level 1 ruleset:new(5,1,9,0), -- by test: always winnable -- level 2 diff --git a/state_gameround.lua b/state_gameround.lua new file mode 100644 index 0000000..f3e1793 --- /dev/null +++ b/state_gameround.lua @@ -0,0 +1,42 @@ +state_gameround=klass() +function state_gameround:init(ruleset) + self.board=board:new(ruleset) +end +function state_gameround:enter() end +function state_gameround:exit() end + +function state_gameround:suspend() end +function state_gameround:reenter() end + +function state_gameround:update() + self.board:update() + if self.board:can_take_input() then + if (btnp(0)) self.board.cursor:move_x(-1) + if (btnp(1)) self.board.cursor:move_x(1) + 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() + if (btnp(5)) self.board:undo() + end + if (self.board:is_won()) self.done=true +end + +function state_gameround:draw() + cls(13) + self.board:draw() + -- bg + pal(13,-3,1) + + -- arcana + -- pal(1,0,1) + pal(15,-9,1) + + -- suits + pal(4,-11,1) -- first suit + pal(12,12,1) + pal(2,-8,1) + pal(3,-5,1) + + -- pal(8,-9,1) + -- pal(14,8,1) +end \ No newline at end of file diff --git a/state_ironman.lua b/state_ironman.lua new file mode 100644 index 0000000..6cdacbd --- /dev/null +++ b/state_ironman.lua @@ -0,0 +1,27 @@ +state_ironman=klass() +function state_ironman:init(ruleset) + self.level=1 +end + +function state_ironman:enter() self:on_enter() end +function state_ironman:exit() end + +function state_ironman:reenter() self:on_enter() end +function state_ironman:suspend() end + +function state_ironman:on_enter() + self.done=true + local level=self.level + self.level+=1 + if level <= #progression then + print("adding another state") + main.state_manager:push(state_gameround:new(progression[level])) + end +end + +function state_ironman:update() + assert(false,"wtf") +end +function state_ironman:draw() + assert(false,"wtf2") +end \ No newline at end of file diff --git a/state_manager.lua b/state_manager.lua new file mode 100644 index 0000000..bd1ef87 --- /dev/null +++ b/state_manager.lua @@ -0,0 +1,34 @@ +state_manager=klass() +function state_manager:init() + self._states={} +end +function state_manager:push(state) + local top=self:peek() + add(self._states,state) + if (top) top:suspend(state) + state:enter(top) +end +function state_manager:pop() + local top=deli(self._states,#self._states) + if (not top) return + + local new_top=self:peek() + top:exit(new_top) + if (new_top) new_top:reenter(top) + return top +end +function state_manager:peek() + return self._states[#self._states] +end +function state_manager:update() + local state=self:peek() + if (state) state:update() + while true do + local state=self:peek() + if state and state.done then self:pop() else break end + end +end +function state_manager:draw() + local state=self:peek() + if (state) state:draw() +end \ No newline at end of file