Skip to content
Project setup and core foundation

Project setup and core foundation

May 15, 2026

Godot version

The latest stable Godot version now is 4.6.2.

Project settings

I set these project settings at the start:

  • Max FPS 120
  • Window size 1920x1080, Exlusive Fullscreen
  • Resizable off
  • Stretch mode canvas_items
  • Scale mode integer
  • Debug GDScript Untyped Declaration Warn

Input mappings

KeyDescription
LMBMove, Interact
RMBAttack, Use spell
1-8Use specific belt item
COpen character information
IOpen inventory
QOpen quest log
SOpen spell book
TABOpen map
ESCOpen menu

Placeholder assets

I will use premade free assets for prototyping and maybe later if they fit for the game art.

For textures I use Screaming Brain Studios assets because they make incredibly good old-school textures royalty free (huge thanks).

Currently, I am not thinking about the music and SFX.

Folder tree structure

I am following Godot best practices and organizing files by functional ownership.

              • ...
            • demo.tscn

        Graybox isometric test map

        While trying to set up the tile textures, I realized the assets use a magenta color for transparency. That is probably useful in engines that can easily process and remove the color like a chroma key.

        Image of the wrong non-transparent asset.

        In Godot, I think this is possible with shaders, but I still do not know how much performance would be affected if I applied a shader material to every tile just for this purpose.

        So I needed to edit the images myself, and I wrote a small Python script to automate the process.

        It was relatively easy to work with because only the magenta color (#ff00ff) needed to have its alpha changed to zero.

        import os
        from PIL import Image
        
        root_folder = r"/path/to/your/folder"
        output_root = os.path.join(root_folder, "transparent")
        target_rgb = (255, 0, 255)
        tolerance = 20
        processed = 0
        errors = 0
        
        def is_close_to_magenta(r, g, b, target, tol):
            return (
                abs(r - target[0]) <= tol and
                abs(g - target[1]) <= tol and
                abs(b - target[2]) <= tol
            )
        
        for dirpath, dirnames, filenames in os.walk(root_folder):
            if os.path.commonpath([dirpath, output_root]) == output_root:
                continue
        
            for filename in filenames:
                if not filename.lower().endswith(".png"):
                    continue
        
                input_path = os.path.join(dirpath, filename)
                relative_subfolder = os.path.relpath(dirpath, root_folder)
                save_folder = output_root if relative_subfolder == "." else os.path.join(output_root, relative_subfolder)
                os.makedirs(save_folder, exist_ok=True)
        
                name, ext = os.path.splitext(filename)
                output_path = os.path.join(save_folder, f"{name}_transparent.png")
        
                try:
                    with Image.open(input_path) as img:
                        img = img.convert("RGBA")
                        pixels = list(img.getdata())
        
                        new_pixels = []
                        for r, g, b, a in pixels:
                            if is_close_to_magenta(r, g, b, target_rgb, tolerance):
                                new_pixels.append((r, g, b, 0))
                            else:
                                new_pixels.append((r, g, b, a))
        
                        img.putdata(new_pixels)
                        img.save(output_path, "PNG")
        
                    print(f"Saved: {output_path}")
                    processed += 1
        
                except Exception as e:
                    print(f"Error processing {input_path}: {e}")
                    errors += 1
        
        print("\nDone.")
        print(f"Processed: {processed}")
        print(f"Errors:    {errors}")
        print(f"Output folder: {output_root}")

        In Jupyter Notebook:

        magenta-remover.ipynb

        Now the textures align perfectly with each other.

        Image of the correct transparent asset.

        Tile size should be set correctly so the grid matches the texture size:

        Image of the correct transparent asset.

        Last updated on