diff --git a/assets/maps š£/MINIMAL_TEMPLATE.tmx b/assets/maps š£/MINIMAL_TEMPLATE.tmx
new file mode 100644
index 000000000..6633aef7d
--- /dev/null
+++ b/assets/maps š£/MINIMAL_TEMPLATE.tmx
@@ -0,0 +1,193 @@
+
+
diff --git a/assets/maps š£/crop_spritesheets/carrots_spritesheet.png b/assets/maps š£/crop_spritesheets/carrots_spritesheet.png
new file mode 100644
index 000000000..81c34ca64
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/carrots_spritesheet.png differ
diff --git a/assets/maps š£/crop_spritesheets/corn_spritesheet.png b/assets/maps š£/crop_spritesheets/corn_spritesheet.png
new file mode 100644
index 000000000..00ac4477f
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/corn_spritesheet.png differ
diff --git a/assets/maps š£/crop_spritesheets/lettuces_spritesheet.png b/assets/maps š£/crop_spritesheets/lettuces_spritesheet.png
new file mode 100644
index 000000000..74db34c8d
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/lettuces_spritesheet.png differ
diff --git a/assets/maps š£/crop_spritesheets/potatos_spritesheet.png b/assets/maps š£/crop_spritesheets/potatos_spritesheet.png
new file mode 100644
index 000000000..047ef8c98
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/potatos_spritesheet.png differ
diff --git a/assets/maps š£/crop_spritesheets/pumpkins_spritesheet.png b/assets/maps š£/crop_spritesheets/pumpkins_spritesheet.png
new file mode 100644
index 000000000..75aebfed2
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/pumpkins_spritesheet.png differ
diff --git a/assets/maps š£/crop_spritesheets/tomatoes_spritesheet.png b/assets/maps š£/crop_spritesheets/tomatoes_spritesheet.png
new file mode 100644
index 000000000..376b57e60
Binary files /dev/null and b/assets/maps š£/crop_spritesheets/tomatoes_spritesheet.png differ
diff --git a/assets/maps š£/crops_corn.tsx b/assets/maps š£/crops_corn.tsx
new file mode 100644
index 000000000..fbe99fa65
--- /dev/null
+++ b/assets/maps š£/crops_corn.tsx
@@ -0,0 +1,196 @@
+ xml version = "1.0" encoding = "UTF-8" ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/maps š£/novafarma_clean.tmx b/assets/maps š£/novafarma_clean.tmx
new file mode 100644
index 000000000..13b3f280d
--- /dev/null
+++ b/assets/maps š£/novafarma_clean.tmx
@@ -0,0 +1,216 @@
+
+
diff --git a/novafarma.tiled-session b/novafarma.tiled-session
index aa23109da..bc1622a7c 100644
--- a/novafarma.tiled-session
+++ b/novafarma.tiled-session
@@ -1,5 +1,5 @@
{
- "activeFile": "assets/maps/TownSquare.json",
+ "activeFile": "assets/maps š£/novafarma_clean.tmx",
"expandedProjectPaths": [
"assets/maps"
],
@@ -8,6 +8,55 @@
"": {
"scaleInDock": 1
},
+ "assets/maps š£/01_Ground.tsx": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/02_Obstacles.tsx": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/03_Fences.tsx": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/04_Buildings.tsx": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/05_Tools_Items.tsx": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/fresh_workspace.tmx": {
+ "scale": 0.23156249999999998,
+ "selectedLayer": 1,
+ "viewCenter": {
+ "x": 641.2955465587045,
+ "y": -187.8542510121457
+ }
+ },
+ "assets/maps š£/novafarma_clean.tmx": {
+ "scale": 0.5452604166666667,
+ "selectedLayer": 4,
+ "viewCenter": {
+ "x": 624.4722514089215,
+ "y": 1015.1112809246345
+ }
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_carrots": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_corn": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_lettuces": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_potatos": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_pumpkins": {
+ "scaleInDock": 1
+ },
+ "assets/maps š£/novafarma_clean.tmx#crops_tomatoes": {
+ "scaleInDock": 1
+ },
"assets/maps/01_Ground.tsx": {
"scaleInDock": 1
},
@@ -182,11 +231,13 @@
},
"last.externalTilesetPath": "/Users/davidkotnik/repos/novafarma/assets/maps",
"openFiles": [
- "assets/maps/testni_travnik.tmx",
- "assets/maps/TownSquare.json"
+ "assets/maps š£/fresh_workspace.tmx",
+ "assets/maps š£/novafarma_clean.tmx"
],
"project": "novafarma.tiled-project",
"recentFiles": [
+ "assets/maps š£/fresh_workspace.tmx",
+ "assets/maps š£/novafarma_clean.tmx",
"assets/maps/testni_travnik.tmx",
"assets/maps/TownSquare.json",
"assets/maps/NovaFarma.json",
diff --git a/scripts/create_crop_spritesheets.py b/scripts/create_crop_spritesheets.py
new file mode 100644
index 000000000..bec9614da
--- /dev/null
+++ b/scripts/create_crop_spritesheets.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python3
+"""
+Create Tiled-compatible spritesheets from Faza 1 crop sprites
+Combines all season/stage sprites into single PNG files for easy Tiled import
+"""
+
+from PIL import Image
+import os
+from pathlib import Path
+
+# Base path
+CROPS_DIR = Path("/Users/davidkotnik/repos/novafarma/assets/crops/faza1")
+OUTPUT_DIR = Path("/Users/davidkotnik/repos/novafarma/assets/maps š£/crop_spritesheets")
+
+# Ensure output directory exists
+OUTPUT_DIR.mkdir(exist_ok=True)
+
+# Crop types
+CROPS = ['corn', 'tomatoes', 'carrots', 'potatos', 'lettuces', 'pumpkins']
+SEASONS = ['spring', 'summer', 'fall', 'winter']
+STAGES = list(range(1, 9)) # 1-8
+
+TILE_SIZE = 32
+
+def create_spritesheet(crop_name):
+ """
+ Create 8x4 spritesheet (8 stages Ć 4 seasons)
+ Layout:
+ Row 1: Spring stages 1-8
+ Row 2: Summer stages 1-8
+ Row 3: Fall stages 1-8
+ Row 4: Winter stages 1-8
+ """
+ # Create blank 256x128 image (8 tiles Ć 32px wide, 4 tiles Ć 32px tall)
+ spritesheet = Image.new('RGBA', (256, 128), (0, 0, 0, 0))
+
+ crop_path = CROPS_DIR / crop_name
+ if not crop_path.exists():
+ print(f"ā Crop folder not found: {crop_path}")
+ return None
+
+ missing_count = 0
+
+ for season_idx, season in enumerate(SEASONS):
+ season_path = crop_path / season
+
+ if not season_path.exists():
+ print(f" ā ļø Season folder not found: {season_path}")
+ continue
+
+ for stage_idx, stage in enumerate(STAGES):
+ sprite_path = season_path / f"stage{stage}.png"
+
+ if sprite_path.exists():
+ try:
+ sprite = Image.open(sprite_path).convert('RGBA')
+
+ # Resize if needed
+ if sprite.size != (TILE_SIZE, TILE_SIZE):
+ sprite = sprite.resize((TILE_SIZE, TILE_SIZE), Image.NEAREST)
+
+ # Calculate position
+ x = stage_idx * TILE_SIZE
+ y = season_idx * TILE_SIZE
+
+ # Paste into spritesheet
+ spritesheet.paste(sprite, (x, y))
+
+ except Exception as e:
+ print(f" ā Error loading {sprite_path}: {e}")
+ missing_count += 1
+ else:
+ print(f" ā ļø Missing: {sprite_path}")
+ missing_count += 1
+
+ # Save spritesheet
+ output_path = OUTPUT_DIR / f"{crop_name}_spritesheet.png"
+ spritesheet.save(output_path)
+
+ print(f"ā
Created: {output_path} ({missing_count} missing sprites)")
+
+ return output_path
+
+def main():
+ print("=" * 60)
+ print("šØ CREATING CROP SPRITESHEETS FOR TILED")
+ print("=" * 60)
+
+ for crop in CROPS:
+ print(f"\nš¦ Processing: {crop}")
+ create_spritesheet(crop)
+
+ print("\n" + "=" * 60)
+ print(f"ā
COMPLETE! Spritesheets saved to:")
+ print(f" {OUTPUT_DIR}")
+ print("=" * 60)
+
+ print("\nš TO USE IN TILED:")
+ print("1. Map ā Add New Tileset")
+ print("2. Browse to created spritesheet")
+ print("3. Tile Width/Height: 32px")
+ print("4. Columns: 8")
+ print("5. Click OK!")
+
+if __name__ == "__main__":
+ main()