@jeremyckahn/farmhand 1.19.30 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +14 -0
  2. package/dist/assets/{index-BdjyHrBP.js → index-Bx-fejeL.js} +16 -12
  3. package/dist/assets/{index-BdjyHrBP.js.map → index-Bx-fejeL.js.map} +1 -1
  4. package/dist/index.html +1 -1
  5. package/dist/service-worker.js +1 -1
  6. package/dist/service-worker.js.map +1 -1
  7. package/package.json +2 -1
  8. package/src/components/AnimatedNumber/AnimatedNumber.test.tsx +69 -1
  9. package/src/components/AnimatedNumber/AnimatedNumber.tsx +28 -29
  10. package/src/components/AppBar/AppBar.tsx +33 -27
  11. package/src/components/Cellar/Keg.tsx +2 -3
  12. package/src/components/Farmhand/Farmhand.context.tsx +9 -0
  13. package/src/components/Farmhand/Farmhand.tsx +1 -1
  14. package/src/components/Farmhand/FarmhandReducers.tsx +6 -1
  15. package/src/components/Farmhand/FarmhandService.ts +23 -3
  16. package/src/components/Farmhand/useFarmhand.ts +34 -4
  17. package/src/components/Forest/Forest.tsx +54 -13
  18. package/src/components/ForestPlot/ForestPlot.test.tsx +73 -0
  19. package/src/components/ForestPlot/ForestPlot.tsx +108 -24
  20. package/src/components/ForestQuickSelect/ForestQuickSelect.tsx +22 -0
  21. package/src/components/Inventory/Inventory.tsx +1 -0
  22. package/src/components/NotificationSystem/NotificationSystem.test.tsx +53 -32
  23. package/src/components/NotificationSystem/NotificationSystem.tsx +20 -9
  24. package/src/components/ProgressBar/ProgressBar.test.tsx +10 -4
  25. package/src/components/ProgressBar/ProgressBar.tsx +44 -13
  26. package/src/components/SearchBar/SearchBar.tsx +4 -3
  27. package/src/components/Shop/Shop.test.tsx +84 -29
  28. package/src/components/Shop/Shop.tsx +69 -15
  29. package/src/components/Stage/Stage.tsx +9 -2
  30. package/src/components/Toolbelt/Toolbelt.test.tsx +42 -3
  31. package/src/components/Toolbelt/Toolbelt.tsx +12 -5
  32. package/src/components/Workshop/WoodChipperTabPanel.tsx +56 -0
  33. package/src/components/Workshop/Workshop.tsx +21 -0
  34. package/src/config.ts +1 -2
  35. package/src/constants.ts +31 -0
  36. package/src/data/__mocks__/maps.ts +1 -0
  37. package/src/data/achievements.test.ts +156 -0
  38. package/src/data/achievements.ts +58 -1
  39. package/src/data/items.ts +1 -1
  40. package/src/data/levels.ts +14 -9
  41. package/src/data/maps.ts +1 -0
  42. package/src/data/recipes.ts +140 -0
  43. package/src/data/shop-inventory.ts +7 -4
  44. package/src/data/tools.ts +21 -2
  45. package/src/data/trees/banana.ts +30 -0
  46. package/src/data/trees/index.ts +1 -0
  47. package/src/data/upgrades.ts +47 -0
  48. package/src/enums.ts +5 -0
  49. package/src/farmhand.d.ts +49 -3
  50. package/src/game-logic/reducers/chopForestPlot.test.ts +47 -0
  51. package/src/game-logic/reducers/chopForestPlot.ts +9 -0
  52. package/src/game-logic/reducers/harvestForestPlot.test.ts +145 -0
  53. package/src/game-logic/reducers/harvestForestPlot.ts +32 -3
  54. package/src/game-logic/reducers/harvestPlot.test.ts +2 -0
  55. package/src/game-logic/reducers/harvestPlot.ts +5 -0
  56. package/src/game-logic/reducers/index.ts +2 -0
  57. package/src/game-logic/reducers/makeRecipe.test.ts +29 -0
  58. package/src/game-logic/reducers/makeRecipe.ts +9 -0
  59. package/src/game-logic/reducers/minePlot.test.ts +1 -0
  60. package/src/game-logic/reducers/mulchForestPlot.test.ts +208 -0
  61. package/src/game-logic/reducers/mulchForestPlot.ts +76 -0
  62. package/src/game-logic/reducers/plantTreeInPlot.test.ts +2 -0
  63. package/src/game-logic/reducers/plantTreeInPlot.ts +5 -0
  64. package/src/game-logic/reducers/processCellar.test.ts +70 -0
  65. package/src/game-logic/reducers/processCellar.ts +32 -2
  66. package/src/game-logic/reducers/processCowFertilizerProduction.test.ts +52 -1
  67. package/src/game-logic/reducers/processCowFertilizerProduction.ts +14 -1
  68. package/src/game-logic/reducers/processForest.test.ts +143 -0
  69. package/src/game-logic/reducers/processForest.ts +59 -8
  70. package/src/game-logic/reducers/processLevelUp.test.ts +51 -0
  71. package/src/game-logic/reducers/processLevelUp.ts +4 -2
  72. package/src/game-logic/reducers/purchaseWoodChipper.test.ts +61 -0
  73. package/src/game-logic/reducers/purchaseWoodChipper.ts +33 -0
  74. package/src/game-logic/reducers/sellItem.test.ts +2 -1
  75. package/src/game-logic/reducers/unlockTool.test.ts +21 -0
  76. package/src/game-logic/reducers/upgradeTool.test.ts +3 -0
  77. package/src/handlers/ui-events.test.ts +36 -0
  78. package/src/handlers/ui-events.tsx +27 -2
  79. package/src/hooks/usePrefersReducedMotion.ts +47 -0
  80. package/src/img/dishes/apple-juice.piskel +1 -0
  81. package/src/img/dishes/apple-juice.png +0 -0
  82. package/src/img/dishes/apple-pie.piskel +1 -0
  83. package/src/img/dishes/banana-bread.piskel +1 -0
  84. package/src/img/dishes/banana-bread.png +0 -0
  85. package/src/img/dishes/banana-cream-pie.piskel +1 -0
  86. package/src/img/dishes/banana-cream-pie.png +0 -0
  87. package/src/img/dishes/grape-syrup.piskel +1 -0
  88. package/src/img/dishes/grape-syrup.png +0 -0
  89. package/src/img/dishes/spicy-apple-jam.piskel +1 -0
  90. package/src/img/dishes/strawberry-jam.piskel +1 -0
  91. package/src/img/dishes/sugar.piskel +1 -0
  92. package/src/img/index.ts +57 -2
  93. package/src/img/items/apple-fruit-growing-1.piskel +1 -0
  94. package/src/img/items/apple-fruit-growing-2.piskel +1 -0
  95. package/src/img/items/apple-fruit-grown.piskel +1 -0
  96. package/src/img/items/apple-sapling.piskel +1 -0
  97. package/src/img/items/apple-tree-dead.piskel +1 -0
  98. package/src/img/items/apple-tree-growing-1.piskel +1 -0
  99. package/src/img/items/apple-tree-growing-2.piskel +1 -0
  100. package/src/img/items/apple-tree-growing-3.piskel +1 -0
  101. package/src/img/items/apple-tree-growing-4.piskel +1 -0
  102. package/src/img/items/apple-tree-grown.piskel +1 -0
  103. package/src/img/items/apple-tree-sapling-planted.piskel +1 -0
  104. package/src/img/items/apple.piskel +1 -0
  105. package/src/img/items/applewood.piskel +1 -0
  106. package/src/img/items/banana-fruit-growing-1.piskel +1 -0
  107. package/src/img/items/banana-fruit-growing-1.png +0 -0
  108. package/src/img/items/banana-fruit-growing-2.piskel +1 -0
  109. package/src/img/items/banana-fruit-growing-2.png +0 -0
  110. package/src/img/items/banana-fruit-growing-3.piskel +1 -0
  111. package/src/img/items/banana-fruit-growing-3.png +0 -0
  112. package/src/img/items/banana-fruit-grown.piskel +1 -0
  113. package/src/img/items/banana-fruit-grown.png +0 -0
  114. package/src/img/items/banana-sapling.piskel +1 -0
  115. package/src/img/items/banana-sapling.png +0 -0
  116. package/src/img/items/banana-tree-dead.piskel +1 -0
  117. package/src/img/items/banana-tree-dead.png +0 -0
  118. package/src/img/items/banana-tree-growing-1.piskel +1 -0
  119. package/src/img/items/banana-tree-growing-1.png +0 -0
  120. package/src/img/items/banana-tree-growing-2.piskel +1 -0
  121. package/src/img/items/banana-tree-growing-2.png +0 -0
  122. package/src/img/items/banana-tree-growing-3.piskel +1 -0
  123. package/src/img/items/banana-tree-growing-3.png +0 -0
  124. package/src/img/items/banana-tree-growing-4.piskel +1 -0
  125. package/src/img/items/banana-tree-growing-4.png +0 -0
  126. package/src/img/items/banana-tree-grown.piskel +1 -0
  127. package/src/img/items/banana-tree-grown.png +0 -0
  128. package/src/img/items/banana-tree-sapling-planted.piskel +1 -0
  129. package/src/img/items/banana-tree-sapling-planted.png +0 -0
  130. package/src/img/items/banana.piskel +1 -0
  131. package/src/img/items/banana.png +0 -0
  132. package/src/img/items/mulch.piskel +1 -0
  133. package/src/img/items/mulch.png +0 -0
  134. package/src/img/items/rainbow-mulch.piskel +1 -0
  135. package/src/img/items/rainbow-mulch.png +0 -0
  136. package/src/img/items/sugarcane-growing1.piskel +1 -0
  137. package/src/img/items/sugarcane-growing2.piskel +1 -0
  138. package/src/img/items/sugarcane-seed.piskel +1 -0
  139. package/src/img/items/sugarcane.piskel +1 -0
  140. package/src/img/items/wood-chips.piskel +1 -0
  141. package/src/img/items/wood-chips.png +0 -0
  142. package/src/img/pixel.piskel +1 -0
  143. package/src/img/plot-states/forest-plot-default.piskel +1 -0
  144. package/src/img/plot-states/mulched-plot.piskel +1 -0
  145. package/src/img/plot-states/mulched-plot.png +0 -0
  146. package/src/img/plot-states/rainbow-mulched-plot.piskel +1 -0
  147. package/src/img/plot-states/rainbow-mulched-plot.png +0 -0
  148. package/src/img/tools/axe-bronze.piskel +1 -0
  149. package/src/img/tools/axe-gold.piskel +1 -0
  150. package/src/img/tools/axe-iron.piskel +1 -0
  151. package/src/img/tools/axe-silver.piskel +1 -0
  152. package/src/img/tools/axe.piskel +1 -0
  153. package/src/img/tools/picker-pole-bronze.piskel +1 -0
  154. package/src/img/tools/picker-pole-bronze.png +0 -0
  155. package/src/img/tools/picker-pole-gold.piskel +1 -0
  156. package/src/img/tools/picker-pole-gold.png +0 -0
  157. package/src/img/tools/picker-pole-iron.piskel +1 -0
  158. package/src/img/tools/picker-pole-iron.png +0 -0
  159. package/src/img/tools/picker-pole-silver.piskel +1 -0
  160. package/src/img/tools/picker-pole-silver.png +0 -0
  161. package/src/img/tools/picker-pole.piskel +1 -0
  162. package/src/img/tools/picker-pole.png +0 -0
  163. package/src/img/ui/floorboard.piskel +1 -0
  164. package/src/img/ui/floorboard.png +0 -0
  165. package/src/img/ui/forest-floor.piskel +1 -0
  166. package/src/img/ui/winter-bg.piskel +1 -0
  167. package/src/strings.ts +13 -0
  168. package/src/templates.ts +66 -11
  169. package/src/test-utils/index.ts +7 -0
  170. package/src/utils/getKegDisplayName.test.ts +17 -0
  171. package/src/utils/getKegDisplayName.ts +10 -0
  172. package/src/utils/getLevelEntitlements.ts +3 -1
  173. package/src/utils/getTreeGrowingPhase.test.ts +28 -0
  174. package/src/utils/getTreeGrowingPhase.ts +2 -2
  175. package/src/utils/getTreeLifeStage.test.ts +34 -0
  176. package/src/utils/getTreeLifeStage.ts +7 -3
  177. package/src/utils/isItemAFarmProduct.test.ts +9 -1
  178. package/src/utils/isItemAFarmProduct.ts +6 -1
  179. package/src/utils/isItemAGrownFruit.ts +4 -0
  180. package/src/utils/transformStateDataForImport.test.ts +62 -5
  181. package/src/utils/transformStateDataForImport.ts +26 -21
  182. /package/src/img/items/{apple-tree-wood.png → applewood.png} +0 -0
