Merge: lib/github: introduces Github hook events
[nit.git] / contrib / friendz / src / friendz.nit
index e745040..2dd8d80 100644 (file)
@@ -17,6 +17,8 @@ import mnit
 import realtime
 import solver
 import mnit::tileset
+import app::data_store
+import md5
 
 intrude import grid
 intrude import level
@@ -140,7 +142,6 @@ class TextButton
        var textx: Int
 
        redef fun draw(ctx) do
-               var x = self.x
                if self.toggleable then
                        var w
                        if self.toggled or not self.enabled then w = 6 else w = 7
@@ -834,7 +835,7 @@ redef class Display
        fun measureText(str: String, height: Int): Int
        do
                var font = app.game.font
-               return str.length * (app.game.font.width + app.game.font.hspace)
+               return str.length * (font.width + font.hspace.to_i)
        end
 
        # displays a debug rectangle
@@ -1081,8 +1082,8 @@ redef class Game
                level = null
                var i = levels.first
                for l in levels do
-                       if l.get_state == l.l_open then break
                        i = l
+                       if l.get_state == l.l_open then break
                end
                entities.push(new StartButton(self, i))
        end
@@ -1143,7 +1144,8 @@ redef class Game
                end
                var ev = lastev
                if ev isa Event then
-                       display.blit(img[4,0],ev.offset_x-42,ev.offset_y-6)
+                       # Cursor, kept for debugging
+                       #display.blit(img[4,0],ev.offset_x-42,ev.offset_y-6)
                end
                dirty_all = false
        end
@@ -1151,14 +1153,9 @@ redef class Game
        # Update all game entities.
        fun step do
                if solver != null and not solver_pause then
-                       for i in [0..solver_steps[ do
-                               if solver.step then
-                                       solver_pause = true
-                                       break
-                               end
-                       end
-                       solver.dump
-                       if solver.is_over then solver = null
+                       if solver.run_steps(solver_steps) != null then solver_pause = true
+                       print solver.to_s
+                       if not solver.is_running then solver = null
                end
                for g in entities do
                        g.update
@@ -1231,7 +1228,7 @@ redef class Game
        end
 
        # Current solver, if any
-       var solver: nullable Solver = null
+       var solver: nullable BacktrackSolver[Grid, Action] = null
 
        # Is the solver paused?
        var solver_pause = false
@@ -1247,7 +1244,7 @@ redef class Game
                        edit_grid(grid)
                else if kc == "s" then
                        if solver == null then
-                               solver = new Solver(grid)
+                               solver = (new FriendzProblem(grid)).solve
                                solver_pause = false
                        else
                                solver_pause = not solver_pause
@@ -1255,10 +1252,10 @@ redef class Game
                        #solver.step
                else if kc == "d" then
                        if solver == null then
-                               solver = new Solver(grid)
+                               solver = (new FriendzProblem(grid)).solve
                                solver_pause = true
                        else
-                               solver.step
+                               solver.run_steps(1)
                        end
                else if kc == "+" then
                        solver_steps += 100
@@ -1273,6 +1270,18 @@ redef class Game
                        end
                end
        end
+
+       redef fun load_levels
+       do
+               super
+
+               for level in levels do
+                       var score = app.data_store["s{level.str.md5}"]
+                       if score isa Int then
+                               level.score = score
+                       end
+               end
+       end
 end
 
 # The spash title image
@@ -1640,3 +1649,10 @@ redef class KeyEvent
                return "unknown"
        end
 end
+
+redef class Level
+       redef fun save
+       do
+               app.data_store["s{str.md5}"] = if score > 0 then score else null
+       end
+end