Merge pull request #328 from Excello-Recherche-Education/3.0.1

Merge 3.0.1 into main
This commit is contained in:
Adrien Ufferte
2026-06-18 11:55:04 +02:00
committed by GitHub
476 changed files with 10663 additions and 2957 deletions
+300 -74
View File
@@ -1,6 +1,7 @@
import os
import re
import sys
from collections import defaultdict, Counter
def split_params(param_string: str):
@@ -56,58 +57,164 @@ def split_params(param_string: str):
params = [p for p in params if p]
return params
EXCLUDED_DIRS = {"addons", ".git", ".github"}
EXCLUDED_FILES = {os.path.normpath("script_templates/Node/default.gd")}
issues = []
issues: list = []
# ─── Messages ────────────────────────────────────────────────────────────────
# Structural issue messages. Use {key} for context-specific values.
# Naming issues are rendered dynamically (see format_message / SUGGESTION_FN).
MESSAGES = {
'class': 'is a class name and should be in PascalCase',
'function': 'is a function name and should be in snake_case',
'variable': 'is a variable name and should be in snake_case',
'constant': 'is a constant name and should be in UPPER_SNAKE_CASE',
'signal': 'is a signal name and should be in snake_case',
'annotation_order': 'annotations must be on the first line and include only \@tool, \@icon or \@static_unload',
'class_position': 'class_name must appear after annotations (if any)',
'extends_position': 'extends must appear after annotation and class_name',
'extends_missing': 'extends is required and must follow annotation and class_name',
'func_blank': 'functions must be preceded by exactly two empty lines (or only one if preceded by a #region comment)',
'signal_position': 'signals must come right after extends',
'signal_format': 'signals must end with ()',
'signal_blank': 'signals must not be separated by empty lines',
'enum_position': 'enums must come after signals and be grouped together',
'enum_format': "enum declaration should be 'enum Name {'",
'enum_member_blank': 'enum members must not be separated by empty lines',
'enum_member_indent': 'enum members must be indented with a single tab',
'enum_no_close': 'enum declaration is missing a closing }',
'enum_blank': 'enums must be preceded by one empty line and must not be separated by empty lines',
'const_position': 'constants must come after enums and be grouped together',
'const_blank': 'constants must be preceded by one empty line and must not be separated by empty lines',
'static_position': 'static variables must come after constants and be grouped together',
'static_blank': 'static variables must be preceded by one empty line and must not be separated by empty lines',
'export_position': 'export variables must come after static variables and be grouped together',
'export_blank': 'export variables must be preceded by one empty line and must not be separated by empty lines',
'var_position': 'variables must come after export variables and be grouped together',
'var_blank': 'variables must be preceded by one empty line and must not be separated by empty lines',
'onready_position': '@onready variables must come after other variables and be grouped together',
'onready_blank': '@onready variables must be preceded by one empty line and must not be separated by empty lines',
# File/header structure
'annotation_order': "annotation not allowed here: '{found}' — only @tool, @icon or @static_unload are allowed at the top of the file",
'class_position': "class_name must appear right after annotations (if any)",
'extends_position': "extends must appear after annotations and class_name",
'extends_missing': "extends is missing — add 'extends BaseClass' (or 'extends RefCounted' for base classes)",
# Function spacing
'func_blank': "expected 2 blank lines before function (found {found})",
# Signals
'signal_position': "signal found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'signal_format': "signal must declare parameters with () — found: '{found}'",
'signal_blank_extra': "remove blank line between signal declarations — signals must be grouped together",
# Enums
'enum_position': "enum found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'enum_format': "enum declaration should be 'enum Name {{' — found: '{found}'",
'enum_member_blank': "remove blank line between enum members",
'enum_member_indent': "enum member must be indented with a single tab — found: '{found}'",
'enum_no_close': "enum declaration is missing a closing '}'",
'enum_blank_missing': "missing blank line before the enum section",
'enum_blank_extra': "remove blank line between enum declarations — enums must be grouped together",
# Constants
'const_position': "const found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'const_blank_missing': "missing blank line before the const section",
'const_blank_extra': "remove blank line between const declarations — constants must be grouped together",
# Static variables
'static_position': "static var found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'static_blank_missing': "missing blank line before the static var section",
'static_blank_extra': "remove blank line between static var declarations — static variables must be grouped together",
# Export variables
'export_position': "@export found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'export_blank_missing': "missing blank line before the @export section",
'export_blank_extra': "remove blank line between @export declarations — export variables must be grouped together",
# Regular variables
'var_position': "var found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'var_blank_missing': "missing blank line before the var section",
'var_blank_extra': "remove blank line between var declarations — variables must be grouped together",
# @onready variables
'onready_position': "@onready var found after {after} — expected order: signal > enum > const > static var > @export > var > @onready",
'onready_blank_missing': "missing blank line before the @onready section",
'onready_blank_extra': "remove blank line between @onready declarations — @onready variables must be grouped together",
}
# Naming conventions
# ─── Naming conventions ───────────────────────────────────────────────────────
PASCAL_CASE = re.compile(r"^[A-Z][A-Za-z0-9]*$")
SNAKE_CASE = re.compile(r"^_?[a-z][a-z0-9_]*$")
UPPER_SNAKE_CASE = re.compile(r"^_?[A-Z][A-Z0-9_]*$")
REGION_RE = re.compile(r"#\s*(region|endregion)\b", re.IGNORECASE)
def _to_snake_case(name: str) -> str:
prefix = '_' if name.startswith('_') else ''
core = name.lstrip('_')
s = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', core)
s = re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1_\2', s)
return prefix + s.lower()
def _to_pascal_case(name: str) -> str:
prefix = '_' if name.startswith('_') else ''
core = name.lstrip('_')
# Split on camelCase boundaries first, then on underscores/spaces
# e.g. 'myBadEnum' → 'my_Bad_Enum' → 'MyBadEnum'
snake = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', core)
snake = re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1_\2', snake)
return prefix + ''.join(w.capitalize() for w in re.split(r'[_\s]+', snake) if w)
def _to_upper_snake_case(name: str) -> str:
prefix = '_' if name.startswith('_') else ''
core = name.lstrip('_')
s = re.sub(r'([a-z0-9])([A-Z])', r'\1_\2', core)
s = re.sub(r'([A-Z]+)([A-Z][a-z])', r'\1_\2', s)
return prefix + s.upper()
CONVENTION_NAMES: dict[str, str] = {
'class': 'PascalCase',
'enum_name': 'PascalCase',
'enum_member': 'UPPER_SNAKE_CASE',
'function': 'snake_case',
'variable': 'snake_case',
'constant': 'UPPER_SNAKE_CASE',
'signal': 'snake_case',
}
SUGGESTION_FN: dict = {
'class': _to_pascal_case,
'enum_name': _to_pascal_case,
'enum_member': _to_upper_snake_case,
'function': _to_snake_case,
'variable': _to_snake_case,
'constant': _to_upper_snake_case,
'signal': _to_snake_case,
}
NAMING_KINDS = frozenset({'class', 'enum_name', 'enum_member', 'function', 'variable', 'constant', 'signal'})
# ─── Naming check ─────────────────────────────────────────────────────────────
def _check_enum_member(path: str, idx: int, name: str) -> None:
"""Flag a single enum member name if it is not UPPER_SNAKE_CASE."""
if name and not UPPER_SNAKE_CASE.match(name):
issues.append((path, idx, 'enum_member', name))
def check_naming(path: str, lines: list[str]):
in_enum = False # True while scanning the body of a multi-line enum
for idx, line in enumerate(lines, 1):
stripped = line.strip()
if stripped.startswith('#') or stripped.startswith('@warning_ignore(') or not stripped:
continue
# ── Enum-body lines ────────────────────────────────────────────────────
if in_enum:
close = stripped.find('}')
if close != -1:
in_enum = False
# Any identifiers before the closing brace on this line
before = stripped[:close]
for part in before.split(','):
m = re.match(r"\s*([A-Za-z0-9_]+)", part)
if m:
_check_enum_member(path, idx, m.group(1))
else:
# One (or more) members on this line: "NAME," or "NAME = val,"
for part in stripped.split(','):
m = re.match(r"\s*([A-Za-z0-9_]+)", part)
if m:
_check_enum_member(path, idx, m.group(1))
continue
# ── End enum-body ──────────────────────────────────────────────────────
match_class = re.match(r"class_name\s+([A-Za-z0-9_]+)", stripped)
if match_class:
name = match_class.group(1)
if not PASCAL_CASE.match(name):
issues.append((path, idx, 'class', name))
match_func = re.match(r"(?:static\s+)?func\s+([A-Za-z0-9_]+)\s*(\([^)]*\))?", stripped)
if match_func:
name = match_func.group(1)
@@ -120,51 +227,82 @@ def check_naming(path: str, lines: list[str]):
param_name = param.split(':')[0].split('=')[0].strip()
if param_name and not SNAKE_CASE.match(param_name):
issues.append((path, idx, 'variable', param_name))
match_export = re.match(r"(?:@export\s+)?var\s+([A-Za-z0-9_]+)", stripped)
if match_export:
name = match_export.group(1)
# Match variable declarations with any annotation/modifier prefix.
# Handles: var, static var, @export var, @export_range(...) var,
# @export_multiline var, @onready var, etc.
# Does NOT match annotation-only lines like @export_category("Difficulty").
match_var = re.match(r"(?:(?:static|@\w+(?:\([^)]*\))?)\s+)*var\s+([A-Za-z0-9_]+)", stripped)
if match_var:
name = match_var.group(1)
if not SNAKE_CASE.match(name):
issues.append((path, idx, 'variable', name))
match_const = re.match(r"const\s+([A-Za-z0-9_]+)", stripped)
if match_const:
name = match_const.group(1)
if not UPPER_SNAKE_CASE.match(name):
issues.append((path, idx, 'constant', name))
match_enum = re.match(r"enum\s+([A-Za-z0-9_]+)", stripped)
if match_enum:
name = match_enum.group(1)
if not PASCAL_CASE.match(name):
issues.append((path, idx, 'enum_name', name))
# Determine whether the enum body is inline or multi-line
brace = stripped.find('{')
if brace != -1:
rest = stripped[brace + 1:]
close = rest.find('}')
if close != -1:
# Inline enum — check members immediately
for part in rest[:close].split(','):
m = re.match(r"\s*([A-Za-z0-9_]+)", part)
if m:
_check_enum_member(path, idx, m.group(1))
else:
# Body continues on following lines
in_enum = True
match_signal = re.match(r"signal\s+([A-Za-z0-9_]+)", stripped)
if match_signal:
name = match_signal.group(1)
if not SNAKE_CASE.match(name):
issues.append((path, idx, 'signal', name))
match_for = re.match(r"for\s+([A-Za-z0-9_]+)(?:\s*:\s*[^\s]+)?\s+in\b", stripped)
if match_for:
name = match_for.group(1)
if not SNAKE_CASE.match(name):
issues.append((path, idx, 'variable', name))
# Content order
# ─── Content order check ──────────────────────────────────────────────────────
ANNOTATION_LINE_RE = re.compile(
r"^(?:@(tool|icon|static_unload)(?:\([^\n]*\))?)(?:,\s*@(tool|icon|static_unload)(?:\([^\n]*\))?)*$"
)
ALLOWED_ANNOTATION_RE = re.compile(r"@(tool|icon|static_unload)\b")
def check_content_order(path: str, lines: list[str]):
content = [
(line.rstrip('\n'), idx)
for idx, line in enumerate(lines, 1)
if not line.startswith(' ') # Line is not indented
if not line.startswith(' ') # Line is not indented (tab character)
and not line.lstrip().startswith('#')
and not line.lstrip().startswith('@warning_ignore(')
]
idx = 0
n = len(content)
# 1) annotations
# 1) Annotations (@tool / @icon / @static_unload must be first)
if idx < n and ANNOTATION_LINE_RE.fullmatch(content[idx][0].strip()):
idx += 1
else:
for j in range(idx, n):
if ALLOWED_ANNOTATION_RE.search(content[j][0]):
issues.append((path, content[j][1], 'annotation_order', content[j][0].strip()))
issues.append((path, content[j][1], 'annotation_order', {'found': content[j][0].strip()}))
break
# 2) class_name (optional)
@@ -176,24 +314,27 @@ def check_content_order(path: str, lines: list[str]):
idx += 1
break
# 3) extends (required)
# 3) extends (recommended; missing is flagged but does not block ordering checks)
extends_pos = None
for j in range(idx, n):
if content[j][0].strip().startswith('extends'):
extends_pos = j
break
if extends_pos is None:
issues.append((path, 0, 'extends_missing', 'extends'))
return
# Don't return — continue ordering checks from current position
prev_token: str = content[idx - 1][0].strip() if idx > 0 else ''
else:
if extends_pos != idx:
issues.append((path, content[extends_pos][1], 'extends_position', 'extends'))
idx = extends_pos + 1
prev_token = content[extends_pos][0].strip()
order = ['signal', 'enum', 'const', 'static var', '@export', 'var', '@onready var']
order_index = {name: i for i, name in enumerate(order)}
seen: set[str] = set()
current_order = -1
prev_token: str | None = content[extends_pos][0].strip()
j = idx
while j < n:
line, line_no = content[j]
@@ -208,27 +349,27 @@ def check_content_order(path: str, lines: list[str]):
if stripped.startswith('signal'):
token = 'signal'
if not re.fullmatch(r"signal\s+\w+\([^)]*\)", stripped):
issues.append((path, line_no, 'signal_format', stripped))
issues.append((path, line_no, 'signal_format', {'found': stripped}))
if 'signal' in seen and prev_token == '':
issues.append((path, content[j - 1][1], 'signal_blank', 'signal'))
issues.append((path, content[j - 1][1], 'signal_blank_extra', 'signal'))
seen.add('signal')
elif stripped.startswith('enum'):
token = 'enum'
if not re.fullmatch(r"enum\s+\w+\s*{", stripped):
issues.append((path, line_no, 'enum_format', stripped))
issues.append((path, line_no, 'enum_format', {'found': stripped}))
if 'enum' not in seen:
if prev_token != '':
issues.append((path, line_no, 'enum_blank', 'enum'))
issues.append((path, line_no, 'enum_blank_missing', 'enum'))
else:
if prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'enum_blank', 'enum'))
issues.append((path, line_no, 'enum_blank_extra', 'enum'))
k = j + 1
while k < n and content[k][0].strip() != '}':
member, m_line_no = content[k]
if member.strip() == '':
issues.append((path, m_line_no, 'enum_member_blank', 'enum'))
if not member.startswith('\t') or member.startswith('\t\t'):
issues.append((path, m_line_no, 'enum_member_indent', member.strip()))
issues.append((path, m_line_no, 'enum_member_indent', {'found': member.strip()}))
k += 1
if k >= n:
issues.append((path, line_no, 'enum_no_close', 'enum'))
@@ -238,7 +379,8 @@ def check_content_order(path: str, lines: list[str]):
seen.add('enum')
curr_order = order_index['enum']
if curr_order < current_order:
issues.append((path, line_no, 'enum_position', 'enum'))
after_token = order[current_order]
issues.append((path, line_no, 'enum_position', {'after': after_token}))
else:
current_order = max(current_order, curr_order)
j += 1
@@ -247,51 +389,52 @@ def check_content_order(path: str, lines: list[str]):
token = 'const'
if 'const' not in seen:
if prev_token != '':
issues.append((path, line_no, 'const_blank', 'const'))
issues.append((path, line_no, 'const_blank_missing', 'const'))
else:
if prev_token != 'const' and prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'const_blank', 'const'))
issues.append((path, line_no, 'const_blank_extra', 'const'))
seen.add('const')
elif stripped.startswith('static var '):
token = 'static var'
if 'static var' not in seen:
if prev_token != '':
issues.append((path, line_no, 'static_blank', 'static var'))
issues.append((path, line_no, 'static_blank_missing', 'static var'))
else:
if prev_token != 'static var' and prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'static_blank', 'static var'))
issues.append((path, line_no, 'static_blank_extra', 'static var'))
seen.add('static var')
elif stripped.startswith('@export'):
token = '@export'
if '@export' not in seen:
if prev_token != '':
issues.append((path, line_no, 'export_blank', '@export'))
issues.append((path, line_no, 'export_blank_missing', '@export'))
else:
if prev_token != '@export' and prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'export_blank', '@export'))
issues.append((path, line_no, 'export_blank_extra', '@export'))
seen.add('@export')
elif stripped.startswith('var '):
token = 'var'
if 'var' not in seen:
if prev_token != '':
issues.append((path, line_no, 'var_blank', 'var'))
issues.append((path, line_no, 'var_blank_missing', 'var'))
else:
if prev_token != 'var' and prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'var_blank', 'var'))
issues.append((path, line_no, 'var_blank_extra', 'var'))
seen.add('var')
elif stripped.startswith('@onready var '):
token = '@onready var'
if '@onready var' not in seen:
if prev_token != '':
issues.append((path, line_no, 'onready_blank', '@onready var'))
issues.append((path, line_no, 'onready_blank_missing', '@onready var'))
else:
if prev_token != '@onready var' and prev_token != '}' and prev_token != ']':
issues.append((path, line_no, 'onready_blank', '@onready var'))
issues.append((path, line_no, 'onready_blank_extra', '@onready var'))
seen.add('@onready var')
else:
prev_token = stripped
j += 1
continue
curr_order = order_index[token]
key_map = {
'signal': 'signal_position',
@@ -303,7 +446,8 @@ def check_content_order(path: str, lines: list[str]):
'@onready var': 'onready_position',
}
if curr_order < current_order:
issues.append((path, line_no, key_map[token], token))
after_token = order[current_order]
issues.append((path, line_no, key_map[token], {'after': after_token}))
else:
current_order = max(current_order, curr_order)
@@ -311,7 +455,8 @@ def check_content_order(path: str, lines: list[str]):
j += 1
# Spacing for functions
# ─── Function spacing check ───────────────────────────────────────────────────
def check_func_spacing(path: str):
with open(path, 'r', encoding='utf-8') as file:
lines = file.readlines()
@@ -348,14 +493,15 @@ def check_func_spacing(path: str):
region_above = test_index >= 0 and REGION_RE.match(lines[test_index].lstrip())
if region_above:
if blank_count > 1:
issues.append((path, idx + 1, 'func_blank', 'func'))
issues.append((path, idx + 1, 'func_blank', {'found': blank_count}))
continue
elif blank_count != 2:
if not (blank_count == 1 and test_index >= 0 and lines[test_index].lstrip().startswith('#region')):
issues.append((path, idx + 1, 'func_blank', 'func'))
issues.append((path, idx + 1, 'func_blank', {'found': blank_count}))
# Main function
# ─── Main ─────────────────────────────────────────────────────────────────────
for root, dirs, files in os.walk('.', topdown=True):
rel_root = os.path.relpath(root, '.')
if any(rel_root == excluded or rel_root.startswith(f"{excluded}{os.sep}") for excluded in EXCLUDED_DIRS):
@@ -378,15 +524,95 @@ for root, dirs, files in os.walk('.', topdown=True):
check_content_order(path, lines)
check_func_spacing(path)
if issues:
print("### \u274c GDScript Naming Convention Check Failed\n")
print(f"The project must follow Godot GDScript naming conventions.\nTotal issues: {len(issues)}\n")
for path, idx, kind, name in issues:
# ─── Output ───────────────────────────────────────────────────────────────────
ORDERING_KINDS = frozenset({
'annotation_order', 'class_position', 'extends_position', 'extends_missing',
'signal_position', 'enum_position', 'const_position', 'static_position',
'export_position', 'var_position', 'onready_position',
})
FORMATTING_KINDS = frozenset({
'func_blank',
'signal_format', 'signal_blank_extra',
'enum_format', 'enum_blank_missing', 'enum_blank_extra',
'enum_member_blank', 'enum_member_indent', 'enum_no_close',
'const_blank_missing', 'const_blank_extra',
'static_blank_missing', 'static_blank_extra',
'export_blank_missing', 'export_blank_extra',
'var_blank_missing', 'var_blank_extra',
'onready_blank_missing', 'onready_blank_extra',
})
def categorize(kind: str) -> str:
if kind in NAMING_KINDS:
return 'naming'
if kind in ORDERING_KINDS:
return 'ordering'
if kind in FORMATTING_KINDS:
return 'formatting'
return 'other'
_KIND_LABEL: dict[str, str] = {
'class': 'class names',
'enum_name': 'enum names',
'enum_member': 'enum member names',
'function': 'function names',
'variable': 'variable names',
'constant': 'constant names',
'signal': 'signal names',
}
def format_message(kind: str, data) -> str:
if kind in NAMING_KINDS:
suggestion = SUGGESTION_FN[kind](data)
conv = CONVENTION_NAMES[kind]
label = _KIND_LABEL.get(kind, f"{kind}s")
return f"'{data}' should be '{suggestion}' ({label} must be {conv})"
if kind == 'error':
message = name
else:
message = f"'{name}' {MESSAGES[kind]}"
print(f"- `{path}:{idx}` {message}")
sys.exit(1)
else:
print("\u2705 All GDScript files follow the naming conventions.")
return str(data)
template = MESSAGES.get(kind, kind)
if isinstance(data, dict):
return template.format(**data)
return template
if not issues:
print("✅ All GDScript files follow the naming conventions.")
sys.exit(0)
# Group issues by file, sort by line number within each file
by_file: dict = defaultdict(list)
counts: Counter = Counter()
for path, line_no, kind, data in issues:
by_file[path].append((line_no, kind, data))
counts[categorize(kind)] += 1
total = len(issues)
file_count = len(by_file)
summary_parts = []
for cat in ('naming', 'ordering', 'formatting', 'other'):
if counts[cat]:
summary_parts.append(f"{counts[cat]} {cat}")
summary = ', '.join(summary_parts)
print(f"### ❌ GDScript Naming Convention Check Failed\n")
print(f"**{total} issue{'s' if total != 1 else ''}** in {file_count} file{'s' if file_count != 1 else ''} ({summary})\n")
for fpath in sorted(by_file):
file_issues = sorted(by_file[fpath], key=lambda x: x[0])
count = len(file_issues)
print("<details>")
print(f"<summary><code>{fpath}</code> — {count} issue{'s' if count != 1 else ''}</summary>\n")
print("| Line | Issue |")
print("|------|-------|")
for line_no, kind, data in file_issues:
msg = format_message(kind, data)
print(f"| {line_no} | {msg} |")
print("\n</details>\n")
sys.exit(1)
+1 -1
View File
@@ -10,7 +10,7 @@ jobs:
permissions:
pull-requests: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Run GDScript naming convention check
id: naming
run: |
+11 -7
View File
@@ -53,11 +53,11 @@ Cada lección sigue una progresión lógica basada en datos lingüísticos extra
```bash
# Clona tu fork del repositorio
git clone https://github.com/TU_USUARIO/Kalulu.git
git clone https://github.com/TU_USUARIO/Kalulu-Frontend.git
# O bien
git clone git@github.com:YOUR_USERNAME/Kalulu.git
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git
cd Kalulu
cd Kalulu-Frontend
```
🔁 _Reemplaza `TU_USUARIO` con tu nombre de usuario._
@@ -113,13 +113,17 @@ Asegúrate de que tu código siga nuestras convenciones de codificación e inclu
## ❓ FAQ
### 📱 O Kalulu está disponível para dispositivos móveis?
### 📱 ¿Está Kalulu disponible en móviles?
Sim! Kalulu está disponível para:
¡Sí! Kalulu está disponible para:
- [![Android](https://img.shields.io/badge/PlayStore-Kalulu-green?logo=google-play)](https://play.google.com/store/apps/details?id=org.godotengine.kalulu)
- [![iOS](https://img.shields.io/badge/AppStore-Kalulu-blue?logo=apple)](https://apps.apple.com/fr/app/kalulu-education/id1639075967)
### 💻 Existe uma versão para computador?
### 💻 ¿Está Kalulu disponible en escritorio?
Uma versão experimental para Windows, Mac e Linux está em desenvolvimento. Fique ligado!
¡Sí! Las versiones para Windows, Mac y Linux están disponibles en la sección [Releases](https://github.com/Excello-Recherche-Education/Kalulu-Frontend/releases).
### 🌐 ¿Está Kalulu disponible directamente en la web?
¡Estamos trabajando en ello, mantente atento!
+9 -5
View File
@@ -53,11 +53,11 @@ Chaque leçon suit une séquence structurée basée sur des données linguistiqu
```bash
# Clonez votre fork du dépôt
git clone https://github.com/VOTRE_UTILISATEUR/Kalulu.git
git clone https://github.com/VOTRE_UTILISATEUR/Kalulu-Frontend.git
# Ou
git clone git@github.com:YOUR_USERNAME/Kalulu.git
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git
cd Kalulu
cd Kalulu-Frontend
```
🔁 _Remplacez `VOTRE_UTILISATEUR` par votre nom d'utilisateur GitHub._
@@ -120,6 +120,10 @@ Oui ! Kalulu est disponible pour :
- [![Android](https://img.shields.io/badge/PlayStore-Kalulu-green?logo=google-play)](https://play.google.com/store/apps/details?id=org.godotengine.kalulu)
- [![iOS](https://img.shields.io/badge/AppStore-Kalulu-blue?logo=apple)](https://apps.apple.com/fr/app/kalulu-education/id1639075967)
### 💻 Existe-t-il une version pour ordinateur ?
### 💻 Kalulu est-il disponible sur ordinateur ?
Une version pour Windows, Mac et Linux est en cours de développement expérimental. Restez à l’écoute !
Oui ! Des versions pour Windows, Mac et Linux sont disponibles dans la section [Releases](https://github.com/Excello-Recherche-Education/Kalulu-Frontend/releases).
### 🌐 Kalulu est-il disponible directement sur le web ?
Nous y travaillons, restez à l’écoute !
+10 -6
View File
@@ -51,18 +51,18 @@ Each lesson follows a structured sequence based on linguistic data drawn from ch
We recommend forking the repository before cloning, so you can easily contribute or manage your own changes.
1. Go to the [Kalulu GitHub Repository](https://github.com/Excello-Recherche-Education/Kalulu).
1. Go to the [Kalulu GitHub Repository](https://github.com/Excello-Recherche-Education/Kalulu-Frontend).
2. Click the **Fork** button at the top-right corner to create your own copy of the repo.
3. Once forked, open your terminal and run the following commands:
```bash
# Clone your fork of the repository
git clone https://github.com/YOUR_USERNAME/Kalulu.git
git clone https://github.com/YOUR_USERNAME/Kalulu-Frontend.git
# Or
git clone git@github.com:YOUR_USERNAME/Kalulu.git
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git
# Navigate into the project directory
cd Kalulu
cd Kalulu-Frontend
```
🔁 *Remember to replace `YOUR_USERNAME` with your actual GitHub username.*
@@ -141,9 +141,13 @@ Yes! Kalulu is available on:
- [![Android](https://img.shields.io/badge/PlayStore-Kalulu-green?logo=google-play)](https://play.google.com/store/apps/details?id=org.godotengine.kalulu)
- [![iOS](https://img.shields.io/badge/AppStore-Kalulu-blue?logo=apple)](https://apps.apple.com/fr/app/kalulu-education/id1639075967)
### 💻 Is there a desktop version?
### 💻 Is Kalulu available on desktop?
An experimental version for Windows, Mac, and Linux is currently in development. Stay tuned!
Yes! Desktop versions for Windows, Mac, and Linux are available in the [Releases](https://github.com/Excello-Recherche-Education/Kalulu-Frontend/releases) section.
### 🌐 Is Kalulu available directly on the web?
We are working on it, stay tuned!
---
+12 -8
View File
@@ -17,7 +17,7 @@
- [2. Instalar o Godot Engine](#2-instalar-o-godot-engine)
- [🧩 Addons inclusos](#-addons-inclusos)
- [🤝 Quer ajudar?](#-quer-ajudar-)
- [❓ Preguntas Frecuentes](#faq)
- [❓ Perguntas Frequentes](#faq)
---
@@ -51,11 +51,11 @@ Cada lição segue uma sequência estruturada com base em dados da literatura in
```bash
# Clone o seu fork do repositório
git clone https://github.com/SEU_USUARIO/Kalulu.git
git clone https://github.com/SEU_USUARIO/Kalulu-Frontend.git
# Ou então
git clone git@github.com:YOUR_USERNAME/Kalulu.git
git clone git@github.com:YOUR_USERNAME/Kalulu-Frontend.git
cd Kalulu
cd Kalulu-Frontend
```
🔁 _Substitua `SEU_USUARIO` pelo seu nome de usuário._
@@ -111,13 +111,17 @@ Certifique-se de que seu código siga nossas convenções de codificação e inc
## ❓ FAQ
### 📱 ¿Está Kalulu disponible en móviles?
### 📱 O Kalulu está disponível para dispositivos móveis?
¡Sí! Kalulu está disponible para:
Sim! Kalulu está disponível para:
- [![Android](https://img.shields.io/badge/PlayStore-Kalulu-green?logo=google-play)](https://play.google.com/store/apps/details?id=org.godotengine.kalulu)
- [![iOS](https://img.shields.io/badge/AppStore-Kalulu-blue?logo=apple)](https://apps.apple.com/fr/app/kalulu-education/id1639075967)
### 💻 ¿Existe una versión para ordenadores?
### 💻 O Kalulu está disponível no desktop?
Una versión experimental para Windows, Mac y Linux está en desarrollo. ¡Mantente atento!
Sim! Versões para Windows, Mac e Linux estão disponíveis na seção [Releases](https://github.com/Excello-Recherche-Education/Kalulu-Frontend/releases).
### 🌐 O Kalulu está disponível diretamente na web?
Estamos trabalhando nisso, fique ligado!
@@ -6,12 +6,16 @@ func _get_name() -> String:
var tool_configs: Dictionary[String, Dictionary] = {
"game": {
"name": "Kalulu",
"main_scene": "res://sources/menus/splash_screen/splash_screen.tscn",
"output_name": "kalulu_app"
"icon": "res://assets/kalulu_icon.png",
"output_name": "Kalulu"
},
"prof_tool": {
"name": "Prof_Tool",
"main_scene": "res://sources/language_tool/prof_tool_menu.tscn",
"output_name": "prof_tool"
"icon": "res://assets/prof_tool_icon.png",
"output_name": "Prof_Tool"
}
}
@@ -26,6 +30,8 @@ func _export_begin(features: PackedStringArray, is_debug: bool, path: String, fl
push_error("Tool '%s' is not defined in the configuration." % selected_tool)
return
var config: Dictionary[String, String] = tool_configs[selected_tool]
var config: Dictionary = tool_configs[selected_tool]
ProjectSettings.set_setting("application/config/name", config["name"])
ProjectSettings.set_setting("application/run/main_scene", config["main_scene"])
ProjectSettings.set_setting("application/config/icon", config["icon"])
ProjectSettings.save()
@@ -3,40 +3,76 @@ extends EditorPlugin
const EXPORTER_PATH: String = "res://addons/export_tool_manager/export_tool_exporter.gd"
const TOOL_CONFIGS: Dictionary = {
"game": {
"name": "Kalulu",
"main_scene": "res://sources/menus/splash_screen/splash_screen.tscn",
"icon": "res://assets/kalulu_icon.png",
"export_folder": "Kalulu_Game",
"button_label": "Export All (Kalulu Game)",
"presets": {
"Android Kalulu AAB": "/Android/Kalulu.aab",
"Android Kalulu APK": "/Android/Kalulu.apk",
"Android Kalulu APK 32 bits": "/Android/Kalulu_32.apk",
"Windows Kalulu": "/Windows/Kalulu-Windows.zip",
"Linux Kalulu": "/Linux/Kalulu-Linux.zip",
# Apple in last because it's always the most complicated
#"iOS Kalulu": "/iOS/Kalulu.ipa",
#"macOS Kalulu": "/macOS/Kalulu-macOS.dmg",
},
},
"prof_tool": {
"name": "Prof_Tool",
"main_scene": "res://sources/language_tool/prof_tool_menu.tscn",
"icon": "res://assets/prof_tool_icon.png",
"export_folder": "Prof_Tool",
"button_label": "Export All (Prof Tool)",
"presets": {
"Windows ProfTool": "/Windows/Prof_Tool-Windows.zip",
"Linux ProfTool": "/Linux/Prof_Tool-Linux.zip",
# Apple in last because it's always the most complicated
#"macOS ProfTool": "/macOS/Prof_Tool-macOS.dmg",
},
}
}
var tool_selector: OptionButton
var exporter_plugin: EditorExportPlugin
var export_button: Button
var current_tool: String = "game"
func _enter_tree() -> void:
# Tool Selector UI
tool_selector = OptionButton.new()
tool_selector.name = "Tool Exporter"
tool_selector.add_item("Game")
tool_selector.add_item("Kalulu Game")
tool_selector.add_item("Prof Tool")
tool_selector.connect("item_selected", _on_tool_selected)
add_control_to_container(EditorPlugin.CONTAINER_TOOLBAR, tool_selector)
var settings: EditorSettings = get_editor_interface().get_editor_settings()
var current: Variant = settings.get_setting("export_tool_manager/current_tool")
var current_tool: String = "game"
var saved: Variant = settings.get_setting("export_tool_manager/current_tool")
if typeof(current) == TYPE_STRING and current.strip_edges() != "":
current_tool = current.strip_edges()
if typeof(saved) == TYPE_STRING and saved.strip_edges() != "":
current_tool = saved.strip_edges()
match current_tool:
"prof_tool":
tool_selector.select(1)
"game", _:
current_tool = "game"
tool_selector.select(0)
_apply_tool_config(current_tool)
# Exporter plugin
exporter_plugin = load(EXPORTER_PATH).new()
add_export_plugin(exporter_plugin)
# Export All Button
export_button = Button.new()
export_button.text = "Export All (Game)"
export_button.pressed.connect(_on_export_all_game_pressed)
export_button.text = TOOL_CONFIGS[current_tool]["button_label"]
export_button.pressed.connect(_on_export_all_pressed)
add_control_to_container(EditorPlugin.CONTAINER_TOOLBAR, export_button)
func _exit_tree() -> void:
@@ -49,37 +85,59 @@ func _exit_tree() -> void:
remove_export_plugin(exporter_plugin)
func _on_tool_selected(index: int) -> void:
var tool: String = "game"
match index:
1:
tool = "prof_tool"
current_tool = "prof_tool"
0, _:
tool = "game"
current_tool = "game"
var settings: EditorSettings = get_editor_interface().get_editor_settings()
settings.set_setting("export_tool_manager/current_tool", tool)
settings.set_setting("export_tool_manager/current_tool", current_tool)
_apply_tool_config(current_tool)
func _on_export_all_game_pressed() -> void:
export_all_game_presets()
func export_all_game_presets() -> void:
func _apply_tool_config(tool: String) -> void:
if not TOOL_CONFIGS.has(tool):
push_error("ExportToolManager: Unknown tool '%s'" % tool)
return
var config: Dictionary = TOOL_CONFIGS[tool]
ProjectSettings.set_setting("application/config/name", config["name"])
ProjectSettings.set_setting("application/run/main_scene", config["main_scene"])
ProjectSettings.set_setting("application/config/icon", config["icon"])
ProjectSettings.save()
if export_button:
export_button.text = config["button_label"]
print("ExportToolManager: Switched to '%s' (scene: %s)" % [config["name"], config["main_scene"]])
func _on_export_all_pressed() -> void:
export_all_presets()
func export_all_presets() -> void:
var config: Dictionary = TOOL_CONFIGS[current_tool]
var base_folder: String = "../Export/Autobuild/%s/" % config["export_folder"]
var version_folder: String = base_folder + get_application_version_with_code()
# Check if the version folder already exists
if DirAccess.dir_exists_absolute(version_folder):
var dialog: AcceptDialog = AcceptDialog.new()
dialog.title = "Export aborted"
dialog.dialog_text = "The export folder already exists:\n%s\n\nDelete it manually before re-exporting." % version_folder
get_editor_interface().get_base_control().add_child(dialog)
dialog.popup_centered()
dialog.confirmed.connect(dialog.queue_free)
dialog.canceled.connect(dialog.queue_free)
return
var godot_path: String = OS.get_executable_path()
var exportFolder: String = "../Export/autobuilds/"
var presets: Dictionary[String, String]= {
"Android Kalulu AAB": "/Android/kalulu_app.aab",
"Android Kalulu APK": "/Android/kalulu_app.apk",
"Android Kalulu APK 32 bits": "/Android/kalulu_app_32.apk",
"Windows Kalulu": "/Windows/Kalulu-Windows.zip",
"Linux Kalulu": "/Linux/Kalulu-Linux.zip",
# Apple in last because it's always the most complicated
#"iOS Kalulu": "/iOS/KaluluApp.ipa",
#"macOS Kalulu": "/macOS/Kalulu-macOS.dmg"
}
var presets: Dictionary = config["presets"]
for preset_name in presets.keys():
await get_tree().create_timer(1).timeout
var output_path: String = exportFolder + get_application_version_with_code() + presets[preset_name]
var output_path: String = version_folder + presets[preset_name]
print("Start exporting " + preset_name)
DirAccess.make_dir_recursive_absolute(output_path.get_base_dir())
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/editor_icon.png-6f130a2788dfaa185bebbdd85ed98
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
@@ -25,6 +27,10 @@ mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
+7 -5
View File
@@ -3,19 +3,21 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cop8iscyxohrb"
path="res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.ctex"
path.s3tc="res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.s3tc.ctex"
path.etc2="res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.etc2.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/bush_curtain.png"
dest_files=["res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.ctex"]
dest_files=["res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.s3tc.ctex", "res://.godot/imported/bush_curtain.png-2e1fb82bc0153666dd15620ed6cf9a14.etc2.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@@ -23,7 +25,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cqhbpt3lk6f15"
path="res://.godot/imported/bottom.png-3c7c71fa24e23ae34adb1d444da0b3db.ctex"
uid="uid://d1j23o6nq476v"
path="res://.godot/imported/ant_body.png-dad00fa87392efb7e152045fa1f6b084.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/lesson_screen/bottom.png"
dest_files=["res://.godot/imported/bottom.png-3c7c71fa24e23ae34adb1d444da0b3db.ctex"]
source_file="res://assets/gardens/animals/ant_body.png"
dest_files=["res://.godot/imported/ant_body.png-dad00fa87392efb7e152045fa1f6b084.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 953 B

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://cffuqacgb1jra"
path="res://.godot/imported/branches.png-59c95c0c624c68eb2181d2b0fe6a5080.ctex"
uid="uid://by3xfdin7jrsn"
path="res://.godot/imported/ant_face.png-b00fa29a7fcfe1e19ec19735f3395466.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/lesson_screen/branches.png"
dest_files=["res://.godot/imported/branches.png-59c95c0c624c68eb2181d2b0fe6a5080.ctex"]
source_file="res://assets/gardens/animals/ant_face.png"
dest_files=["res://.godot/imported/ant_face.png-b00fa29a7fcfe1e19ec19735f3395466.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b6nrx0dn0h3f2"
path="res://.godot/imported/caterpillar_body.png-c691b990e51d372f5dfdafa881ea6750.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/caterpillar_body.png"
dest_files=["res://.godot/imported/caterpillar_body.png-c691b990e51d372f5dfdafa881ea6750.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cnihbmks0piwi"
path="res://.godot/imported/caterpillar_face.png-d383b965d4555da185ab647f352d95f3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/caterpillar_face.png"
dest_files=["res://.godot/imported/caterpillar_face.png-d383b965d4555da185ab647f352d95f3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b2e61oot7ht35"
path="res://.godot/imported/crab_body.png-d5ff5fcdad64e46336ef16b4a3fb00c7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/crab_body.png"
dest_files=["res://.godot/imported/crab_body.png-d5ff5fcdad64e46336ef16b4a3fb00c7.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1005 B

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ruclqu4dc13u"
path="res://.godot/imported/crab_face.png-405026ec02e80559c79371d1bab55844.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/crab_face.png"
dest_files=["res://.godot/imported/crab_face.png-405026ec02e80559c79371d1bab55844.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://oagcnmxs0xx1"
path="res://.godot/imported/frog_body.png-ac6c4a085cb17c6bc169773a464b64b6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/frog_body.png"
dest_files=["res://.godot/imported/frog_body.png-ac6c4a085cb17c6bc169773a464b64b6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b4243242f34g0"
path="res://.godot/imported/frog_face.png-edba38b44d42deef80a709ade2e5e8f6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/frog_face.png"
dest_files=["res://.godot/imported/frog_face.png-edba38b44d42deef80a709ade2e5e8f6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://c0pixsxb7e5yd"
path="res://.godot/imported/garden_03_open.png-142fe10dfa5b6344ac20de2d61c58e7f.ctex"
uid="uid://bb3we2it550v6"
path="res://.godot/imported/jellyfish_body.png-a32700abbb41c080cba5614127a3edc3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_03_open.png"
dest_files=["res://.godot/imported/garden_03_open.png-142fe10dfa5b6344ac20de2d61c58e7f.ctex"]
source_file="res://assets/gardens/animals/jellyfish_body.png"
dest_files=["res://.godot/imported/jellyfish_body.png-a32700abbb41c080cba5614127a3edc3.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -2,16 +2,16 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://b5kildofgmthb"
path="res://.godot/imported/garden_01_open.png-e7e93db35611b0ad9dabe123854f1ab1.ctex"
uid="uid://dppmdv8u3cwl1"
path="res://.godot/imported/jellyfish_face.png-5c0a129760def337aa729a02e1028153.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_01_open.png"
dest_files=["res://.godot/imported/garden_01_open.png-e7e93db35611b0ad9dabe123854f1ab1.ctex"]
source_file="res://assets/gardens/animals/jellyfish_face.png"
dest_files=["res://.godot/imported/jellyfish_face.png-5c0a129760def337aa729a02e1028153.ctex"]
[params]
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dr12efhuotfgt"
path="res://.godot/imported/monkey_body.png-b049cc78b0f6869945a1c7d6a1301ad4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/monkey_body.png"
dest_files=["res://.godot/imported/monkey_body.png-b049cc78b0f6869945a1c7d6a1301ad4.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dc52xvm4y6rir"
path="res://.godot/imported/monkey_face.png-985109f289329f15999880cce0b5a16e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/monkey_face.png"
dest_files=["res://.godot/imported/monkey_face.png-985109f289329f15999880cce0b5a16e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c2yalimkyunxi"
path="res://.godot/imported/parakeet_body.png-9465060ca470033db7910f6ce2322a6d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/parakeet_body.png"
dest_files=["res://.godot/imported/parakeet_body.png-9465060ca470033db7910f6ce2322a6d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://l52tfb7fdrpt"
path="res://.godot/imported/parakeet_face.png-94d7bc7370d8ae647ca7d22a41893e3f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/parakeet_face.png"
dest_files=["res://.godot/imported/parakeet_face.png-94d7bc7370d8ae647ca7d22a41893e3f.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://noekve4gjudr"
path="res://.godot/imported/penguin_body.png-72481c56dc380b551e94e0f413ef0cf8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/penguin_body.png"
dest_files=["res://.godot/imported/penguin_body.png-72481c56dc380b551e94e0f413ef0cf8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbg7mxg3x7vd4"
path="res://.godot/imported/penguin_face.png-ea217ef7de954aee6edea62f83594216.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/penguin_face.png"
dest_files=["res://.godot/imported/penguin_face.png-ea217ef7de954aee6edea62f83594216.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b7rqldqdft30a"
path="res://.godot/imported/turtle_body.png-0f50da4036c6750167a288e6f006a813.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/turtle_body.png"
dest_files=["res://.godot/imported/turtle_body.png-0f50da4036c6750167a288e6f006a813.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://nu4kpbywwpgn"
path="res://.godot/imported/turtle_face.png-e570d8d931a8a1c99178dba731ef0fdb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/animals/turtle_face.png"
dest_files=["res://.godot/imported/turtle_face.png-e570d8d931a8a1c99178dba731ef0fdb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxjy5f7oyl8mq"
path="res://.godot/imported/lesson_circle.png-05f9dc6a36bb9c72360b598507504f72.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/buttons/lesson_circle.png"
dest_files=["res://.godot/imported/lesson_circle.png-05f9dc6a36bb9c72360b598507504f72.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c1ml42sp1vqga"
path="res://.godot/imported/movie_icon.png-3b93e2f2cfeeb8eec0332bbcd7cda143.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/buttons/movie_icon.png"
dest_files=["res://.godot/imported/movie_icon.png-3b93e2f2cfeeb8eec0332bbcd7cda143.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d26hapg1hf8a6"
path.s3tc="res://.godot/imported/garden_01.png-8cec30484a43f71cd614fe156e78443f.s3tc.ctex"
path.etc2="res://.godot/imported/garden_01.png-8cec30484a43f71cd614fe156e78443f.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_01.png"
dest_files=["res://.godot/imported/garden_01.png-8cec30484a43f71cd614fe156e78443f.s3tc.ctex", "res://.godot/imported/garden_01.png-8cec30484a43f71cd614fe156e78443f.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://4wt50lu3cwbl"
path.s3tc="res://.godot/imported/garden_02.png-952b73c44e8f297d7146afccf72fa6f8.s3tc.ctex"
path.etc2="res://.godot/imported/garden_02.png-952b73c44e8f297d7146afccf72fa6f8.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_02.png"
dest_files=["res://.godot/imported/garden_02.png-952b73c44e8f297d7146afccf72fa6f8.s3tc.ctex", "res://.godot/imported/garden_02.png-952b73c44e8f297d7146afccf72fa6f8.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ch1ah3nkjy5cl"
path.s3tc="res://.godot/imported/garden_03.png-5f6b1132537a67d14c76986a1aaf0c9e.s3tc.ctex"
path.etc2="res://.godot/imported/garden_03.png-5f6b1132537a67d14c76986a1aaf0c9e.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_03.png"
dest_files=["res://.godot/imported/garden_03.png-5f6b1132537a67d14c76986a1aaf0c9e.s3tc.ctex", "res://.godot/imported/garden_03.png-5f6b1132537a67d14c76986a1aaf0c9e.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://l32ekwfso26s"
path.s3tc="res://.godot/imported/garden_04.png-4af29a3ee810ade399f7fba358601b39.s3tc.ctex"
path.etc2="res://.godot/imported/garden_04.png-4af29a3ee810ade399f7fba358601b39.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_04.png"
dest_files=["res://.godot/imported/garden_04.png-4af29a3ee810ade399f7fba358601b39.s3tc.ctex", "res://.godot/imported/garden_04.png-4af29a3ee810ade399f7fba358601b39.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d3bu30iutptwx"
path.s3tc="res://.godot/imported/garden_05.png-b2eede99e5cfc7d755b398e252db8066.s3tc.ctex"
path.etc2="res://.godot/imported/garden_05.png-b2eede99e5cfc7d755b398e252db8066.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_05.png"
dest_files=["res://.godot/imported/garden_05.png-b2eede99e5cfc7d755b398e252db8066.s3tc.ctex", "res://.godot/imported/garden_05.png-b2eede99e5cfc7d755b398e252db8066.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://blg1nxeno6cwl"
path="res://.godot/imported/garden_05_open.png-ff5ee3f0e878fa03a8dea0ef133ca5ba.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_05_open.png"
dest_files=["res://.godot/imported/garden_05_open.png-ff5ee3f0e878fa03a8dea0ef133ca5ba.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bhamsdjj677b3"
path.s3tc="res://.godot/imported/garden_06.png-943860b612f9520e74a0732cde3cbfe6.s3tc.ctex"
path.etc2="res://.godot/imported/garden_06.png-943860b612f9520e74a0732cde3cbfe6.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_06.png"
dest_files=["res://.godot/imported/garden_06.png-943860b612f9520e74a0732cde3cbfe6.s3tc.ctex", "res://.godot/imported/garden_06.png-943860b612f9520e74a0732cde3cbfe6.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dimvsnhfd8y8q"
path="res://.godot/imported/garden_06_open.png-13105f591491c2be9fb6cc46e6c1a2d6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_06_open.png"
dest_files=["res://.godot/imported/garden_06_open.png-13105f591491c2be9fb6cc46e6c1a2d6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clcff3fg5jd2k"
path.s3tc="res://.godot/imported/garden_07.png-552b63ddceeb7d6136f933619623d519.s3tc.ctex"
path.etc2="res://.godot/imported/garden_07.png-552b63ddceeb7d6136f933619623d519.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_07.png"
dest_files=["res://.godot/imported/garden_07.png-552b63ddceeb7d6136f933619623d519.s3tc.ctex", "res://.godot/imported/garden_07.png-552b63ddceeb7d6136f933619623d519.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bhr21dw3baqrm"
path="res://.godot/imported/garden_07_open.png-d87f883f506a9836a782efbcfd1542f6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_07_open.png"
dest_files=["res://.godot/imported/garden_07_open.png-d87f883f506a9836a782efbcfd1542f6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://kgeoctiggnxx"
path.s3tc="res://.godot/imported/garden_08.png-60a000c144495dd62452995bc8932932.s3tc.ctex"
path.etc2="res://.godot/imported/garden_08.png-60a000c144495dd62452995bc8932932.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_08.png"
dest_files=["res://.godot/imported/garden_08.png-60a000c144495dd62452995bc8932932.s3tc.ctex", "res://.godot/imported/garden_08.png-60a000c144495dd62452995bc8932932.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://phoeyhvft3dc"
path="res://.godot/imported/garden_08_open.png-01bb33e901c94aea253f809b00da568d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_08_open.png"
dest_files=["res://.godot/imported/garden_08_open.png-01bb33e901c94aea253f809b00da568d.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dqk14m4demy3a"
path.s3tc="res://.godot/imported/garden_09.png-4a49e6b67d1574a86d201faadd295c12.s3tc.ctex"
path.etc2="res://.godot/imported/garden_09.png-4a49e6b67d1574a86d201faadd295c12.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_09.png"
dest_files=["res://.godot/imported/garden_09.png-4a49e6b67d1574a86d201faadd295c12.s3tc.ctex", "res://.godot/imported/garden_09.png-4a49e6b67d1574a86d201faadd295c12.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b6x6ypfyin4l5"
path="res://.godot/imported/garden_09_open.png-4056b229410a3403994326084102e6f5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_09_open.png"
dest_files=["res://.godot/imported/garden_09_open.png-4056b229410a3403994326084102e6f5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cahtl4j3wxahn"
path.s3tc="res://.godot/imported/garden_10.png-39a7d010b681ef7c20becd3e54ebced2.s3tc.ctex"
path.etc2="res://.godot/imported/garden_10.png-39a7d010b681ef7c20becd3e54ebced2.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_10.png"
dest_files=["res://.godot/imported/garden_10.png-39a7d010b681ef7c20becd3e54ebced2.s3tc.ctex", "res://.godot/imported/garden_10.png-39a7d010b681ef7c20becd3e54ebced2.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bryk735xd5r8j"
path="res://.godot/imported/garden_10_open.png-6df2b29b42d9313fb097ea589603ef68.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_10_open.png"
dest_files=["res://.godot/imported/garden_10_open.png-6df2b29b42d9313fb097ea589603ef68.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dpl670l7onk5n"
path.s3tc="res://.godot/imported/garden_11.png-cfde776b2d9c071e225bed94f36560e1.s3tc.ctex"
path.etc2="res://.godot/imported/garden_11.png-cfde776b2d9c071e225bed94f36560e1.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_11.png"
dest_files=["res://.godot/imported/garden_11.png-cfde776b2d9c071e225bed94f36560e1.s3tc.ctex", "res://.godot/imported/garden_11.png-cfde776b2d9c071e225bed94f36560e1.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d25ddek1hl6ca"
path="res://.godot/imported/garden_11_open.png-aaa76c2521c39c7b0116060068bfb598.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_11_open.png"
dest_files=["res://.godot/imported/garden_11_open.png-aaa76c2521c39c7b0116060068bfb598.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

@@ -0,0 +1,42 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b6pmtjjp4rejb"
path.s3tc="res://.godot/imported/garden_12.png-13d7be39631648987956568e37e0e56f.s3tc.ctex"
path.etc2="res://.godot/imported/garden_12.png-13d7be39631648987956568e37e0e56f.etc2.ctex"
metadata={
"imported_formats": ["s3tc_bptc", "etc2_astc"],
"vram_texture": true
}
[deps]
source_file="res://assets/gardens/gardens/garden_12.png"
dest_files=["res://.godot/imported/garden_12.png-13d7be39631648987956568e37e0e56f.s3tc.ctex", "res://.godot/imported/garden_12.png-13d7be39631648987956568e37e0e56f.etc2.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cgqf4g3rv36sq"
path="res://.godot/imported/garden_12_open.png-b78bc8ccfc5520f4bb7618fbebf7f572.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_12_open.png"
dest_files=["res://.godot/imported/garden_12_open.png-b78bc8ccfc5520f4bb7618fbebf7f572.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bv2riha86d4ac"
path="res://.godot/imported/garden_13_open.png-2f4b311fd8fdd52939d886204f85f5f1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_13_open.png"
dest_files=["res://.godot/imported/garden_13_open.png-2f4b311fd8fdd52939d886204f85f5f1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cr76law5eivwm"
path="res://.godot/imported/garden_14_open.png-a684fe2a5f05b9b7fd22838d53791afb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_14_open.png"
dest_files=["res://.godot/imported/garden_14_open.png-a684fe2a5f05b9b7fd22838d53791afb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cj6ois0siu3p0"
path="res://.godot/imported/garden_15_open.png-afb8688cb9957b71d459db3640d2b0b8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/gardens/gardens/garden_15_open.png"
dest_files=["res://.godot/imported/garden_15_open.png-afb8688cb9957b71d459db3640d2b0b8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

Some files were not shown because too many files have changed in this diff Show More