From 0e55d75dfd59e4b6fed0a9c8b8535c9a34b5ef06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rebecca=20Ko=CC=88nig?= Date: Sun, 29 Jan 2023 15:12:42 +0100 Subject: [PATCH 1/4] Fix unnecessary list scrolling --- src/main.lua | 3 ++- src/sidebar/create-puzzle.lua | 4 ++-- src/sidebar/options.lua | 7 +++++-- src/sidebar/play-puzzle.lua | 4 ++-- src/sidebar/settings.lua | 4 ++-- src/sidebar/sidebar.lua | 6 +++--- src/ui/list.lua | 10 ++++++---- 7 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main.lua b/src/main.lua index 60dfaed..52a3d6f 100644 --- a/src/main.lua +++ b/src/main.lua @@ -193,9 +193,10 @@ function switch(newScreen, newSidebar, selected, out, onReady) onReady() end end + local same = context.sidebar == newSidebar context.sidebar:leave(context) context.sidebar = newSidebar - context.sidebar:enter(context, selected) + context.sidebar:enter(context, selected, same) end local idleCounter = 0 diff --git a/src/sidebar/create-puzzle.lua b/src/sidebar/create-puzzle.lua index 22d90c1..8907b52 100644 --- a/src/sidebar/create-puzzle.lua +++ b/src/sidebar/create-puzzle.lua @@ -4,7 +4,7 @@ function CreatePuzzleSidebar:init() CreatePuzzleSidebar.super.init(self) end -function CreatePuzzleSidebar:enter(context, selected) +function CreatePuzzleSidebar:enter(context, selected, same) local config = { player = context.player.avatar, menuTitle = "Create new puzzle", @@ -61,5 +61,5 @@ function CreatePuzzleSidebar:enter(context, selected) } } - CreatePuzzleSidebar.super.enter(self, context, config) + CreatePuzzleSidebar.super.enter(self, context, config, nil, nil, same) end diff --git a/src/sidebar/options.lua b/src/sidebar/options.lua index 7e94cf0..3e7b791 100644 --- a/src/sidebar/options.lua +++ b/src/sidebar/options.lua @@ -4,7 +4,7 @@ function OptionsSidebar:init() OptionsSidebar.super.init(self) end -function OptionsSidebar:enter(context, selected) +function OptionsSidebar:enter(context, selected, same) local hintsText = "Hints: " .. HINTS_TEXT[context.player.options.showHints] local timerText = "Timer: " .. ( context.player.options.showTimer and "on" or "off" @@ -93,6 +93,9 @@ function OptionsSidebar:enter(context, selected) OptionsSidebar.super.enter( self, context, - config + config, + nil, + nil, + same ) end diff --git a/src/sidebar/play-puzzle.lua b/src/sidebar/play-puzzle.lua index 2109514..a885b9f 100644 --- a/src/sidebar/play-puzzle.lua +++ b/src/sidebar/play-puzzle.lua @@ -4,7 +4,7 @@ function PlayPuzzleSidebar:init() PlayPuzzleSidebar.super.init(self) end -function PlayPuzzleSidebar:enter(context, selected) +function PlayPuzzleSidebar:enter(context, selected, same) local player = context.player local creator = context.creator local puzzle = context.puzzle @@ -104,7 +104,7 @@ function PlayPuzzleSidebar:enter(context, selected) end end - PlayPuzzleSidebar.super.enter(self, context, config) + PlayPuzzleSidebar.super.enter(self, context, config, nil, nil, same) end function PlayPuzzleSidebar:getTitle(player, creator, puzzle) diff --git a/src/sidebar/settings.lua b/src/sidebar/settings.lua index 3cc9a09..f750dcb 100644 --- a/src/sidebar/settings.lua +++ b/src/sidebar/settings.lua @@ -4,7 +4,7 @@ function SettingsSidebar:init() SettingsSidebar.super.init(self) end -function SettingsSidebar:enter(context, selected) +function SettingsSidebar:enter(context, selected, same) local config = { menuTitle = "Settings", menuItems = { @@ -88,5 +88,5 @@ function SettingsSidebar:enter(context, selected) end, }) - SettingsSidebar.super.enter(self, context, config) + SettingsSidebar.super.enter(self, context, config, nil, nil, same) end diff --git a/src/sidebar/sidebar.lua b/src/sidebar/sidebar.lua index 2f112e8..a2dfbc5 100644 --- a/src/sidebar/sidebar.lua +++ b/src/sidebar/sidebar.lua @@ -22,7 +22,7 @@ function Sidebar:init() self.onSelected = function () end end -function Sidebar:enter(context, config, player, creator) +function Sidebar:enter(context, config, player, creator, same) self.config = config self.menuItems = config.menuItems self.menuTitle = config.menuTitle @@ -44,7 +44,7 @@ function Sidebar:enter(context, config, player, creator) self:add() - local isOpen = context.isSidebarOpen + local isOpen = context.isSidebarOpen self.isOpen = isOpen self:moveTo(isOpen and 0 or -SIDEBAR_WIDTH + 24, 0) self.playerAvatar:enter(config, config.player) @@ -53,7 +53,7 @@ function Sidebar:enter(context, config, player, creator) self.creatorAvatar:moveTo(isOpen and 0 or -SIDEBAR_WIDTH + 24, Sidebar.creatorAvatar.y) self.list:moveTo() self.menuBorder:moveTo(isOpen and 0 or -SIDEBAR_WIDTH + 24, 0) - self.list:enter(context, self.menuItems, self.menuTitle) + self.list:enter(context, self.menuItems, self.menuTitle, same) self.list:select(self.cursor, true) if not context.scrolling then self.list.highlightUpdate = true diff --git a/src/ui/list.lua b/src/ui/list.lua index 7ea2055..0076847 100644 --- a/src/ui/list.lua +++ b/src/ui/list.lua @@ -12,7 +12,7 @@ function List:init(parent) end end -function List:enter(context, menuItems, menuTitle) +function List:enter(context, menuItems, menuTitle, same) self.menuTitle = menuTitle self.menuItems = menuItems self.idleCounter = 0 @@ -24,9 +24,11 @@ function List:enter(context, menuItems, menuTitle) end end - self.cursor = selected - self.position = math.max(1, math.min(#menuItems - 5, selected - 2)) - self.target = self.position + if not same then + self.cursor = selected + self.position = math.max(1, math.min(#menuItems - 5, selected - 2)) + self.target = self.position + end self.textCursor = TextCursor() From 95969b616a8ecfdabfea09da3fb0abeec7801652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rebecca=20Ko=CC=88nig?= Date: Mon, 30 Jan 2023 21:51:42 +0100 Subject: [PATCH 2/4] Add puzzle solution preview --- src/img/preview-table-400-240.png | Bin 0 -> 2224 bytes src/imports.lua | 4 ++ src/main.lua | 17 ++++++-- src/screen/select-creator.lua | 23 ++++++++++ src/screen/select-puzzle.lua | 10 +++-- src/sidebar/select-puzzle.lua | 4 ++ src/sidebar/sidebar.lua | 30 +++++++------ src/ui/collection.lua | 33 ++++++++++---- src/ui/puzzle-preview.lua | 69 ++++++++++++++++++++++++++++++ 9 files changed, 162 insertions(+), 28 deletions(-) create mode 100644 src/img/preview-table-400-240.png create mode 100644 src/screen/select-creator.lua create mode 100644 src/ui/puzzle-preview.lua diff --git a/src/img/preview-table-400-240.png b/src/img/preview-table-400-240.png new file mode 100644 index 0000000000000000000000000000000000000000..bfd9affb33df2d93d4c7c771a1153e72de47d137 GIT binary patch literal 2224 zcmcIm3rtg27(VyVnj7vI7h&B-U|btvk#%efEMu&|l@u!h6efwKn+TMMQU(oADJAqWEU*tyh4mt|QNA-RwLKj-}4 zf6o2?@5{{z+a|TKcC-cn*aU5rybl1TMfWhi4vicsea{8}JS|AFIYK=&{#!#zL@*h+ zxukn}IVI*&bU>Tong%4vU90Q8G~SU7 zQsl}xN);->@q#G73VSIH93D zGVYL@>18}xBNGa6S|1PX%QQH0*=#H2RN-m0;9a46uN)FryJ& zErJZ!6!Y^_zKe<;2eRS@j8ra8a~>g~89fmfFHUVLhfq6Oyl1ztP|%*6v;BKULHu55 zf50?QKKtD4Q=i{M8@?Z(ku;r zdHEdsWz={P+phtM-j@fB{@+;D(##e@Cl`yYF!kuxo$LwoqJB;yx>cHm`-^mx;>O1- zkslOgAyOH%eAB}f@zF(bVw9;!HyuYZ)SalgmR?Z7hhYoFW$Cw&5PJFQzv6JhCW^1C zxd8`%ePr{Sr_snC#n;VC-qqJXTC!)>3!Mwiq^}bq0#EKgE9RsKZmO3Y+J2C+x#&dj zsBw6S48<^2NZ<|{T#WGI^Hd?mh3O=x14xes-kSD7N+8naD@M#a9yw-CKQEVYM|Zu+ zZ9=R!Yv<7@VY5JB$Wr9-p*B?$$D%r0RLsIevion{;H?)}*43iKsAu@_Kf8x+Q_MRT w>`Rs|SZ#1i3IRweS5Xt5ndugK(LQ3^xbKtmyIyhSp+6B26u3=N9T5H5Us+>O{r~^~ literal 0 HcmV?d00001 diff --git a/src/imports.lua b/src/imports.lua index 5475dc4..db5fb4c 100644 --- a/src/imports.lua +++ b/src/imports.lua @@ -29,6 +29,7 @@ import "screen/about" import "screen/create-avatar" import "screen/create-puzzle" import "screen/play-puzzle" +import "screen/select-creator" import "screen/select-puzzle" import "screen/sketch-tutorial" import "screen/solved-puzzle" @@ -73,6 +74,7 @@ import "ui/list" import "ui/menu-border" import "ui/modal" import "ui/player-avatar" +import "ui/puzzle-preview" import "ui/text-cursor" import "ui/time" import "ui/timer" @@ -113,6 +115,8 @@ imgRdk = gfx.image.new("img/rdk") assert(imgRdk, err) imgAbout = gfx.image.new("img/about") assert(imgAbout, err) +imgPreview = gfx.imagetable.new("img/preview") +assert(imgPreview, err) snd1 = {} snd2 = {} diff --git a/src/main.lua b/src/main.lua index 52a3d6f..f793e1c 100644 --- a/src/main.lua +++ b/src/main.lua @@ -4,6 +4,7 @@ import "imports" local aboutScreen = AboutScreen() local createAvatarScreen = CreateAvatarScreen() local createPuzzleScreen = CreatePuzzleScreen() +local selectCreatorScreen = SelectCreatorScreen() local selectPuzzleScreen = SelectPuzzleScreen() local sketchTutorialScreen = SketchTutorialScreen() local solvedPuzzleScreen = SolvedPuzzleScreen() @@ -524,7 +525,7 @@ playPuzzleSidebar.onDeletePuzzle = function () if #context.creator.created > 0 then switch(selectPuzzleScreen, selectPuzzleSidebar, nil, true) else - switch(titleScreen, selectCreatorSidebar, nil, true) + switch(selectCreatorScreen, selectCreatorSidebar, nil, true) end end showModal("Are you sure you want to delete the puzzle \"" .. context.puzzle.title .. "\"?", "Delete") @@ -591,7 +592,11 @@ selectAvatarSidebar.onSelected = function(avatar) end selectCreatorSidebar.onAbort = function() - switch(nil, selectModeSidebar, MODE_PLAY, true) + switch(titleScreen, selectModeSidebar, MODE_PLAY, true) +end + +selectCreatorSidebar.onNavigated = function (creator) + context.screen:setCreator(creator) end selectCreatorSidebar.onSelected = function(creator) @@ -600,7 +605,11 @@ selectCreatorSidebar.onSelected = function(creator) end selectPuzzleSidebar.onAbort = function() - switch(titleScreen, selectCreatorSidebar, context.creator.id, true) + switch(selectCreatorScreen, selectCreatorSidebar, context.creator.id, true) +end + +selectPuzzleSidebar.onNavigated = function (puzzle, preview) + context.screen:setPuzzle(puzzle, preview) end selectPuzzleSidebar.onSelected = function (puzzle) @@ -615,7 +624,7 @@ end selectModeSidebar.onSelected = function(selectedMode) context.mode = selectedMode if context.mode == MODE_PLAY then - switch(nil, selectCreatorSidebar) + switch(selectCreatorScreen, selectCreatorSidebar) elseif context.mode == MODE_CREATE then local puzzle = Puzzle.createEmpty() if context.player.sketch then diff --git a/src/screen/select-creator.lua b/src/screen/select-creator.lua new file mode 100644 index 0000000..2bff4b9 --- /dev/null +++ b/src/screen/select-creator.lua @@ -0,0 +1,23 @@ +class("SelectCreatorScreen").extends(Screen) + +function SelectCreatorScreen:init() + SelectCreatorScreen.super.init(self) + + self.collection = Collection() +end + +function SelectCreatorScreen:enter(context) + self.collection:enter(context) +end + +function SelectCreatorScreen:leave() + self.collection:leave() +end + +function SelectCreatorScreen:setInvertedMode(active) + self.collection:setInvertedMode(active) +end + +function SelectCreatorScreen:setCreator(creator) + self.collection:setCreator(creator) +end diff --git a/src/screen/select-puzzle.lua b/src/screen/select-puzzle.lua index 9740e8e..d3664cf 100644 --- a/src/screen/select-puzzle.lua +++ b/src/screen/select-puzzle.lua @@ -3,13 +3,17 @@ class("SelectPuzzleScreen").extends(Screen) function SelectPuzzleScreen:init() SelectPuzzleScreen.super.init(self) - self.collection = Collection() + self.preview = PuzzlePreview() end function SelectPuzzleScreen:enter(context) - self.collection:enter(context) + self.preview:enter(context) end function SelectPuzzleScreen:leave() - self.collection:leave() + self.preview:leave() +end + +function SelectPuzzleScreen:setPuzzle(puzzle, preview) + self.preview:setPuzzle(puzzle, preview) end diff --git a/src/sidebar/select-puzzle.lua b/src/sidebar/select-puzzle.lua index 75c0a84..d62e876 100644 --- a/src/sidebar/select-puzzle.lua +++ b/src/sidebar/select-puzzle.lua @@ -37,6 +37,10 @@ function SelectPuzzleSidebar:enter(context, selected) local start = self.list.position for i = start, math.min(numCreated, start + 5) do self:addItem(i) + if i == self.list.cursor then + local menuItem = self.menuItems[i] + self.onNavigated(menuItem.ref, menuItem.img) + end end self.list.needsRedraw = true diff --git a/src/sidebar/sidebar.lua b/src/sidebar/sidebar.lua index a2dfbc5..b91abea 100644 --- a/src/sidebar/sidebar.lua +++ b/src/sidebar/sidebar.lua @@ -62,8 +62,9 @@ function Sidebar:enter(context, config, player, creator, same) self:redraw() if isOpen then - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) end end @@ -89,8 +90,9 @@ function Sidebar:cranked(change, acceleratedChange) if self.cursor ~= newCursor then self.cursor = newCursor self.list:select(self.cursor) - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) end self:onCranked() end @@ -101,8 +103,9 @@ function Sidebar:downButtonDown() self.cursor = newCursor self.cursorRaw = newCursor self.list:select(self.cursor) - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) self:onMoved() else playEffect("scrollEnd") @@ -121,8 +124,9 @@ function Sidebar:leftButtonDown() self.cursor = newCursor self.cursorRaw = newCursor self.list:select(self.cursor) - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) self:onMoved() else playEffect("scrollEnd") @@ -141,8 +145,9 @@ function Sidebar:rightButtonDown() self.cursor = newCursor self.cursorRaw = newCursor self.list:select(self.cursor) - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) self:onMoved() else playEffect("scrollEnd") @@ -155,8 +160,9 @@ function Sidebar:upButtonDown() self.cursor = newCursor self.cursorRaw = newCursor self.list:select(self.cursor) - self:onNavigated_(self.menuItems[self.cursor].ref) - self.onNavigated(self.menuItems[self.cursor].ref) + local menuItem = self.menuItems[self.cursor] + self:onNavigated_(menuItem.ref) + self.onNavigated(menuItem.ref, menuItem.img) self:onMoved() else playEffect("scrollEnd") diff --git a/src/ui/collection.lua b/src/ui/collection.lua index 75a8645..52fa0c3 100644 --- a/src/ui/collection.lua +++ b/src/ui/collection.lua @@ -8,28 +8,38 @@ function Collection:init() end function Collection:enter(context) - local player = context.player - local creator = context.creator + self.player = context.player + self:redraw() +end + +function Collection:redraw() + if not self.player or not self.creator then + return + end + + local player = self.player + local creator = self.creator + gfx.lockFocus(self:getImage()) do gfx.setColor(gfx.kColorWhite) gfx.fillRect(0, 0, 400, 240) - gfx.drawText(creator.name .. "’s\nPuzzle Collection", SIDEBAR_WIDTH + 12, 30) + gfx.drawText(creator.name .. "’s\nPuzzle Collection", SIDEBAR_WIDTH + 12, 16) gfx.setColor(gfx.kColorBlack) - gfx.drawLine(SIDEBAR_WIDTH + 10, 65, 400 - 10, 65) - if creator.id == context.player.id then - gfx.drawText("Created: " .. #creator.created, SIDEBAR_WIDTH + 12, 74) + gfx.drawLine(SIDEBAR_WIDTH + 10, 51, 400 - 10, 51) + if creator.id == player.id then + gfx.drawText("Created: " .. #creator.created, SIDEBAR_WIDTH + 12, 60) else - gfx.drawText("Solved: " .. player:getNumPlayedBy(creator) .. " / " .. #creator.created, SIDEBAR_WIDTH + 12, 74) + gfx.drawText("Solved: " .. player:getNumPlayedBy(creator) .. " / " .. #creator.created, SIDEBAR_WIDTH + 12, 60) end if player.options.showTimer then local timeSpent = (player:getTimeSpentWith(creator) + 30) // 60 - gfx.drawText(string.format("Solve time: %dh %dm", timeSpent // 60, timeSpent % 60), SIDEBAR_WIDTH + 12, 96) + gfx.drawText(string.format("Solve time: %dh %dm", timeSpent // 60, timeSpent % 60), SIDEBAR_WIDTH + 12, 82) end if creator.createdOn then - gfx.drawTextAligned("Created " .. creator.createdOn, 400 - 10, 221, kTextAlignment.right) + gfx.drawText("Created " .. creator.createdOn, SIDEBAR_WIDTH + 12, 221) end end gfx.unlockFocus() @@ -40,3 +50,8 @@ end function Collection:leave() self:remove() end + +function Collection:setCreator(creator) + self.creator = creator + self:redraw() +end diff --git a/src/ui/puzzle-preview.lua b/src/ui/puzzle-preview.lua new file mode 100644 index 0000000..f44f8fb --- /dev/null +++ b/src/ui/puzzle-preview.lua @@ -0,0 +1,69 @@ +class("PuzzlePreview").extends(gfx.sprite) + +function PuzzlePreview:init() + PuzzlePreview.super.init(self, gfx.image.new(400, 240, gfx.kColorWhite)) + + self:setCenter(0, 0) + self:setZIndex(Z_INDEX_TITLE) +end + +function PuzzlePreview:enter(context) + self.player = context.player + self.creator = context.creator + self:redraw() +end + +function PuzzlePreview:redraw() + if not self.creator or not self.puzzle then + return + end + + local player = self.player + local creator = self.creator + local puzzle = self.puzzle + + gfx.lockFocus(self:getImage()) + do + imgPreview:drawImage(puzzle.rotation and 2 or 1, 0, 0) + + local timeSpent = player:hasPlayedId(puzzle.id, creator) + + gfx.drawText((player.id == creator.id or timeSpent) and puzzle.title or "???", SIDEBAR_WIDTH + 12, 16) + + if player.options.showTimer then + if timeSpent then + gfx.drawText(string.format("Solve time: %dm %ds", timeSpent // 60, timeSpent % 60), SIDEBAR_WIDTH + 12, 44) + end + end + + if self.preview then + if puzzle.rotation == 1 then + gfx.setClipRect(SIDEBAR_WIDTH + 59, 92, 62, 92) + self.preview:drawScaled(SIDEBAR_WIDTH + 35, 81, 6) + elseif puzzle.rotation == 2 then + gfx.setClipRect(SIDEBAR_WIDTH + 59, 92, 62, 92) + self.preview:drawScaled(SIDEBAR_WIDTH + 29, 81, 6) + else + gfx.setClipRect(SIDEBAR_WIDTH + 44, 107, 92, 62) + self.preview:drawScaled(SIDEBAR_WIDTH + 32, 84, 6) + end + end + end + gfx.unlockFocus() + self:moveTo(0, 0) + self:add() +end + +function PuzzlePreview:leave() + self:remove() +end + +function PuzzlePreview:setInvertedMode(active) + self:setImageDrawMode(active and gfx.kDrawModeInverted or gfx.kDrawModeCopy) +end + +function PuzzlePreview:setPuzzle(puzzle, preview) + self.puzzle = puzzle + self.preview = preview + self:redraw() +end From bad27303647255ccd0ac8b8722d050bf8ca9aa42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rebecca=20Ko=CC=88nig?= Date: Sat, 4 Feb 2023 08:57:31 +0100 Subject: [PATCH 3/4] Fix glitch when pressing button after launch --- src/sidebar/sidebar.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sidebar/sidebar.lua b/src/sidebar/sidebar.lua index b91abea..52f98eb 100644 --- a/src/sidebar/sidebar.lua +++ b/src/sidebar/sidebar.lua @@ -170,6 +170,9 @@ function Sidebar:upButtonDown() end function Sidebar:AButtonDown() + if self.animator then + return + end local item = self.menuItems[self.cursor] if item.disabled then if item.disabledText then @@ -188,6 +191,9 @@ function Sidebar:AButtonDown() end function Sidebar:BButtonDown() + if self.animator then + return + end playEffect("back") self.onAbort() end From a7f67f5c7fc6b9853c950e0c69a98b56ee319f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rebecca=20Ko=CC=88nig?= Date: Sat, 4 Feb 2023 09:03:08 +0100 Subject: [PATCH 4/4] Update buildNumber and version to 2.1.0 --- src/constants.lua | 2 +- src/pdxinfo | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/constants.lua b/src/constants.lua index 9017bf7..8253581 100644 --- a/src/constants.lua +++ b/src/constants.lua @@ -1,4 +1,4 @@ -VERSION = "2.0.2" +VERSION = "2.1.0" CELL = 16 TOP_NUMBER_HEIGHT = 14 diff --git a/src/pdxinfo b/src/pdxinfo index 32be84a..09b24b6 100644 --- a/src/pdxinfo +++ b/src/pdxinfo @@ -3,5 +3,5 @@ author=RDK description=Playdate’s #1 nonogram game bundleID=net.monometric.sketch-share-solve imagePath=launcherAssets/ -version=2.0.2 -buildNumber=200020 +version=2.1.0 +buildNumber=201000