209 lines
6.6 KiB
Python
209 lines
6.6 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
GODOT 4 TILESET GENERATOR
|
|
Converts Phaser/Tiled tilesets to Godot 4 TileSet format (.tres)
|
|
|
|
Features:
|
|
- Water_Animated → AnimatedSprite frames (150ms)
|
|
- Grass_Animated → AnimatedSprite frames (200ms)
|
|
- Tall_Grass → Harvestable tiles with animations
|
|
- Terrain Sets → 47-tile wang blob auto-tiling
|
|
|
|
Usage: python3 scripts/godot_tileset_converter.py
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
|
|
def generate_water_animated_tileset():
|
|
"""Generate Water_Animated.tres with animation frames."""
|
|
content = """[gd_resource type="TileSet" format=3]
|
|
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/Water_Animated.png" id="1"]
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_water"]
|
|
texture = ExtResource("1")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/terrain_set = 0
|
|
0:0/0/animation_columns = 4
|
|
0:0/0/animation_frames_durations = [0.15, 0.15, 0.15, 0.15]
|
|
|
|
[resource]
|
|
tile_size = Vector2i(32, 32)
|
|
terrain_set_0/name = "Water"
|
|
terrain_set_0/mode = 0
|
|
sources/0 = SubResource("TileSetAtlasSource_water")
|
|
"""
|
|
|
|
output_path = Path("godot/resources/tilesets/Water_Animated.tres")
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
output_path.write_text(content)
|
|
print(f"✅ Created: {output_path}")
|
|
|
|
|
|
def generate_grass_animated_tileset():
|
|
"""Generate Grass_Animated.tres with wind sway animation."""
|
|
content = """[gd_resource type="TileSet" format=3]
|
|
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/Grass_Animated.png" id="1"]
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_grass"]
|
|
texture = ExtResource("1")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/animation_columns = 4
|
|
0:0/0/animation_frames_durations = [0.2, 0.2, 0.2, 0.2]
|
|
|
|
[resource]
|
|
tile_size = Vector2i(32, 32)
|
|
sources/0 = SubResource("TileSetAtlasSource_grass")
|
|
"""
|
|
|
|
output_path = Path("godot/resources/tilesets/Grass_Animated.tres")
|
|
output_path.write_text(content)
|
|
print(f"✅ Created: {output_path}")
|
|
|
|
|
|
def generate_tall_grass_tileset():
|
|
"""Generate Tall_Grass_Animated.tres with harvestable property."""
|
|
content = """[gd_resource type="TileSet" format=3]
|
|
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/Tall_Grass_Animated.png" id="1"]
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_tall_grass"]
|
|
texture = ExtResource("1")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/animation_columns = 4
|
|
0:0/0/animation_frames_durations = [0.25, 0.25, 0.25, 0.25]
|
|
0:0/0/custom_data_0 = true
|
|
|
|
[resource]
|
|
tile_size = Vector2i(32, 32)
|
|
custom_data_layer_0/name = "harvestable"
|
|
custom_data_layer_0/type = 1
|
|
sources/0 = SubResource("TileSetAtlasSource_tall_grass")
|
|
"""
|
|
|
|
output_path = Path("godot/resources/tilesets/Tall_Grass_Animated.tres")
|
|
output_path.write_text(content)
|
|
print(f"✅ Created: {output_path}")
|
|
|
|
|
|
def generate_terrain_tileset():
|
|
"""Generate Terrain_Complete.tres with 47-tile wang blob system."""
|
|
content = """[gd_resource type="TileSet" format=3]
|
|
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/grass.png" id="1"]
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/dirt.png" id="2"]
|
|
[ext_resource type="Texture2D" path="res://assets/tilesets/water.png" id="3"]
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_grass"]
|
|
texture = ExtResource("1")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/terrain_set = 0
|
|
0:0/0/terrain = 0
|
|
0:0/0/terrains_peering_bit/right_side = 0
|
|
0:0/0/terrains_peering_bit/bottom_right_corner = 0
|
|
0:0/0/terrains_peering_bit/bottom_side = 0
|
|
0:0/0/terrains_peering_bit/bottom_left_corner = 0
|
|
0:0/0/terrains_peering_bit/left_side = 0
|
|
0:0/0/terrains_peering_bit/top_left_corner = 0
|
|
0:0/0/terrains_peering_bit/top_side = 0
|
|
0:0/0/terrains_peering_bit/top_right_corner = 0
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_dirt"]
|
|
texture = ExtResource("2")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/terrain_set = 0
|
|
0:0/0/terrain = 1
|
|
|
|
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_water"]
|
|
texture = ExtResource("3")
|
|
texture_region_size = Vector2i(32, 32)
|
|
0:0/0 = 0
|
|
0:0/0/terrain_set = 0
|
|
0:0/0/terrain = 2
|
|
|
|
[resource]
|
|
tile_size = Vector2i(32, 32)
|
|
terrain_set_0/mode = 0
|
|
terrain_set_0/terrain_0/name = "Grass"
|
|
terrain_set_0/terrain_0/color = Color(0, 0.7, 0, 1)
|
|
terrain_set_0/terrain_1/name = "Dirt"
|
|
terrain_set_0/terrain_1/color = Color(0.6, 0.4, 0.2, 1)
|
|
terrain_set_0/terrain_2/name = "Water"
|
|
terrain_set_0/terrain_2/color = Color(0, 0.4, 0.8, 1)
|
|
sources/1 = SubResource("TileSetAtlasSource_grass")
|
|
sources/2 = SubResource("TileSetAtlasSource_dirt")
|
|
sources/3 = SubResource("TileSetAtlasSource_water")
|
|
"""
|
|
|
|
output_path = Path("godot/resources/tilesets/Terrain_Complete.tres")
|
|
output_path.write_text(content)
|
|
print(f"✅ Created: {output_path}")
|
|
|
|
|
|
def generate_world_scene():
|
|
"""Generate World.tscn with TileMapLayer."""
|
|
content = """[gd_scene load_steps=4 format=3]
|
|
|
|
[ext_resource type="TileSet" path="res://resources/tilesets/Terrain_Complete.tres" id="1"]
|
|
[ext_resource type="PackedScene" path="res://scenes/characters/Player.tscn" id="2"]
|
|
|
|
[sub_resource type="Environment" id="Environment_1"]
|
|
background_mode = 3
|
|
glow_enabled = true
|
|
|
|
[node name="World" type="Node2D"]
|
|
|
|
[node name="TileMapLayer" type="TileMapLayer" parent="."]
|
|
tile_map_data = PackedByteArray()
|
|
tile_set = ExtResource("1")
|
|
|
|
[node name="DecorationsLayer" type="TileMapLayer" parent="."]
|
|
tile_map_data = PackedByteArray()
|
|
|
|
[node name="Player" parent="." instance=ExtResource("2")]
|
|
position = Vector2(512, 384)
|
|
|
|
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
|
environment = SubResource("Environment_1")
|
|
|
|
[node name="CanvasModulate" type="CanvasModulate" parent="."]
|
|
color = Color(1, 1, 1, 1)
|
|
"""
|
|
|
|
output_path = Path("godot/scenes/world/World.tscn")
|
|
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
output_path.write_text(content)
|
|
print(f"✅ Created: {output_path}")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print("🎮 GODOT 4 TILESET CONVERTER\n")
|
|
|
|
os.chdir(Path(__file__).parent.parent)
|
|
|
|
print("📦 Generating TileSet resources...")
|
|
generate_water_animated_tileset()
|
|
generate_grass_animated_tileset()
|
|
generate_tall_grass_tileset()
|
|
generate_terrain_tileset()
|
|
|
|
print("\n🌍 Generating World scene...")
|
|
generate_world_scene()
|
|
|
|
print("\n🎉 GODOT PROJECT READY!")
|
|
print("\n📖 NEXT STEPS:")
|
|
print("1. Open Godot 4")
|
|
print("2. Import project: /Users/davidkotnik/repos/novafarma/godot")
|
|
print("3. Open World.tscn")
|
|
print("4. Use TileMapLayer 'Terrain' brush to paint!")
|
|
print("5. Press F5 to run - Kai spawns with WASD movement! 🎮")
|
|
|