From: Jean Privat Date: Wed, 16 Sep 2015 17:11:47 +0000 (-0400) Subject: Merge: Friendz: save states X-Git-Tag: v0.7.8~18 X-Git-Url: http://nitlanguage.org?hp=2d02e7d84f9f3a5fa7265ef1591e11994c26ada1 Merge: Friendz: save states Save the state of the sound and the levels in the data store. If you leave a level and come back, your grid in the level is no more lost Pull-Request: #1715 Reviewed-by: Alexis Laferrière --- diff --git a/contrib/friendz/src/friendz.nit b/contrib/friendz/src/friendz.nit index 9425abe..c0554fe 100644 --- a/contrib/friendz/src/friendz.nit +++ b/contrib/friendz/src/friendz.nit @@ -19,7 +19,6 @@ import realtime import solver import mnit::tileset import app::data_store -import md5 intrude import grid intrude import level @@ -217,11 +216,11 @@ class LevelButton self.over = self.level.fullname if self.level.get_state >= l.l_won then - if game.levels[9].get_state >= l.l_won then self.over += " --- {self.level.score}/{self.level.par}" + if game.levels[9].get_state >= l.l_won then self.over += " --- {self.level.score}/{self.level.gold}" else if self.level.get_state >= l.l_open then - if game.levels[9].get_state >= l.l_open then self.over += " --- ?/{self.level.par}" + if game.levels[9].get_state >= l.l_open then self.over += " --- ?/{self.level.gold}" end - #self.enabled = l.get_state >= l.l_open + self.enabled = l.get_state >= l.l_open or game.cheated end redef fun draw(ctx) @@ -242,7 +241,7 @@ class LevelButton end ctx.blit(game.img[ix,iy], self.x, self.y) - if s == l.l_par then + if s == l.l_gold then ctx.blit(game.img2[7,0], self.x + bw*5/8, self.y-bh*1/8) end ctx.textx(self.level.name, self.x+5, self.y+5, 24, null, null) @@ -730,9 +729,9 @@ class Score end if game.levels[9].get_state >= level.l_won then if level.is_challenge then - ctx.textx("GOAL: {level.par}",self.x,self.y+44,21,"yellow",null) + ctx.textx("GOAL: {level.gold}",self.x,self.y+44,21,"yellow",null) else - ctx.textx("PAR: {level.par}",self.x,self.y+44,21,"yellow",null) + ctx.textx("GOLD: {level.gold}",self.x,self.y+44,21,"yellow",null) end end end @@ -777,7 +776,7 @@ class StatusBar do print "***STATUS** {txt}" self.tmp_txt = txt - self.tmp_txt_ttl = 20 + self.tmp_txt_ttl = 60 self.tmp_txt_color = color end @@ -873,26 +872,6 @@ redef class Game # Font var font = new TileSetFont(app.load_image("deltaforce_font.png"), 16, 17, "ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789.:;!?\"'() -,/") - var xxx = """ - fun save_cookie(name, val:String) do - var days = 365 - var date = new Date() - date.setTime(date.getTime()+(days*24*60*60*1000)) - document.cookie = name+"="+val+"; expires="+date.toGMTString()+"; path=/" - end - - fun read_cookie(name:String):String do - var key = name + "=" - var ca = document.cookie.split(';') - for(var i=0; i 0 then score else null + app.data_store["s{str}"] = if score > 0 then score else null + var saved = game.grid.save + saved_str = saved + app.data_store["g{str}"] = saved + print "SAVE: {name}: {saved}" end + + # The saved player grid (to continue games) + var saved_str: nullable String = null end diff --git a/contrib/friendz/src/grid.nit b/contrib/friendz/src/grid.nit index a097ff5..3a141f6 100644 --- a/contrib/friendz/src/grid.nit +++ b/contrib/friendz/src/grid.nit @@ -191,14 +191,14 @@ class Grid fun save: String do var res = "" - var str = ".#ABCDEFGHI" + var str = ".abcdefghi#ABCDEFGHI" for y in [0..height[ do var rle = 0 var last: nullable Int = null for x in [0..width[ do var t = self.grid[x][y] - var tk = 0 - if t.fixed then tk = t.kind + 1 + var tk = t.kind + if t.fixed then tk += 10 if tk == last and rle<9 then rle += 1 else @@ -243,6 +243,7 @@ class Grid x += 1 else if c == '#' then var t = self.get(x,y) + assert t != null t.fixed = true x += 1 else if c >= 'A' and c <= 'I' then @@ -251,6 +252,11 @@ class Grid t.update(c.ascii-'A'.ascii+1) t.fixed = true x += 1 + else if c >= 'a' and c <= 'i' then + var t = self.get(x,y) + assert t != null + t.update(c.ascii-'a'.ascii+1) + x += 1 else if c >= '1' and c <= '9' then rle = c.to_i else @@ -261,7 +267,7 @@ class Grid if x>0 then y += 1 if x > mx then mx = x if y > my then my = y - if mx<3 or my<3 or mx>=max_width or my>=max_height then + if mx<3 or my<3 or mx>max_width or my>max_height then return false end self.resize(mx,my) diff --git a/contrib/friendz/src/level.nit b/contrib/friendz/src/level.nit index 9d8029e..b09f1f2 100644 --- a/contrib/friendz/src/level.nit +++ b/contrib/friendz/src/level.nit @@ -23,7 +23,7 @@ class Level var ls = code.split(";") self.number = i self.str = ls[0] - self.par = ls[1].to_i + self.gold = ls[1].to_i if ls.length >= 3 then self.status = ls[2] end @@ -47,8 +47,8 @@ class Level # initial grid position var str: String - # top score - var par: Int + # top score to get gold + var gold: Int # Help message if any var status: String = "" @@ -72,32 +72,28 @@ class Level var l_disabled = 1 var l_open = 2 var l_won = 3 - var l_par = 4 + var l_gold = 4 fun get_state: Int do if self.score == 0 then if self.number == 0 or game.levels[self.number-1].score > 0 then return l_open if self.number == 25 and game.levels[19].score > 0 then return l_open else return l_disabled - else if self.score < self.par or not game.levels[9].score > 0 then + else if self.score < self.gold or not game.levels[9].score > 0 then return l_won - else return l_par + else return l_gold end # Returns true if g is a wining condition for the level. fun check_won(g: Grid): Bool do - var w = g.won and (not self.is_challenge or g.number >= self.par) + var w = g.won and (not self.is_challenge or g.number >= self.gold) if not w then return false if g.number > self.score then self.score = g.number - self.save end return true end - - # Save the score of the level - fun save do end end # main game object