diff --git a/projects/habit-puzzle-game/Project.xml b/projects/habit-puzzle-game/Project.xml
index ef55b4f4..527b8a3e 100644
--- a/projects/habit-puzzle-game/Project.xml
+++ b/projects/habit-puzzle-game/Project.xml
@@ -33,6 +33,7 @@
+
diff --git a/projects/habit-puzzle-game/source/HabitState.hx b/projects/habit-puzzle-game/source/HabitState.hx
index 5404ee54..b8167c41 100644
--- a/projects/habit-puzzle-game/source/HabitState.hx
+++ b/projects/habit-puzzle-game/source/HabitState.hx
@@ -1,16 +1,21 @@
package;
+import flash.display.BitmapData;
+import haxe.io.Path;
import flixel.FlxG;
import flixel.FlxState;
import flixel.group.FlxGroup;
import flixel.FlxSprite;
import flixel.util.FlxColor;
import flixel.text.FlxText;
+import flixel.math.FlxRandom;
+import flixel.math.FlxPoint;
import kiss.Prelude;
import kiss.List;
import kiss_tools.KeyShortcutHandler;
import HabitModel;
import flixel.input.keyboard.FlxKey;
+import hx.strings.Strings;
@:build(kiss.Kiss.build())
class HabitState extends FlxState {}
diff --git a/projects/habit-puzzle-game/source/HabitState.kiss b/projects/habit-puzzle-game/source/HabitState.kiss
index 05cbc50f..282c0b3a 100644
--- a/projects/habit-puzzle-game/source/HabitState.kiss
+++ b/projects/habit-puzzle-game/source/HabitState.kiss
@@ -1,19 +1,70 @@
(method &override :Void create [] (super.create))
(method &override :Void update [:Float elapsed]
(super.update elapsed)
+ // Hold left-click to hide the habit text and see the image clearly:
+ (when entryTexts (if FlxG.mouse.pressed (remove entryTexts) (add entryTexts)))
+ // Handle keyboard input:
(let [:FlxKey id (FlxG.keys.firstJustPressed)]
(unless (= id -1)
(shortcutHandler.handleKey (.toLowerCase (id.toString))))))
(prop &mut :FlxTypedGroup entryTexts null)
+(prop &mut :FlxTypedGroup rewardBlockers null)
(prop &mut :KeyShortcutHandler shortcutHandler null)
(prop &mut :HabitModel model null)
+
+(var PUZZLE_WIDTH 15)
+(var PUZZLE_HEIGHT 10)
+(var TOTAL_PIECES (* PUZZLE_WIDTH PUZZLE_HEIGHT))
+(prop &mut :FlxSprite rewardSprite null)
+
(method setModel [m]
(set model m)
- ~(m.totalPoints)
(set shortcutHandler (new KeyShortcutHandler))
+ (let [p (m.totalPoints)
+ &mut i 0
+ &mut currentRewardFile (first m.rewardFiles)]
+ // Find, load, and add the current reward image as big as possible:
+ (until (< p currentRewardFile.startingPoints)
+ (if (>= ++i m.rewardFiles.length)
+ (break)
+ (set currentRewardFile (nth m.rewardFiles i))))
+ (when rewardSprite
+ (remove rewardSprite))
+ (set rewardSprite (new FlxSprite 0 0 (BitmapData.fromFile (joinPath (Path.directory m.textFile) currentRewardFile.path))))
+ (rewardSprite.setGraphicSize FlxG.width 0)
+ (rewardSprite.updateHitbox)
+ (when (> rewardSprite.height FlxG.height)
+ (rewardSprite.setGraphicSize 0 FlxG.height))
+ (rewardSprite.updateHitbox)
+ (rewardSprite.screenCenter)
+ (add rewardSprite)
+
+ (when rewardBlockers
+ (remove rewardBlockers))
+ (set rewardBlockers (new FlxTypedGroup))
+ (add rewardBlockers)
+
+ (let [PIECE_WIDTH
+ (/ rewardSprite.width PUZZLE_WIDTH)
+ PIECE_HEIGHT
+ (/ rewardSprite.height PUZZLE_HEIGHT)
+ :Array blockerPoints []]
+ (doFor x (range PUZZLE_WIDTH)
+ (doFor y (range PUZZLE_HEIGHT)
+ (blockerPoints.push (new FlxPoint (+ rewardSprite.x (* x PIECE_WIDTH)) (+ rewardSprite.y (* y PIECE_HEIGHT))))))
+ // Cover it up with (TOTAL_PIECES - p) black squares placed randomly by choosing and removing from a zipped coordinate list
+ (let [r (new FlxRandom (Strings.hashCode currentRewardFile.path))]
+ (r.shuffle blockerPoints)
+ (doFor i (range (- (+ TOTAL_PIECES currentRewardFile.startingPoints) p))
+ (let [pos (nth blockerPoints i)
+ s (new FlxSprite pos.x pos.y)]
+ (s.makeGraphic (Math.ceil PIECE_WIDTH) (Math.ceil PIECE_HEIGHT) FlxColor.BLACK)
+ (rewardBlockers.add s))))))
+
+
(when entryTexts (remove entryTexts))
(set entryTexts (new FlxTypedGroup))
(set textY 0)
@@ -29,7 +80,7 @@
(let [label (HabitModel.activeLabel e)]
(shortcutHandler.registerItem label.label e)))
- **(set shortcutHandler.onBadKey ->:Void [_ _] {})
+ (set shortcutHandler.onBadKey ->:Void [_ _] {})
(set shortcutHandler.onSelectItem ->:Void [:Entry e]
(let [label (HabitModel.activeLabel e)]
**(TODO reveal a piece of the current puzzle)