From 888d0b217836d8e350af973891250ae9b97bb291 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Sat, 20 Aug 2022 23:35:21 +0000 Subject: [PATCH] allow abandoning a puzzle --- .../source/HabitModel.hx | 4 +- .../source/HabitModel.kiss | 16 ++++-- .../source/HabitState.kiss | 56 ++++++++++++------- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.hx b/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.hx index 43500f05..5eb97ca8 100644 --- a/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.hx +++ b/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.hx @@ -33,7 +33,9 @@ typedef RewardFile = { startingPoints: Int, puzzleWidth: Int, puzzleHeight: Int, - piecesPerPoint: Int + piecesPerPoint: Int, + skipped: Bool + }; typedef Puzzle = { diff --git a/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.kiss b/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.kiss index 9c3cf084..2e0ec353 100644 --- a/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.kiss +++ b/projects/flixel-desktop-habit-puzzle-game/source/HabitModel.kiss @@ -3,7 +3,7 @@ (prop :Array intervalEntries []) (prop :Array bonusEntries []) (prop :Array todoEntries []) -(prop :Array rewardFiles []) +(prop :kiss.List rewardFiles []) (defNew [&prop :String textFile] (let [s (Stream.fromFile textFile) @@ -30,12 +30,16 @@ ((when (= lastHeader "FILES") (Some line)) (rewardFiles.push (let [parts (line.split " ") + skipped (case (parts.pop) + ("true" true) + ("false" false) + (otherwise (throw "bad bool"))) piecesPerPoint (Std.parseInt (parts.pop)) puzzleHeight (Std.parseInt (parts.pop)) puzzleWidth (Std.parseInt (parts.pop)) startingPoints (Std.parseInt (parts.pop)) path (parts.join " ")] - (objectWith path startingPoints puzzleWidth puzzleHeight piecesPerPoint)))) + (objectWith path startingPoints puzzleWidth puzzleHeight piecesPerPoint skipped)))) ((Some line) (.push (case lastHeader @@ -141,7 +145,7 @@ "${label.label} $(* "|" label.points)") "/")") (function :String stringifyRewardFile [:RewardFile rewardFile] - "${rewardFile.path} ${rewardFile.startingPoints} ${rewardFile.puzzleWidth} ${rewardFile.puzzleHeight} ${rewardFile.piecesPerPoint}") + "${rewardFile.path} ${rewardFile.startingPoints} ${rewardFile.puzzleWidth} ${rewardFile.puzzleHeight} ${rewardFile.piecesPerPoint} ${rewardFile.skipped}") (method :Void save [] (localVar &mut content "DAILY\n-----\n") @@ -223,5 +227,9 @@ (save)) (method addRewardFile [path startingPoints puzzleWidth puzzleHeight piecesPerPoint] - (rewardFiles.push (objectWith path startingPoints puzzleWidth puzzleHeight piecesPerPoint)) + (rewardFiles.push (objectWith [skipped false] path startingPoints puzzleWidth puzzleHeight piecesPerPoint)) + (save)) + +(method skipRewardFile [] + (set .skipped (last rewardFiles) true) (save)) \ No newline at end of file diff --git a/projects/flixel-desktop-habit-puzzle-game/source/HabitState.kiss b/projects/flixel-desktop-habit-puzzle-game/source/HabitState.kiss index e50628d9..94275c44 100644 --- a/projects/flixel-desktop-habit-puzzle-game/source/HabitState.kiss +++ b/projects/flixel-desktop-habit-puzzle-game/source/HabitState.kiss @@ -135,19 +135,23 @@ // Left and right arrow keys can switch between unlocked puzzles - (unless entryNameText + (unless (or entryNameText (tempWindowIsShown)) (when FlxG.keys.justPressed.LEFT (defAndCall method clearBar (when bar (remove bar) (remove asyncLoop))) - (unless (= rewardFileIndex 0) - (-= rewardFileIndex 1) + (unless (= rewardFileIndex minRewardFile) + --rewardFileIndex + (while .skipped (nth model.rewardFiles rewardFileIndex) + --rewardFileIndex) (refreshModel))) (when FlxG.keys.justPressed.RIGHT (clearBar) (unless (= rewardFileIndex maxRewardFile) - (+= rewardFileIndex 1) + ++rewardFileIndex + (while .skipped (nth model.rewardFiles rewardFileIndex) + ++rewardFileIndex) (refreshModel))))) (prop &mut :FlxSave save null) @@ -195,7 +199,8 @@ (prop &mut lastRewardFileIndex -1) (prop &mut rewardFileIndex 0) -(prop &mut maxRewardFile 0) +(prop &mut :Null minRewardFile null) +(prop &mut :Null maxRewardFile null) (defAlias &ident SCROLL_BOUND_MARGIN (scrollBoundMargin)) @@ -218,11 +223,16 @@ (unless currentRewardFile (set currentRewardFile (nth m.rewardFiles 0)) - (if m.rewardFiles + (cond + ((and m.rewardFiles !.skipped (last m.rewardFiles)) (while (> p .startingPoints (nth m.rewardFiles i)) (set rewardFileIndex i) (set currentRewardFile (nth m.rewardFiles i)) - (set maxRewardFile i) + (unless minRewardFile + (unless .skipped (nth m.rewardFiles i) + (set minRewardFile i))) + (unless .skipped (nth m.rewardFiles i) + (set maxRewardFile i)) (when (>= ++i m.rewardFiles.length) --i (let [lastStartingPoints .startingPoints (nth m.rewardFiles i) @@ -230,8 +240,11 @@ nextStartingPoints (+ lastStartingPoints (Math.ceil (/ TOTAL_PIECES piecesPerPoint)))] (when (> p nextStartingPoints) (set puzzleUnlocked nextStartingPoints)) - (break)))) - (set puzzleUnlocked 0))) + (break))))) + ((and m.rewardFiles .skipped (last m.rewardFiles)) + (set puzzleUnlocked (- p 1))) + (true + (set puzzleUnlocked 0)))) (when m.rewardFiles (makeRewardSprites m p currentRewardFile)) @@ -244,7 +257,20 @@ (set entryWindow.cameras [uiCamera]) (set entryWindow.textColor FlxColor.LIME) (when m.rewardFiles - (_makeText "Puzzle #$(+ 1 rewardFileIndex) / ${model.rewardFiles.length}" (max 0 (- TOTAL_PIECES (* currentRewardFile.piecesPerPoint (- p currentRewardFile.startingPoints)))))) + (_makeText "Puzzle #$(+ 1 rewardFileIndex) / ${model.rewardFiles.length}" (max 0 (- TOTAL_PIECES (* currentRewardFile.piecesPerPoint (- p currentRewardFile.startingPoints))))) + (set entryWindow.textColor FlxColor.GRAY) + (_makeText "{space} Cycle background color" 0 + ->_ + (defAndCall method toggleBackgroundColor + (set save.data.backgroundIndex #{(save.data.backgroundIndex + 1) % backgroundOptions.length;}#) + (save.flush) + (refreshModel))) + (when (= rewardFileIndex (- m.rewardFiles.length 1)) + (_makeText "Abandon this puzzle" 0 + ->_ + (defAndCall method skipPuzzle + (model.skipRewardFile) + (setModel model))))) (set entryWindow.textColor FlxColor.ORANGE) (map (m.activeDailyEntries) makeText) (set entryWindow.textColor FlxColor.GREEN) @@ -255,15 +281,7 @@ (map (m.activeBonusEntries) makeText) (set entryWindow.textColor FlxColor.YELLOW) (map (m.activeTodoEntries) makeText) - (set entryWindow.textColor FlxColor.GRAY) - (when m.rewardFiles - (_makeText "{space} Cycle background color" 0 - ->_ - (defAndCall method toggleBackgroundColor - (set save.data.backgroundIndex #{(save.data.backgroundIndex + 1) % backgroundOptions.length;}#) - (save.flush) - // setModel so the entry text gets remade in inverted/lightened colors when necessary - (refreshModel)))) + (when windowWasShown (entryWindow.show))