contrib/friendz: use `app:data_store` to keep best scores
[nit.git] / contrib / friendz / src / friendz.nit
index e745040..949a2cf 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
@@ -1151,14 +1152,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 +1227,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 +1243,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 +1251,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 +1269,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 +1648,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