def store(self): """ Store the game state in persistent storage """ assert self.uuid is not None user = User.current() if user is None: # No current user: can't store game assert False return gm = GameModel(id = self.uuid) gm.set_player(self.player_index, user.id()) gm.set_player(1 - self.player_index, None) gm.rack0 = self.state._racks[0].contents() gm.rack1 = self.state._racks[1].contents() gm.score0 = self.state.scores()[0] gm.score1 = self.state.scores()[1] gm.to_move = len(self.moves) % 2 gm.over = self.state.is_game_over() movelist = [] for player, m in self.moves: mm = MoveModel() coord, tiles, score = m.summary(self.state.board()) mm.coord = coord mm.tiles = tiles mm.score = score movelist.append(mm) gm.moves = movelist gm.put()
def _store_locked(self): """ Store the game after having acquired the object lock """ assert self.uuid is not None gm = GameModel(id = self.uuid) gm.timestamp = self.timestamp gm.ts_last_move = self.ts_last_move gm.set_player(0, self.player_ids[0]) gm.set_player(1, self.player_ids[1]) gm.irack0 = self.initial_racks[0] gm.irack1 = self.initial_racks[1] gm.rack0 = self.state.rack(0) gm.rack1 = self.state.rack(1) gm.over = self.is_over() sc = self.final_scores() # Includes adjustments if game is over gm.score0 = sc[0] gm.score1 = sc[1] gm.to_move = len(self.moves) % 2 gm.robot_level = self.robot_level gm.prefs = self._preferences tile_count = 0 movelist = [] best_word = [None, None] best_word_score = [0, 0] player = 0 for m in self.moves: mm = MoveModel() coord, tiles, score = m.move.summary(self.state.board()) if coord: # Regular move: count the tiles actually laid down tile_count += m.move.num_covers() # Keep track of best words laid down by each player if score > best_word_score[player]: best_word_score[player] = score best_word[player] = tiles mm.coord = coord mm.tiles = tiles mm.score = score mm.rack = m.rack mm.timestamp = m.ts movelist.append(mm) player = 1 - player gm.moves = movelist gm.tile_count = tile_count # Update the database entity gm.put() # Storing a game that is now over: update the player statistics as well if self.is_over(): pid_0 = self.player_ids[0] pid_1 = self.player_ids[1] u0 = User.load(pid_0) if pid_0 else None u1 = User.load(pid_1) if pid_1 else None if u0: mod_0 = u0.adjust_highest_score(sc[0], self.uuid) mod_0 |= u0.adjust_best_word(best_word[0], best_word_score[0], self.uuid) if mod_0: # Modified: store the updated user entity u0.update() if u1: mod_1 = u1.adjust_highest_score(sc[1], self.uuid) mod_1 |= u1.adjust_best_word(best_word[1], best_word_score[1], self.uuid) if mod_1: # Modified: store the updated user entity u1.update()
def _store_locked(self): """ Store the game after having acquired the object lock """ assert self.uuid is not None gm = GameModel(id=self.uuid) gm.timestamp = self.timestamp gm.ts_last_move = self.ts_last_move gm.set_player(0, self.player_ids[0]) gm.set_player(1, self.player_ids[1]) gm.irack0 = self.initial_racks[0] gm.irack1 = self.initial_racks[1] gm.rack0 = self.state.rack(0) gm.rack1 = self.state.rack(1) gm.over = self.is_over() sc = self.final_scores() # Includes adjustments if game is over gm.score0 = sc[0] gm.score1 = sc[1] gm.to_move = len(self.moves) % 2 gm.robot_level = self.robot_level gm.prefs = self._preferences tile_count = 0 movelist = [] best_word = [None, None] best_word_score = [0, 0] player = 0 for m in self.moves: mm = MoveModel() coord, tiles, score = m.move.summary(self.state) if coord: # Regular move: count the tiles actually laid down tile_count += m.move.num_covers() # Keep track of best words laid down by each player if score > best_word_score[player]: best_word_score[player] = score best_word[player] = tiles mm.coord = coord mm.tiles = tiles mm.score = score mm.rack = m.rack mm.timestamp = m.ts movelist.append(mm) player = 1 - player gm.moves = movelist gm.tile_count = tile_count # Update the database entity gm.put() # Storing a game that is now over: update the player statistics as well if self.is_over(): pid_0 = self.player_ids[0] pid_1 = self.player_ids[1] u0 = User.load(pid_0) if pid_0 else None u1 = User.load(pid_1) if pid_1 else None if u0: mod_0 = u0.adjust_highest_score(sc[0], self.uuid) mod_0 |= u0.adjust_best_word(best_word[0], best_word_score[0], self.uuid) if mod_0: # Modified: store the updated user entity u0.update() if u1: mod_1 = u1.adjust_highest_score(sc[1], self.uuid) mod_1 |= u1.adjust_best_word(best_word[1], best_word_score[1], self.uuid) if mod_1: # Modified: store the updated user entity u1.update()