package/README.md CHANGED
@@ -124,6 +124,20 @@ In this case, the local app will be using the Production API, database, and pair
124
124
  - Any pre-existing code that does not adhere to this convention should be updated to do so.
125
125
  - Regarding automated tests: [Write tests. Not too many. Mostly integration.](https://kentcdodds.com/blog/write-tests)
126
126
 
127
+ ### Art conventions
128
+
129
+ - Art assets are typically 24x24 pixels. Notable exceptions:
130
+ - Forest tree sprites (e.g. `apple-tree-grown.png`) are 36x72.
131
+ - Forest saplings and plot-state tiles (e.g. `apple-sapling.png`, `mulched-plot.png`) are 36x36.
132
+ - Field plot-state tiles (e.g. `fertilized-plot.png`) are 32x32.
133
+ - UI backgrounds and other one-off assets (e.g. `winter-bg.png`) don't follow this convention at all.
134
+ - It's fine to create art in a program other than Piskel (e.g. Aseprite), but every PNG under `src/img` should still have a matching `.piskel` source file:
135
+ - `npm run create-piskels` generates a `.piskel` file for any PNG under `src/img` that's missing one.
136
+ - Conversely, after editing a `.piskel` file directly, regenerate its PNG with `npm run update-images`.
137
+ - `.piskel` and `.png` files live side by side with matching basenames (e.g. `src/img/items/apple.piskel` / `apple.png`).
138
+ - Art style is inherently subjective, but new assets should stay visually consistent with the game's existing art - bold outlines, minimal/simple shading, and a transparent (not filled) background.
139
+ - Filenames should match the identifier used for that item/tile in the game data (e.g. the `apple` item ID backs `apple.png`/`apple.piskel`, and its `growsInto`/growth-stage IDs back `apple-tree-grown.png`, etc.), so an asset can be traced back to the code that references it.
140
+
127
141
  ### Testing Guidelines
128
142
 
129
143
  When writing tests for Farmhand, please follow the guidelines documented in [`.rules`](.rules). Key points: