diff --git a/.github/scripts/check_gd_nomenclature.py b/.github/scripts/check_gd_nomenclature.py index 1f7f7c53..68564422 100644 --- a/.github/scripts/check_gd_nomenclature.py +++ b/.github/scripts/check_gd_nomenclature.py @@ -1,6 +1,7 @@ import os import re import sys +from collections import defaultdict, Counter def split_params(param_string: str): @@ -46,7 +47,7 @@ def split_params(param_string: str): current = [] else: current.append(char) - + if stack: raise ValueError("unbalance in delimiter") if in_quote: @@ -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 - if extends_pos != idx: - issues.append((path, content[extends_pos][1], 'extends_position', 'extends')) - idx = extends_pos + 1 + # 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,63 +389,65 @@ 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', - 'enum': 'enum_position', - 'const': 'const_position', - 'static var': 'static_position', - '@export': 'export_position', - 'var': 'var_position', + 'signal': 'signal_position', + 'enum': 'enum_position', + 'const': 'const_position', + 'static var': 'static_position', + '@export': 'export_position', + 'var': 'var_position', '@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: - 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.") + +# ─── 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': + 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("
") + print(f"{fpath} — {count} issue{'s' if count != 1 else ''}\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
\n") + +sys.exit(1) diff --git a/.github/workflows/gdscript-naming.yml b/.github/workflows/gdscript-naming.yml index d6dbe41a..60250ffb 100644 --- a/.github/workflows/gdscript-naming.yml +++ b/.github/workflows/gdscript-naming.yml @@ -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: | diff --git a/README.es.md b/README.es.md index 327c9afb..672400fa 100644 --- a/README.es.md +++ b/README.es.md @@ -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! diff --git a/README.fr.md b/README.fr.md index b4f24843..02b300d4 100644 --- a/README.fr.md +++ b/README.fr.md @@ -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 ! diff --git a/README.md b/README.md index 4d3bcd7a..2712711d 100644 --- a/README.md +++ b/README.md @@ -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! --- diff --git a/README.pt-br.md b/README.pt-br.md index 8c500831..94333824 100644 --- a/README.pt-br.md +++ b/README.pt-br.md @@ -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! diff --git a/addons/export_tool_manager/export_tool_exporter.gd b/addons/export_tool_manager/export_tool_exporter.gd index 675fff7f..8a004d14 100644 --- a/addons/export_tool_manager/export_tool_exporter.gd +++ b/addons/export_tool_manager/export_tool_exporter.gd @@ -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() diff --git a/addons/export_tool_manager/export_tool_manager_plugin.gd b/addons/export_tool_manager/export_tool_manager_plugin.gd index 2febc745..37f58e37 100644 --- a/addons/export_tool_manager/export_tool_manager_plugin.gd +++ b/addons/export_tool_manager/export_tool_manager_plugin.gd @@ -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()) diff --git a/addons/godot-form-validator/editor_icon.png.import b/addons/godot-form-validator/editor_icon.png.import index abf2a09d..cacdeae8 100644 --- a/addons/godot-form-validator/editor_icon.png.import +++ b/addons/godot-form-validator/editor_icon.png.import @@ -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 diff --git a/assets/bush_curtain.png.import b/assets/bush_curtain.png.import index d778f92c..21f5a3a3 100644 --- a/assets/bush_curtain.png.import +++ b/assets/bush_curtain.png.import @@ -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="" diff --git a/assets/gardens/animals/ant_body.png b/assets/gardens/animals/ant_body.png new file mode 100644 index 00000000..e5f31785 Binary files /dev/null and b/assets/gardens/animals/ant_body.png differ diff --git a/assets/lesson_screen/bottom.png.import b/assets/gardens/animals/ant_body.png.import similarity index 73% rename from assets/lesson_screen/bottom.png.import rename to assets/gardens/animals/ant_body.png.import index ff9b18a5..fa14d2ba 100644 --- a/assets/lesson_screen/bottom.png.import +++ b/assets/gardens/animals/ant_body.png.import @@ -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] diff --git a/assets/gardens/animals/ant_face.png b/assets/gardens/animals/ant_face.png new file mode 100644 index 00000000..db52694d Binary files /dev/null and b/assets/gardens/animals/ant_face.png differ diff --git a/assets/lesson_screen/branches.png.import b/assets/gardens/animals/ant_face.png.import similarity index 73% rename from assets/lesson_screen/branches.png.import rename to assets/gardens/animals/ant_face.png.import index 6f76bd84..1cf6d29f 100644 --- a/assets/lesson_screen/branches.png.import +++ b/assets/gardens/animals/ant_face.png.import @@ -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] diff --git a/assets/gardens/animals/caterpillar_body.png b/assets/gardens/animals/caterpillar_body.png new file mode 100644 index 00000000..4e5e4897 Binary files /dev/null and b/assets/gardens/animals/caterpillar_body.png differ diff --git a/assets/gardens/animals/caterpillar_body.png.import b/assets/gardens/animals/caterpillar_body.png.import new file mode 100644 index 00000000..2c501777 --- /dev/null +++ b/assets/gardens/animals/caterpillar_body.png.import @@ -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 diff --git a/assets/gardens/animals/caterpillar_face.png b/assets/gardens/animals/caterpillar_face.png new file mode 100644 index 00000000..4f070616 Binary files /dev/null and b/assets/gardens/animals/caterpillar_face.png differ diff --git a/assets/gardens/animals/caterpillar_face.png.import b/assets/gardens/animals/caterpillar_face.png.import new file mode 100644 index 00000000..f83f9ca2 --- /dev/null +++ b/assets/gardens/animals/caterpillar_face.png.import @@ -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 diff --git a/assets/gardens/animals/crab_body.png b/assets/gardens/animals/crab_body.png new file mode 100644 index 00000000..656f8af6 Binary files /dev/null and b/assets/gardens/animals/crab_body.png differ diff --git a/assets/gardens/animals/crab_body.png.import b/assets/gardens/animals/crab_body.png.import new file mode 100644 index 00000000..90ea3770 --- /dev/null +++ b/assets/gardens/animals/crab_body.png.import @@ -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 diff --git a/assets/gardens/animals/crab_face.png b/assets/gardens/animals/crab_face.png new file mode 100644 index 00000000..cdc629c5 Binary files /dev/null and b/assets/gardens/animals/crab_face.png differ diff --git a/assets/gardens/animals/crab_face.png.import b/assets/gardens/animals/crab_face.png.import new file mode 100644 index 00000000..67464eed --- /dev/null +++ b/assets/gardens/animals/crab_face.png.import @@ -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 diff --git a/assets/gardens/animals/frog_body.png b/assets/gardens/animals/frog_body.png new file mode 100644 index 00000000..4738bc83 Binary files /dev/null and b/assets/gardens/animals/frog_body.png differ diff --git a/assets/gardens/animals/frog_body.png.import b/assets/gardens/animals/frog_body.png.import new file mode 100644 index 00000000..fb0dab24 --- /dev/null +++ b/assets/gardens/animals/frog_body.png.import @@ -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 diff --git a/assets/gardens/animals/frog_face.png b/assets/gardens/animals/frog_face.png new file mode 100644 index 00000000..4c249c47 Binary files /dev/null and b/assets/gardens/animals/frog_face.png differ diff --git a/assets/gardens/animals/frog_face.png.import b/assets/gardens/animals/frog_face.png.import new file mode 100644 index 00000000..0471967a --- /dev/null +++ b/assets/gardens/animals/frog_face.png.import @@ -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 diff --git a/assets/gardens/animals/jellyfish_body.png b/assets/gardens/animals/jellyfish_body.png new file mode 100644 index 00000000..62529ad8 Binary files /dev/null and b/assets/gardens/animals/jellyfish_body.png differ diff --git a/assets/gardens/gardens/garden_03_open.png.import b/assets/gardens/animals/jellyfish_body.png.import similarity index 72% rename from assets/gardens/gardens/garden_03_open.png.import rename to assets/gardens/animals/jellyfish_body.png.import index 3a0fe03f..c2103f75 100644 --- a/assets/gardens/gardens/garden_03_open.png.import +++ b/assets/gardens/animals/jellyfish_body.png.import @@ -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] diff --git a/assets/gardens/animals/jellyfish_face.png b/assets/gardens/animals/jellyfish_face.png new file mode 100644 index 00000000..46d1299e Binary files /dev/null and b/assets/gardens/animals/jellyfish_face.png differ diff --git a/assets/gardens/gardens/garden_01_open.png.import b/assets/gardens/animals/jellyfish_face.png.import similarity index 72% rename from assets/gardens/gardens/garden_01_open.png.import rename to assets/gardens/animals/jellyfish_face.png.import index f2b0ff55..9f3ecb32 100644 --- a/assets/gardens/gardens/garden_01_open.png.import +++ b/assets/gardens/animals/jellyfish_face.png.import @@ -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] diff --git a/assets/gardens/animals/monkey_body.png b/assets/gardens/animals/monkey_body.png new file mode 100644 index 00000000..bc059f35 Binary files /dev/null and b/assets/gardens/animals/monkey_body.png differ diff --git a/assets/gardens/animals/monkey_body.png.import b/assets/gardens/animals/monkey_body.png.import new file mode 100644 index 00000000..62f624ab --- /dev/null +++ b/assets/gardens/animals/monkey_body.png.import @@ -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 diff --git a/assets/gardens/animals/monkey_face.png b/assets/gardens/animals/monkey_face.png new file mode 100644 index 00000000..769b9908 Binary files /dev/null and b/assets/gardens/animals/monkey_face.png differ diff --git a/assets/gardens/animals/monkey_face.png.import b/assets/gardens/animals/monkey_face.png.import new file mode 100644 index 00000000..e231d87e --- /dev/null +++ b/assets/gardens/animals/monkey_face.png.import @@ -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 diff --git a/assets/gardens/animals/parakeet_body.png b/assets/gardens/animals/parakeet_body.png new file mode 100644 index 00000000..655feea4 Binary files /dev/null and b/assets/gardens/animals/parakeet_body.png differ diff --git a/assets/gardens/animals/parakeet_body.png.import b/assets/gardens/animals/parakeet_body.png.import new file mode 100644 index 00000000..e2eb3b91 --- /dev/null +++ b/assets/gardens/animals/parakeet_body.png.import @@ -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 diff --git a/assets/gardens/animals/parakeet_face.png b/assets/gardens/animals/parakeet_face.png new file mode 100644 index 00000000..996edd06 Binary files /dev/null and b/assets/gardens/animals/parakeet_face.png differ diff --git a/assets/gardens/animals/parakeet_face.png.import b/assets/gardens/animals/parakeet_face.png.import new file mode 100644 index 00000000..048af348 --- /dev/null +++ b/assets/gardens/animals/parakeet_face.png.import @@ -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 diff --git a/assets/gardens/animals/penguin_body.png b/assets/gardens/animals/penguin_body.png new file mode 100644 index 00000000..1d7fda19 Binary files /dev/null and b/assets/gardens/animals/penguin_body.png differ diff --git a/assets/gardens/animals/penguin_body.png.import b/assets/gardens/animals/penguin_body.png.import new file mode 100644 index 00000000..76a24047 --- /dev/null +++ b/assets/gardens/animals/penguin_body.png.import @@ -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 diff --git a/assets/gardens/animals/penguin_face.png b/assets/gardens/animals/penguin_face.png new file mode 100644 index 00000000..ad9453a2 Binary files /dev/null and b/assets/gardens/animals/penguin_face.png differ diff --git a/assets/gardens/animals/penguin_face.png.import b/assets/gardens/animals/penguin_face.png.import new file mode 100644 index 00000000..0985f226 --- /dev/null +++ b/assets/gardens/animals/penguin_face.png.import @@ -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 diff --git a/assets/gardens/animals/turtle_body.png b/assets/gardens/animals/turtle_body.png new file mode 100644 index 00000000..5aec49b4 Binary files /dev/null and b/assets/gardens/animals/turtle_body.png differ diff --git a/assets/gardens/animals/turtle_body.png.import b/assets/gardens/animals/turtle_body.png.import new file mode 100644 index 00000000..03587e45 --- /dev/null +++ b/assets/gardens/animals/turtle_body.png.import @@ -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 diff --git a/assets/gardens/animals/turtle_face.png b/assets/gardens/animals/turtle_face.png new file mode 100644 index 00000000..95f4e789 Binary files /dev/null and b/assets/gardens/animals/turtle_face.png differ diff --git a/assets/gardens/animals/turtle_face.png.import b/assets/gardens/animals/turtle_face.png.import new file mode 100644 index 00000000..7fcd487d --- /dev/null +++ b/assets/gardens/animals/turtle_face.png.import @@ -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 diff --git a/assets/gardens/buttons/lesson_circle.png b/assets/gardens/buttons/lesson_circle.png new file mode 100644 index 00000000..d5b211b2 Binary files /dev/null and b/assets/gardens/buttons/lesson_circle.png differ diff --git a/assets/gardens/buttons/lesson_circle.png.import b/assets/gardens/buttons/lesson_circle.png.import new file mode 100644 index 00000000..8ea545ff --- /dev/null +++ b/assets/gardens/buttons/lesson_circle.png.import @@ -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 diff --git a/assets/gardens/buttons/movie_icon.png b/assets/gardens/buttons/movie_icon.png new file mode 100644 index 00000000..52bfb441 Binary files /dev/null and b/assets/gardens/buttons/movie_icon.png differ diff --git a/assets/gardens/buttons/movie_icon.png.import b/assets/gardens/buttons/movie_icon.png.import new file mode 100644 index 00000000..fb379f4b --- /dev/null +++ b/assets/gardens/buttons/movie_icon.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_01.png b/assets/gardens/gardens/garden_01.png new file mode 100644 index 00000000..8beebe15 Binary files /dev/null and b/assets/gardens/gardens/garden_01.png differ diff --git a/assets/gardens/gardens/garden_01.png.import b/assets/gardens/gardens/garden_01.png.import new file mode 100644 index 00000000..5cd1203e --- /dev/null +++ b/assets/gardens/gardens/garden_01.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_01_open.png b/assets/gardens/gardens/garden_01_open.png deleted file mode 100644 index dab93008..00000000 Binary files a/assets/gardens/gardens/garden_01_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_02.png b/assets/gardens/gardens/garden_02.png new file mode 100644 index 00000000..aa479489 Binary files /dev/null and b/assets/gardens/gardens/garden_02.png differ diff --git a/assets/gardens/gardens/garden_02.png.import b/assets/gardens/gardens/garden_02.png.import new file mode 100644 index 00000000..8621d4e1 --- /dev/null +++ b/assets/gardens/gardens/garden_02.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_02_open.png b/assets/gardens/gardens/garden_02_open.png deleted file mode 100644 index 67799f5c..00000000 Binary files a/assets/gardens/gardens/garden_02_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_03.png b/assets/gardens/gardens/garden_03.png new file mode 100644 index 00000000..04395cbc Binary files /dev/null and b/assets/gardens/gardens/garden_03.png differ diff --git a/assets/gardens/gardens/garden_03.png.import b/assets/gardens/gardens/garden_03.png.import new file mode 100644 index 00000000..25de4342 --- /dev/null +++ b/assets/gardens/gardens/garden_03.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_03_open.png b/assets/gardens/gardens/garden_03_open.png deleted file mode 100644 index 4cc28319..00000000 Binary files a/assets/gardens/gardens/garden_03_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_04.png b/assets/gardens/gardens/garden_04.png new file mode 100644 index 00000000..a52dfdf1 Binary files /dev/null and b/assets/gardens/gardens/garden_04.png differ diff --git a/assets/gardens/gardens/garden_04.png.import b/assets/gardens/gardens/garden_04.png.import new file mode 100644 index 00000000..fd835e54 --- /dev/null +++ b/assets/gardens/gardens/garden_04.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_04_open.png b/assets/gardens/gardens/garden_04_open.png deleted file mode 100644 index 6ee52f53..00000000 Binary files a/assets/gardens/gardens/garden_04_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_05.png b/assets/gardens/gardens/garden_05.png new file mode 100644 index 00000000..049a827f Binary files /dev/null and b/assets/gardens/gardens/garden_05.png differ diff --git a/assets/gardens/gardens/garden_05.png.import b/assets/gardens/gardens/garden_05.png.import new file mode 100644 index 00000000..45969c72 --- /dev/null +++ b/assets/gardens/gardens/garden_05.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_05_open.png b/assets/gardens/gardens/garden_05_open.png deleted file mode 100644 index 5d079d6b..00000000 Binary files a/assets/gardens/gardens/garden_05_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_05_open.png.import b/assets/gardens/gardens/garden_05_open.png.import deleted file mode 100644 index aff2baff..00000000 --- a/assets/gardens/gardens/garden_05_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_06.png b/assets/gardens/gardens/garden_06.png new file mode 100644 index 00000000..aafa8896 Binary files /dev/null and b/assets/gardens/gardens/garden_06.png differ diff --git a/assets/gardens/gardens/garden_06.png.import b/assets/gardens/gardens/garden_06.png.import new file mode 100644 index 00000000..91e6ae69 --- /dev/null +++ b/assets/gardens/gardens/garden_06.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_06_open.png b/assets/gardens/gardens/garden_06_open.png deleted file mode 100644 index 0759c004..00000000 Binary files a/assets/gardens/gardens/garden_06_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_06_open.png.import b/assets/gardens/gardens/garden_06_open.png.import deleted file mode 100644 index 7ddb38dd..00000000 --- a/assets/gardens/gardens/garden_06_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_07.png b/assets/gardens/gardens/garden_07.png new file mode 100644 index 00000000..5ab4a311 Binary files /dev/null and b/assets/gardens/gardens/garden_07.png differ diff --git a/assets/gardens/gardens/garden_07.png.import b/assets/gardens/gardens/garden_07.png.import new file mode 100644 index 00000000..8c448970 --- /dev/null +++ b/assets/gardens/gardens/garden_07.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_07_open.png b/assets/gardens/gardens/garden_07_open.png deleted file mode 100644 index 6a27ece7..00000000 Binary files a/assets/gardens/gardens/garden_07_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_07_open.png.import b/assets/gardens/gardens/garden_07_open.png.import deleted file mode 100644 index 1b5c05cf..00000000 --- a/assets/gardens/gardens/garden_07_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_08.png b/assets/gardens/gardens/garden_08.png new file mode 100644 index 00000000..67ff5e34 Binary files /dev/null and b/assets/gardens/gardens/garden_08.png differ diff --git a/assets/gardens/gardens/garden_08.png.import b/assets/gardens/gardens/garden_08.png.import new file mode 100644 index 00000000..ab825cf4 --- /dev/null +++ b/assets/gardens/gardens/garden_08.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_08_open.png b/assets/gardens/gardens/garden_08_open.png deleted file mode 100644 index 03047642..00000000 Binary files a/assets/gardens/gardens/garden_08_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_08_open.png.import b/assets/gardens/gardens/garden_08_open.png.import deleted file mode 100644 index d7d45bb3..00000000 --- a/assets/gardens/gardens/garden_08_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_09.png b/assets/gardens/gardens/garden_09.png new file mode 100644 index 00000000..5d0e7358 Binary files /dev/null and b/assets/gardens/gardens/garden_09.png differ diff --git a/assets/gardens/gardens/garden_09.png.import b/assets/gardens/gardens/garden_09.png.import new file mode 100644 index 00000000..ecb80bce --- /dev/null +++ b/assets/gardens/gardens/garden_09.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_09_open.png b/assets/gardens/gardens/garden_09_open.png deleted file mode 100644 index a331e545..00000000 Binary files a/assets/gardens/gardens/garden_09_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_09_open.png.import b/assets/gardens/gardens/garden_09_open.png.import deleted file mode 100644 index e61d6bf5..00000000 --- a/assets/gardens/gardens/garden_09_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_10.png b/assets/gardens/gardens/garden_10.png new file mode 100644 index 00000000..a52cfc96 Binary files /dev/null and b/assets/gardens/gardens/garden_10.png differ diff --git a/assets/gardens/gardens/garden_10.png.import b/assets/gardens/gardens/garden_10.png.import new file mode 100644 index 00000000..4990616e --- /dev/null +++ b/assets/gardens/gardens/garden_10.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_10_open.png b/assets/gardens/gardens/garden_10_open.png deleted file mode 100644 index 01894e8c..00000000 Binary files a/assets/gardens/gardens/garden_10_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_10_open.png.import b/assets/gardens/gardens/garden_10_open.png.import deleted file mode 100644 index 6634e8e6..00000000 --- a/assets/gardens/gardens/garden_10_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_11.png b/assets/gardens/gardens/garden_11.png new file mode 100644 index 00000000..aa479489 Binary files /dev/null and b/assets/gardens/gardens/garden_11.png differ diff --git a/assets/gardens/gardens/garden_11.png.import b/assets/gardens/gardens/garden_11.png.import new file mode 100644 index 00000000..fb5f77b2 --- /dev/null +++ b/assets/gardens/gardens/garden_11.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_11_open.png b/assets/gardens/gardens/garden_11_open.png deleted file mode 100644 index d53f2246..00000000 Binary files a/assets/gardens/gardens/garden_11_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_11_open.png.import b/assets/gardens/gardens/garden_11_open.png.import deleted file mode 100644 index b6a91cc4..00000000 --- a/assets/gardens/gardens/garden_11_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_12.png b/assets/gardens/gardens/garden_12.png new file mode 100644 index 00000000..a0308990 Binary files /dev/null and b/assets/gardens/gardens/garden_12.png differ diff --git a/assets/gardens/gardens/garden_12.png.import b/assets/gardens/gardens/garden_12.png.import new file mode 100644 index 00000000..779b2b8a --- /dev/null +++ b/assets/gardens/gardens/garden_12.png.import @@ -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 diff --git a/assets/gardens/gardens/garden_12_open.png b/assets/gardens/gardens/garden_12_open.png deleted file mode 100644 index 76327581..00000000 Binary files a/assets/gardens/gardens/garden_12_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_12_open.png.import b/assets/gardens/gardens/garden_12_open.png.import deleted file mode 100644 index d60eae77..00000000 --- a/assets/gardens/gardens/garden_12_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_13_open.png b/assets/gardens/gardens/garden_13_open.png deleted file mode 100644 index 79b99716..00000000 Binary files a/assets/gardens/gardens/garden_13_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_13_open.png.import b/assets/gardens/gardens/garden_13_open.png.import deleted file mode 100644 index 19a34adf..00000000 --- a/assets/gardens/gardens/garden_13_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_14_open.png b/assets/gardens/gardens/garden_14_open.png deleted file mode 100644 index 782bf918..00000000 Binary files a/assets/gardens/gardens/garden_14_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_14_open.png.import b/assets/gardens/gardens/garden_14_open.png.import deleted file mode 100644 index 523370d8..00000000 --- a/assets/gardens/gardens/garden_14_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_15_open.png b/assets/gardens/gardens/garden_15_open.png deleted file mode 100644 index dae75fe9..00000000 Binary files a/assets/gardens/gardens/garden_15_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_15_open.png.import b/assets/gardens/gardens/garden_15_open.png.import deleted file mode 100644 index 4cab13da..00000000 --- a/assets/gardens/gardens/garden_15_open.png.import +++ /dev/null @@ -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 diff --git a/assets/gardens/gardens/garden_16_open.png b/assets/gardens/gardens/garden_16_open.png deleted file mode 100644 index a053a7ec..00000000 Binary files a/assets/gardens/gardens/garden_16_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_16_open.png.import b/assets/gardens/gardens/garden_16_open.png.import deleted file mode 100644 index 3f48dc38..00000000 --- a/assets/gardens/gardens/garden_16_open.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dnf3rtpjplcuy" -path="res://.godot/imported/garden_16_open.png-8dc382c94b25d643da0f4c272f030507.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/gardens/gardens/garden_16_open.png" -dest_files=["res://.godot/imported/garden_16_open.png-8dc382c94b25d643da0f4c272f030507.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 diff --git a/assets/gardens/gardens/garden_17_open.png b/assets/gardens/gardens/garden_17_open.png deleted file mode 100644 index 86cf3b40..00000000 Binary files a/assets/gardens/gardens/garden_17_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_17_open.png.import b/assets/gardens/gardens/garden_17_open.png.import deleted file mode 100644 index a44b47c4..00000000 --- a/assets/gardens/gardens/garden_17_open.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://hxrd3u8mmyva" -path="res://.godot/imported/garden_17_open.png-2b4641eb9fe12519df915d2dc71726c5.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/gardens/gardens/garden_17_open.png" -dest_files=["res://.godot/imported/garden_17_open.png-2b4641eb9fe12519df915d2dc71726c5.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 diff --git a/assets/gardens/gardens/garden_18_open.png b/assets/gardens/gardens/garden_18_open.png deleted file mode 100644 index 85355655..00000000 Binary files a/assets/gardens/gardens/garden_18_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_18_open.png.import b/assets/gardens/gardens/garden_18_open.png.import deleted file mode 100644 index be95b2ef..00000000 --- a/assets/gardens/gardens/garden_18_open.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bsl6mak7ibs8u" -path="res://.godot/imported/garden_18_open.png-7d2735c0b768dd85586ed66eb2642db3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/gardens/gardens/garden_18_open.png" -dest_files=["res://.godot/imported/garden_18_open.png-7d2735c0b768dd85586ed66eb2642db3.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 diff --git a/assets/gardens/gardens/garden_19_open.png b/assets/gardens/gardens/garden_19_open.png deleted file mode 100644 index 7660b09b..00000000 Binary files a/assets/gardens/gardens/garden_19_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_19_open.png.import b/assets/gardens/gardens/garden_19_open.png.import deleted file mode 100644 index 969e5363..00000000 --- a/assets/gardens/gardens/garden_19_open.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://qt0xwdi4e2rl" -path="res://.godot/imported/garden_19_open.png-2ca751b5bc0547421c685471b99cec2e.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/gardens/gardens/garden_19_open.png" -dest_files=["res://.godot/imported/garden_19_open.png-2ca751b5bc0547421c685471b99cec2e.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 diff --git a/assets/gardens/gardens/garden_20_open.png b/assets/gardens/gardens/garden_20_open.png deleted file mode 100644 index b68ff295..00000000 Binary files a/assets/gardens/gardens/garden_20_open.png and /dev/null differ diff --git a/assets/gardens/gardens/garden_20_open.png.import b/assets/gardens/gardens/garden_20_open.png.import deleted file mode 100644 index 09d51939..00000000 --- a/assets/gardens/gardens/garden_20_open.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bme75rax1jvk6" -path="res://.godot/imported/garden_20_open.png-a1cdab8e6a30f2d98831565e2772f899.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://assets/gardens/gardens/garden_20_open.png" -dest_files=["res://.godot/imported/garden_20_open.png-a1cdab8e6a30f2d98831565e2772f899.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 diff --git a/assets/gardens/gardens/grid_mask.png.import b/assets/gardens/gardens/grid_mask.png.import index c5d09a15..d03ab0e7 100644 --- a/assets/gardens/gardens/grid_mask.png.import +++ b/assets/gardens/gardens/grid_mask.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://clwx5ksla5icp" -path="res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.ctex" +path.s3tc="res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.s3tc.ctex" +path.etc2="res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/gardens/gardens/grid_mask.png" -dest_files=["res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.ctex"] +dest_files=["res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.s3tc.ctex", "res://.godot/imported/grid_mask.png-7fa416ead6aed7fdc7f00b4b1f1af50b.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="" diff --git a/assets/gardens/victory_assets/animals/ant.png b/assets/gardens/victory_assets/animals/ant.png new file mode 100644 index 00000000..2511ac23 Binary files /dev/null and b/assets/gardens/victory_assets/animals/ant.png differ diff --git a/assets/lesson_screen/top_left.png.import b/assets/gardens/victory_assets/animals/ant.png.import similarity index 73% rename from assets/lesson_screen/top_left.png.import rename to assets/gardens/victory_assets/animals/ant.png.import index 7f8ebbf4..b6c20ad1 100644 --- a/assets/lesson_screen/top_left.png.import +++ b/assets/gardens/victory_assets/animals/ant.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dkomjpclxvmqf" -path="res://.godot/imported/top_left.png-2ca3f2b1716a8a640fa40c3a481bc4d9.ctex" +uid="uid://cn0brlkbklxuu" +path="res://.godot/imported/ant.png-d3fdfb32e41ad1bbed889f9d21d54167.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/top_left.png" -dest_files=["res://.godot/imported/top_left.png-2ca3f2b1716a8a640fa40c3a481bc4d9.ctex"] +source_file="res://assets/gardens/victory_assets/animals/ant.png" +dest_files=["res://.godot/imported/ant.png-d3fdfb32e41ad1bbed889f9d21d54167.ctex"] [params] diff --git a/assets/gardens/victory_assets/animals/caterpillar.png b/assets/gardens/victory_assets/animals/caterpillar.png new file mode 100644 index 00000000..9623840d Binary files /dev/null and b/assets/gardens/victory_assets/animals/caterpillar.png differ diff --git a/assets/gardens/gardens/garden_02_open.png.import b/assets/gardens/victory_assets/animals/caterpillar.png.import similarity index 71% rename from assets/gardens/gardens/garden_02_open.png.import rename to assets/gardens/victory_assets/animals/caterpillar.png.import index aeee97a7..60f51eb1 100644 --- a/assets/gardens/gardens/garden_02_open.png.import +++ b/assets/gardens/victory_assets/animals/caterpillar.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://ub4oq75e2bwa" -path="res://.godot/imported/garden_02_open.png-5e124ef51b64ed91ce4bc399e4062aef.ctex" +uid="uid://ixkyfsxu07qx" +path="res://.godot/imported/caterpillar.png-606aeb5ed693d22c4a80f41968e1d449.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/gardens/garden_02_open.png" -dest_files=["res://.godot/imported/garden_02_open.png-5e124ef51b64ed91ce4bc399e4062aef.ctex"] +source_file="res://assets/gardens/victory_assets/animals/caterpillar.png" +dest_files=["res://.godot/imported/caterpillar.png-606aeb5ed693d22c4a80f41968e1d449.ctex"] [params] diff --git a/assets/gardens/victory_assets/animals/crab.png b/assets/gardens/victory_assets/animals/crab.png new file mode 100644 index 00000000..7c411e64 Binary files /dev/null and b/assets/gardens/victory_assets/animals/crab.png differ diff --git a/assets/gardens/victory_assets/animals/crab.png.import b/assets/gardens/victory_assets/animals/crab.png.import new file mode 100644 index 00000000..05289d22 --- /dev/null +++ b/assets/gardens/victory_assets/animals/crab.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3vt2qpngkkjs" +path="res://.godot/imported/crab.png-6b9401bccc35a6e58de3bee1aa707608.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/crab.png" +dest_files=["res://.godot/imported/crab.png-6b9401bccc35a6e58de3bee1aa707608.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 diff --git a/assets/gardens/victory_assets/animals/frog.png b/assets/gardens/victory_assets/animals/frog.png new file mode 100644 index 00000000..3c273094 Binary files /dev/null and b/assets/gardens/victory_assets/animals/frog.png differ diff --git a/assets/gardens/victory_assets/animals/frog.png.import b/assets/gardens/victory_assets/animals/frog.png.import new file mode 100644 index 00000000..f5ebc738 --- /dev/null +++ b/assets/gardens/victory_assets/animals/frog.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yo3o4m6o7a0" +path="res://.godot/imported/frog.png-50e8b0bcbd5c11e9fc83314d35821855.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/frog.png" +dest_files=["res://.godot/imported/frog.png-50e8b0bcbd5c11e9fc83314d35821855.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 diff --git a/assets/gardens/victory_assets/animals/jellyfish.png b/assets/gardens/victory_assets/animals/jellyfish.png new file mode 100644 index 00000000..1187cac5 Binary files /dev/null and b/assets/gardens/victory_assets/animals/jellyfish.png differ diff --git a/assets/gardens/gardens/garden_04_open.png.import b/assets/gardens/victory_assets/animals/jellyfish.png.import similarity index 72% rename from assets/gardens/gardens/garden_04_open.png.import rename to assets/gardens/victory_assets/animals/jellyfish.png.import index 4cdeff3b..1a2acb72 100644 --- a/assets/gardens/gardens/garden_04_open.png.import +++ b/assets/gardens/victory_assets/animals/jellyfish.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cjqklky58388m" -path="res://.godot/imported/garden_04_open.png-7a3a0e761d247cb328030c591b691137.ctex" +uid="uid://bfqwlmmliem8f" +path="res://.godot/imported/jellyfish.png-fef4023badc953c6e37065baefef9dda.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/gardens/gardens/garden_04_open.png" -dest_files=["res://.godot/imported/garden_04_open.png-7a3a0e761d247cb328030c591b691137.ctex"] +source_file="res://assets/gardens/victory_assets/animals/jellyfish.png" +dest_files=["res://.godot/imported/jellyfish.png-fef4023badc953c6e37065baefef9dda.ctex"] [params] diff --git a/assets/gardens/victory_assets/animals/khaki_turtle.png b/assets/gardens/victory_assets/animals/khaki_turtle.png new file mode 100644 index 00000000..565ac0c9 Binary files /dev/null and b/assets/gardens/victory_assets/animals/khaki_turtle.png differ diff --git a/assets/gardens/victory_assets/animals/khaki_turtle.png.import b/assets/gardens/victory_assets/animals/khaki_turtle.png.import new file mode 100644 index 00000000..681d5646 --- /dev/null +++ b/assets/gardens/victory_assets/animals/khaki_turtle.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6bosyi1wv8vu" +path="res://.godot/imported/khaki_turtle.png-c9b0e5c5db5d16603c89e5aede131fd5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/khaki_turtle.png" +dest_files=["res://.godot/imported/khaki_turtle.png-c9b0e5c5db5d16603c89e5aede131fd5.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 diff --git a/assets/gardens/victory_assets/animals/monkey.png b/assets/gardens/victory_assets/animals/monkey.png new file mode 100644 index 00000000..1a129af5 Binary files /dev/null and b/assets/gardens/victory_assets/animals/monkey.png differ diff --git a/assets/gardens/victory_assets/animals/monkey.png.import b/assets/gardens/victory_assets/animals/monkey.png.import new file mode 100644 index 00000000..bfddf5ff --- /dev/null +++ b/assets/gardens/victory_assets/animals/monkey.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kygm5ieixgne" +path="res://.godot/imported/monkey.png-984367ba67c6aee1976b0b6e125be90d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/monkey.png" +dest_files=["res://.godot/imported/monkey.png-984367ba67c6aee1976b0b6e125be90d.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 diff --git a/assets/gardens/victory_assets/animals/penguin.png b/assets/gardens/victory_assets/animals/penguin.png new file mode 100644 index 00000000..cd70c6fc Binary files /dev/null and b/assets/gardens/victory_assets/animals/penguin.png differ diff --git a/assets/gardens/victory_assets/animals/penguin.png.import b/assets/gardens/victory_assets/animals/penguin.png.import new file mode 100644 index 00000000..c64d62f4 --- /dev/null +++ b/assets/gardens/victory_assets/animals/penguin.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cy1nrnl520goj" +path="res://.godot/imported/penguin.png-a3d9b15f5a490402f4093a86cd9fc481.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/penguin.png" +dest_files=["res://.godot/imported/penguin.png-a3d9b15f5a490402f4093a86cd9fc481.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 diff --git a/assets/gardens/victory_assets/animals/pink_jellyfish.png b/assets/gardens/victory_assets/animals/pink_jellyfish.png new file mode 100644 index 00000000..fff753f7 Binary files /dev/null and b/assets/gardens/victory_assets/animals/pink_jellyfish.png differ diff --git a/assets/gardens/victory_assets/animals/pink_jellyfish.png.import b/assets/gardens/victory_assets/animals/pink_jellyfish.png.import new file mode 100644 index 00000000..892c7d85 --- /dev/null +++ b/assets/gardens/victory_assets/animals/pink_jellyfish.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcuobvoav863b" +path.s3tc="res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.s3tc.ctex" +path.etc2="res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/pink_jellyfish.png" +dest_files=["res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.s3tc.ctex", "res://.godot/imported/pink_jellyfish.png-99508b215ac7a943286e22be8a93bcd0.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 diff --git a/assets/gardens/victory_assets/animals/red_parakeet.png b/assets/gardens/victory_assets/animals/red_parakeet.png new file mode 100644 index 00000000..1145355f Binary files /dev/null and b/assets/gardens/victory_assets/animals/red_parakeet.png differ diff --git a/assets/gardens/victory_assets/animals/red_parakeet.png.import b/assets/gardens/victory_assets/animals/red_parakeet.png.import new file mode 100644 index 00000000..8d6ccabe --- /dev/null +++ b/assets/gardens/victory_assets/animals/red_parakeet.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://da7ppeamjqjpw" +path="res://.godot/imported/red_parakeet.png-da45ba4c38e1e0997bf4da3dc9da41b8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/red_parakeet.png" +dest_files=["res://.godot/imported/red_parakeet.png-da45ba4c38e1e0997bf4da3dc9da41b8.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 diff --git a/assets/gardens/victory_assets/animals/turtle.png b/assets/gardens/victory_assets/animals/turtle.png new file mode 100644 index 00000000..51d44732 Binary files /dev/null and b/assets/gardens/victory_assets/animals/turtle.png differ diff --git a/assets/gardens/victory_assets/animals/turtle.png.import b/assets/gardens/victory_assets/animals/turtle.png.import new file mode 100644 index 00000000..a4fabc72 --- /dev/null +++ b/assets/gardens/victory_assets/animals/turtle.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bsw6v8ix7bb2s" +path="res://.godot/imported/turtle.png-c250d2a66dd72bd5fa41354b999b1000.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/turtle.png" +dest_files=["res://.godot/imported/turtle.png-c250d2a66dd72bd5fa41354b999b1000.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 diff --git a/assets/gardens/victory_assets/animals/yellow_parakeet.png b/assets/gardens/victory_assets/animals/yellow_parakeet.png new file mode 100644 index 00000000..96bc2a14 Binary files /dev/null and b/assets/gardens/victory_assets/animals/yellow_parakeet.png differ diff --git a/assets/gardens/victory_assets/animals/yellow_parakeet.png.import b/assets/gardens/victory_assets/animals/yellow_parakeet.png.import new file mode 100644 index 00000000..834d3466 --- /dev/null +++ b/assets/gardens/victory_assets/animals/yellow_parakeet.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bd5pxoufamqy" +path="res://.godot/imported/yellow_parakeet.png-3b1b7946f714148f55147e3efdf195ad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/animals/yellow_parakeet.png" +dest_files=["res://.godot/imported/yellow_parakeet.png-3b1b7946f714148f55147e3efdf195ad.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 diff --git a/assets/gardens/victory_assets/victory_asset_bees.png b/assets/gardens/victory_assets/victory_asset_bees.png new file mode 100644 index 00000000..005785bd Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_bees.png differ diff --git a/assets/gardens/victory_assets/victory_asset_bees.png.import b/assets/gardens/victory_assets/victory_asset_bees.png.import new file mode 100644 index 00000000..420fb686 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_bees.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dw3qhu03gxfi7" +path="res://.godot/imported/victory_asset_bees.png-934a516ebd4fefde1dc11195a7ed88a8.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_bees.png" +dest_files=["res://.godot/imported/victory_asset_bees.png-934a516ebd4fefde1dc11195a7ed88a8.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 diff --git a/assets/gardens/victory_assets/victory_asset_bird_treehouse.png b/assets/gardens/victory_assets/victory_asset_bird_treehouse.png new file mode 100644 index 00000000..3feb1dbc Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_bird_treehouse.png differ diff --git a/assets/gardens/victory_assets/victory_asset_bird_treehouse.png.import b/assets/gardens/victory_assets/victory_asset_bird_treehouse.png.import new file mode 100644 index 00000000..021fdf82 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_bird_treehouse.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqafuj82xbdqm" +path="res://.godot/imported/victory_asset_bird_treehouse.png-13d9c56abdcabfcb3b744e08f7e7fbf5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_bird_treehouse.png" +dest_files=["res://.godot/imported/victory_asset_bird_treehouse.png-13d9c56abdcabfcb3b744e08f7e7fbf5.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 diff --git a/assets/gardens/victory_assets/victory_asset_birds.png b/assets/gardens/victory_assets/victory_asset_birds.png new file mode 100644 index 00000000..27199503 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_birds.png differ diff --git a/assets/gardens/victory_assets/victory_asset_birds.png.import b/assets/gardens/victory_assets/victory_asset_birds.png.import new file mode 100644 index 00000000..6151ad40 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_birds.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddneerabvuyoe" +path="res://.godot/imported/victory_asset_birds.png-242acea68074c829a495641c63004ea5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_birds.png" +dest_files=["res://.godot/imported/victory_asset_birds.png-242acea68074c829a495641c63004ea5.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 diff --git a/assets/gardens/victory_assets/victory_asset_bubbles.png b/assets/gardens/victory_assets/victory_asset_bubbles.png new file mode 100644 index 00000000..21b15a87 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_bubbles.png differ diff --git a/assets/gardens/victory_assets/victory_asset_bubbles.png.import b/assets/gardens/victory_assets/victory_asset_bubbles.png.import new file mode 100644 index 00000000..1eee76c6 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_bubbles.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvxnktx1wiyxp" +path="res://.godot/imported/victory_asset_bubbles.png-27a3e634297a833979e13e2de7695db2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_bubbles.png" +dest_files=["res://.godot/imported/victory_asset_bubbles.png-27a3e634297a833979e13e2de7695db2.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 diff --git a/assets/gardens/victory_assets/victory_asset_butterfly_01.png b/assets/gardens/victory_assets/victory_asset_butterfly_01.png new file mode 100644 index 00000000..c72540fd Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_butterfly_01.png differ diff --git a/assets/gardens/victory_assets/victory_asset_butterfly_01.png.import b/assets/gardens/victory_assets/victory_asset_butterfly_01.png.import new file mode 100644 index 00000000..64429c39 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_butterfly_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://its5dfr0ipak" +path="res://.godot/imported/victory_asset_butterfly_01.png-7a4e0e5887a2eebe8906426e3e1ed1ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" +dest_files=["res://.godot/imported/victory_asset_butterfly_01.png-7a4e0e5887a2eebe8906426e3e1ed1ba.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 diff --git a/assets/gardens/victory_assets/victory_asset_butterfly_02.png b/assets/gardens/victory_assets/victory_asset_butterfly_02.png new file mode 100644 index 00000000..4d016e5b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_butterfly_02.png differ diff --git a/assets/gardens/victory_assets/victory_asset_butterfly_02.png.import b/assets/gardens/victory_assets/victory_asset_butterfly_02.png.import new file mode 100644 index 00000000..6d570f12 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_butterfly_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://db6cwc8crw6wo" +path="res://.godot/imported/victory_asset_butterfly_02.png-ed95a0eecd9f0f5244861b57d354ca85.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_butterfly_02.png" +dest_files=["res://.godot/imported/victory_asset_butterfly_02.png-ed95a0eecd9f0f5244861b57d354ca85.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 diff --git a/assets/gardens/victory_assets/victory_asset_cloud_snow.png b/assets/gardens/victory_assets/victory_asset_cloud_snow.png new file mode 100644 index 00000000..111f8ac2 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_cloud_snow.png differ diff --git a/assets/gardens/victory_assets/victory_asset_cloud_snow.png.import b/assets/gardens/victory_assets/victory_asset_cloud_snow.png.import new file mode 100644 index 00000000..1505a151 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_cloud_snow.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://0g80o48ewp7d" +path="res://.godot/imported/victory_asset_cloud_snow.png-30930e8c12b5c0cea32b00b8daf77e3a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_cloud_snow.png" +dest_files=["res://.godot/imported/victory_asset_cloud_snow.png-30930e8c12b5c0cea32b00b8daf77e3a.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 diff --git a/assets/gardens/victory_assets/victory_asset_clouds.png b/assets/gardens/victory_assets/victory_asset_clouds.png new file mode 100644 index 00000000..8e68d5a4 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_clouds.png differ diff --git a/assets/gardens/victory_assets/victory_asset_clouds.png.import b/assets/gardens/victory_assets/victory_asset_clouds.png.import new file mode 100644 index 00000000..e4debaff --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_clouds.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0lcx7x0naofl" +path="res://.godot/imported/victory_asset_clouds.png-aca6a147647b5e27b0e20e0446659cd0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_clouds.png" +dest_files=["res://.godot/imported/victory_asset_clouds.png-aca6a147647b5e27b0e20e0446659cd0.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 diff --git a/assets/gardens/victory_assets/victory_asset_coconut.png b/assets/gardens/victory_assets/victory_asset_coconut.png new file mode 100644 index 00000000..cce3ff84 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_coconut.png differ diff --git a/assets/gardens/victory_assets/victory_asset_coconut.png.import b/assets/gardens/victory_assets/victory_asset_coconut.png.import new file mode 100644 index 00000000..766f05f6 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_coconut.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d3i313p52n6h8" +path="res://.godot/imported/victory_asset_coconut.png-931b3a5a5bc8f484fbb35bf25285930f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_coconut.png" +dest_files=["res://.godot/imported/victory_asset_coconut.png-931b3a5a5bc8f484fbb35bf25285930f.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 diff --git a/assets/gardens/victory_assets/victory_asset_crown.png b/assets/gardens/victory_assets/victory_asset_crown.png new file mode 100644 index 00000000..c963a5ab Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_crown.png differ diff --git a/assets/gardens/victory_assets/victory_asset_crown.png.import b/assets/gardens/victory_assets/victory_asset_crown.png.import new file mode 100644 index 00000000..ad7ed6bf --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_crown.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uepox6kvky5" +path="res://.godot/imported/victory_asset_crown.png-e7d91a08ad158b724244b74569623184.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_crown.png" +dest_files=["res://.godot/imported/victory_asset_crown.png-e7d91a08ad158b724244b74569623184.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 diff --git a/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png b/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png new file mode 100644 index 00000000..24762e1b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png differ diff --git a/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png.import b/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png.import new file mode 100644 index 00000000..5429dd42 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_dragon_flies_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bv510d5r4dn82" +path="res://.godot/imported/victory_asset_dragon_flies_01.png-5858ef66117e89feb4417da84d8707d1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_dragon_flies_01.png" +dest_files=["res://.godot/imported/victory_asset_dragon_flies_01.png-5858ef66117e89feb4417da84d8707d1.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 diff --git a/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png b/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png new file mode 100644 index 00000000..7ab32637 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png differ diff --git a/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png.import b/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png.import new file mode 100644 index 00000000..4feb8d8d --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_dragon_flies_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://o1af03kn2mcg" +path="res://.godot/imported/victory_asset_dragon_flies_02.png-3837d155bfe6c20cbe0d1e24e148c22f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_dragon_flies_02.png" +dest_files=["res://.godot/imported/victory_asset_dragon_flies_02.png-3837d155bfe6c20cbe0d1e24e148c22f.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 diff --git a/assets/gardens/victory_assets/victory_asset_fish_01.png b/assets/gardens/victory_assets/victory_asset_fish_01.png new file mode 100644 index 00000000..140fe969 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_fish_01.png differ diff --git a/assets/gardens/victory_assets/victory_asset_fish_01.png.import b/assets/gardens/victory_assets/victory_asset_fish_01.png.import new file mode 100644 index 00000000..84c8bc78 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_fish_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgssb0oonuqku" +path="res://.godot/imported/victory_asset_fish_01.png-7e759ae834a4c009eab84c8b5dc89312.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_fish_01.png" +dest_files=["res://.godot/imported/victory_asset_fish_01.png-7e759ae834a4c009eab84c8b5dc89312.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 diff --git a/assets/gardens/victory_assets/victory_asset_fish_02.png b/assets/gardens/victory_assets/victory_asset_fish_02.png new file mode 100644 index 00000000..3aa0790b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_fish_02.png differ diff --git a/assets/gardens/victory_assets/victory_asset_fish_02.png.import b/assets/gardens/victory_assets/victory_asset_fish_02.png.import new file mode 100644 index 00000000..a48e3003 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_fish_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dt2a0dea0hv0c" +path="res://.godot/imported/victory_asset_fish_02.png-1ff3c680b36383fe931769b1bcd13df4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_fish_02.png" +dest_files=["res://.godot/imported/victory_asset_fish_02.png-1ff3c680b36383fe931769b1bcd13df4.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 diff --git a/assets/gardens/victory_assets/victory_asset_flies.png b/assets/gardens/victory_assets/victory_asset_flies.png new file mode 100644 index 00000000..0fd724d6 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_flies.png differ diff --git a/assets/gardens/victory_assets/victory_asset_flies.png.import b/assets/gardens/victory_assets/victory_asset_flies.png.import new file mode 100644 index 00000000..d2d2f4b3 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_flies.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bf77plws02i6k" +path="res://.godot/imported/victory_asset_flies.png-ce7e1e93fc88b385023434b2f574979b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_flies.png" +dest_files=["res://.godot/imported/victory_asset_flies.png-ce7e1e93fc88b385023434b2f574979b.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 diff --git a/assets/gardens/victory_assets/victory_asset_frog.png b/assets/gardens/victory_assets/victory_asset_frog.png new file mode 100644 index 00000000..de34c95f Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_frog.png differ diff --git a/assets/gardens/victory_assets/victory_asset_frog.png.import b/assets/gardens/victory_assets/victory_asset_frog.png.import new file mode 100644 index 00000000..59b07735 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_frog.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://crkysknynt38e" +path="res://.godot/imported/victory_asset_frog.png-c356010377e4cb45a7d99cd9fc676fd7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_frog.png" +dest_files=["res://.godot/imported/victory_asset_frog.png-c356010377e4cb45a7d99cd9fc676fd7.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 diff --git a/assets/gardens/victory_assets/victory_asset_hearts.png b/assets/gardens/victory_assets/victory_asset_hearts.png new file mode 100644 index 00000000..48a39e59 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_hearts.png differ diff --git a/assets/gardens/victory_assets/victory_asset_hearts.png.import b/assets/gardens/victory_assets/victory_asset_hearts.png.import new file mode 100644 index 00000000..576f5e30 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_hearts.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckmw2sfht4bq5" +path="res://.godot/imported/victory_asset_hearts.png-cdd759089987350f3e756face242c158.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_hearts.png" +dest_files=["res://.godot/imported/victory_asset_hearts.png-cdd759089987350f3e756face242c158.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 diff --git a/assets/gardens/victory_assets/victory_asset_ladybug.png b/assets/gardens/victory_assets/victory_asset_ladybug.png new file mode 100644 index 00000000..675585c4 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_ladybug.png differ diff --git a/assets/gardens/victory_assets/victory_asset_ladybug.png.import b/assets/gardens/victory_assets/victory_asset_ladybug.png.import new file mode 100644 index 00000000..b21eadf6 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_ladybug.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dr6cq4ua8fnk3" +path="res://.godot/imported/victory_asset_ladybug.png-3b27377e46f30f6942a09a9be9db6333.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_ladybug.png" +dest_files=["res://.godot/imported/victory_asset_ladybug.png-3b27377e46f30f6942a09a9be9db6333.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 diff --git a/assets/gardens/victory_assets/victory_asset_ladybugs.png b/assets/gardens/victory_assets/victory_asset_ladybugs.png new file mode 100644 index 00000000..909db4aa Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_ladybugs.png differ diff --git a/assets/gardens/victory_assets/victory_asset_ladybugs.png.import b/assets/gardens/victory_assets/victory_asset_ladybugs.png.import new file mode 100644 index 00000000..b4294b6c --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_ladybugs.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpqo8maufc3gr" +path="res://.godot/imported/victory_asset_ladybugs.png-8a903ba7f287aa7dbf9a9a4bc8db8f06.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_ladybugs.png" +dest_files=["res://.godot/imported/victory_asset_ladybugs.png-8a903ba7f287aa7dbf9a9a4bc8db8f06.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 diff --git a/assets/gardens/victory_assets/victory_asset_leaves.png b/assets/gardens/victory_assets/victory_asset_leaves.png new file mode 100644 index 00000000..14851379 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_leaves.png differ diff --git a/assets/gardens/victory_assets/victory_asset_leaves.png.import b/assets/gardens/victory_assets/victory_asset_leaves.png.import new file mode 100644 index 00000000..392b1d61 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_leaves.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bokqjqq5uaar3" +path="res://.godot/imported/victory_asset_leaves.png-95e00928f462a81afaadabdcca7254fd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_leaves.png" +dest_files=["res://.godot/imported/victory_asset_leaves.png-95e00928f462a81afaadabdcca7254fd.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 diff --git a/assets/gardens/victory_assets/victory_asset_monkey.png b/assets/gardens/victory_assets/victory_asset_monkey.png new file mode 100644 index 00000000..3b7f1fb8 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_monkey.png differ diff --git a/assets/gardens/victory_assets/victory_asset_monkey.png.import b/assets/gardens/victory_assets/victory_asset_monkey.png.import new file mode 100644 index 00000000..23613d24 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_monkey.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlxljmb4wnx2o" +path="res://.godot/imported/victory_asset_monkey.png-b0d3931ac5452f3ae9049211f1be3938.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_monkey.png" +dest_files=["res://.godot/imported/victory_asset_monkey.png-b0d3931ac5452f3ae9049211f1be3938.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 diff --git a/assets/gardens/victory_assets/victory_asset_moon.png b/assets/gardens/victory_assets/victory_asset_moon.png new file mode 100644 index 00000000..0c20b16b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_moon.png differ diff --git a/assets/gardens/victory_assets/victory_asset_moon.png.import b/assets/gardens/victory_assets/victory_asset_moon.png.import new file mode 100644 index 00000000..a056fdaa --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_moon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cbq3e4in12oeh" +path="res://.godot/imported/victory_asset_moon.png-afc3fbf57e18ddd6ad37a34d359b5bef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_moon.png" +dest_files=["res://.godot/imported/victory_asset_moon.png-afc3fbf57e18ddd6ad37a34d359b5bef.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 diff --git a/assets/gardens/victory_assets/victory_asset_mountain.png b/assets/gardens/victory_assets/victory_asset_mountain.png new file mode 100644 index 00000000..47711977 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_mountain.png differ diff --git a/assets/gardens/victory_assets/victory_asset_mountain.png.import b/assets/gardens/victory_assets/victory_asset_mountain.png.import new file mode 100644 index 00000000..11b4a92a --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_mountain.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://jid1k44bn2xx" +path="res://.godot/imported/victory_asset_mountain.png-6e4397a6067eb94304454f8153a27fe5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_mountain.png" +dest_files=["res://.godot/imported/victory_asset_mountain.png-6e4397a6067eb94304454f8153a27fe5.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 diff --git a/assets/gardens/victory_assets/victory_asset_mushroom.png b/assets/gardens/victory_assets/victory_asset_mushroom.png new file mode 100644 index 00000000..0dd78fa5 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_mushroom.png differ diff --git a/assets/gardens/victory_assets/victory_asset_mushroom.png.import b/assets/gardens/victory_assets/victory_asset_mushroom.png.import new file mode 100644 index 00000000..33997031 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_mushroom.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://coxmj8uwyu6vd" +path="res://.godot/imported/victory_asset_mushroom.png-0283921e9c95af515ff729e1730f7906.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_mushroom.png" +dest_files=["res://.godot/imported/victory_asset_mushroom.png-0283921e9c95af515ff729e1730f7906.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 diff --git a/assets/gardens/victory_assets/victory_asset_pearl.png b/assets/gardens/victory_assets/victory_asset_pearl.png new file mode 100644 index 00000000..6e07a3d2 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_pearl.png differ diff --git a/assets/gardens/victory_assets/victory_asset_pearl.png.import b/assets/gardens/victory_assets/victory_asset_pearl.png.import new file mode 100644 index 00000000..d97811c4 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_pearl.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpxc4vhri16pd" +path="res://.godot/imported/victory_asset_pearl.png-82dc33627b8a389923bbd16ea16c279c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_pearl.png" +dest_files=["res://.godot/imported/victory_asset_pearl.png-82dc33627b8a389923bbd16ea16c279c.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_01.png b/assets/gardens/victory_assets/victory_asset_plant_01.png new file mode 100644 index 00000000..03b738ac Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_01.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_01.png.import b/assets/gardens/victory_assets/victory_asset_plant_01.png.import new file mode 100644 index 00000000..69d0e23d --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_01.png.import @@ -0,0 +1,42 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcekseb1b3ruw" +path.s3tc="res://.godot/imported/victory_asset_plant_01.png-931e26d06bf2aa7ff030305e632dead0.s3tc.ctex" +path.etc2="res://.godot/imported/victory_asset_plant_01.png-931e26d06bf2aa7ff030305e632dead0.etc2.ctex" +metadata={ +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_01.png" +dest_files=["res://.godot/imported/victory_asset_plant_01.png-931e26d06bf2aa7ff030305e632dead0.s3tc.ctex", "res://.godot/imported/victory_asset_plant_01.png-931e26d06bf2aa7ff030305e632dead0.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_02.png b/assets/gardens/victory_assets/victory_asset_plant_02.png new file mode 100644 index 00000000..825aa221 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_02.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_02.png.import b/assets/gardens/victory_assets/victory_asset_plant_02.png.import new file mode 100644 index 00000000..849d10ef --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_02.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://clkr31osbqs7u" +path="res://.godot/imported/victory_asset_plant_02.png-7202fa4053bf90debf66b1558948550a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_02.png" +dest_files=["res://.godot/imported/victory_asset_plant_02.png-7202fa4053bf90debf66b1558948550a.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_03.png b/assets/gardens/victory_assets/victory_asset_plant_03.png new file mode 100644 index 00000000..87c507e2 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_03.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_03.png.import b/assets/gardens/victory_assets/victory_asset_plant_03.png.import new file mode 100644 index 00000000..070dee03 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_03.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqp1nkk53y1is" +path="res://.godot/imported/victory_asset_plant_03.png-e1490e2e2e4c276eb3d0257cdf212aae.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_03.png" +dest_files=["res://.godot/imported/victory_asset_plant_03.png-e1490e2e2e4c276eb3d0257cdf212aae.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_04.png b/assets/gardens/victory_assets/victory_asset_plant_04.png new file mode 100644 index 00000000..71af402f Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_04.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_04.png.import b/assets/gardens/victory_assets/victory_asset_plant_04.png.import new file mode 100644 index 00000000..4acd7e65 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_04.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://f2arml2f4b8p" +path="res://.godot/imported/victory_asset_plant_04.png-e92f322c2a4c595e8239e4e79d8d0e9e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_04.png" +dest_files=["res://.godot/imported/victory_asset_plant_04.png-e92f322c2a4c595e8239e4e79d8d0e9e.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_05.png b/assets/gardens/victory_assets/victory_asset_plant_05.png new file mode 100644 index 00000000..5bece57b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_05.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_05.png.import b/assets/gardens/victory_assets/victory_asset_plant_05.png.import new file mode 100644 index 00000000..f31a6341 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_05.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dufnm3bkfe5yv" +path="res://.godot/imported/victory_asset_plant_05.png-49d2b7f064ff17bcbd648c5f6e263763.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_05.png" +dest_files=["res://.godot/imported/victory_asset_plant_05.png-49d2b7f064ff17bcbd648c5f6e263763.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_06.png b/assets/gardens/victory_assets/victory_asset_plant_06.png new file mode 100644 index 00000000..70c71c03 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_06.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_06.png.import b/assets/gardens/victory_assets/victory_asset_plant_06.png.import new file mode 100644 index 00000000..182b6130 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_06.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dckd1xhcdf2ie" +path="res://.godot/imported/victory_asset_plant_06.png-753519d3836a436fa95725340824c875.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_06.png" +dest_files=["res://.godot/imported/victory_asset_plant_06.png-753519d3836a436fa95725340824c875.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_07.png b/assets/gardens/victory_assets/victory_asset_plant_07.png new file mode 100644 index 00000000..2fb610dd Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_07.png differ diff --git a/assets/lesson_screen/top_right.png.import b/assets/gardens/victory_assets/victory_asset_plant_07.png.import similarity index 76% rename from assets/lesson_screen/top_right.png.import rename to assets/gardens/victory_assets/victory_asset_plant_07.png.import index 03abd99d..a833fcfe 100644 --- a/assets/lesson_screen/top_right.png.import +++ b/assets/gardens/victory_assets/victory_asset_plant_07.png.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://rux5delnabp5" -path="res://.godot/imported/top_right.png-a3fce06eb378a6a99fc8fd188e21fb8c.ctex" +uid="uid://dro75vltqiq6j" +path="res://.godot/imported/victory_asset_plant_07.png-6cedb5530be4f4e8792cd79a73f66851.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/lesson_screen/top_right.png" -dest_files=["res://.godot/imported/top_right.png-a3fce06eb378a6a99fc8fd188e21fb8c.ctex"] +source_file="res://assets/gardens/victory_assets/victory_asset_plant_07.png" +dest_files=["res://.godot/imported/victory_asset_plant_07.png-6cedb5530be4f4e8792cd79a73f66851.ctex"] [params] diff --git a/assets/gardens/victory_assets/victory_asset_plant_08.png b/assets/gardens/victory_assets/victory_asset_plant_08.png new file mode 100644 index 00000000..0b4c00ff Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_08.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_08.png.import b/assets/gardens/victory_assets/victory_asset_plant_08.png.import new file mode 100644 index 00000000..f0e97947 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_08.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://blaltndbcv2yq" +path="res://.godot/imported/victory_asset_plant_08.png-b68d871b2af2e7a8264c50f18f211a0e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_08.png" +dest_files=["res://.godot/imported/victory_asset_plant_08.png-b68d871b2af2e7a8264c50f18f211a0e.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_09.png b/assets/gardens/victory_assets/victory_asset_plant_09.png new file mode 100644 index 00000000..bf0e7ad5 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_09.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_09.png.import b/assets/gardens/victory_assets/victory_asset_plant_09.png.import new file mode 100644 index 00000000..215cdf27 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_09.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://co6vu63bybpnc" +path="res://.godot/imported/victory_asset_plant_09.png-1d79940fcd5d19c3d71679d574480ddd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_09.png" +dest_files=["res://.godot/imported/victory_asset_plant_09.png-1d79940fcd5d19c3d71679d574480ddd.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_10.png b/assets/gardens/victory_assets/victory_asset_plant_10.png new file mode 100644 index 00000000..9488a318 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_10.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_10.png.import b/assets/gardens/victory_assets/victory_asset_plant_10.png.import new file mode 100644 index 00000000..e68b39e2 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_10.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://gm5x5p2f07rh" +path="res://.godot/imported/victory_asset_plant_10.png-a1d163c2e0ae69f15a2dc71739934513.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_10.png" +dest_files=["res://.godot/imported/victory_asset_plant_10.png-a1d163c2e0ae69f15a2dc71739934513.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_11.png b/assets/gardens/victory_assets/victory_asset_plant_11.png new file mode 100644 index 00000000..e530897d Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_11.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_11.png.import b/assets/gardens/victory_assets/victory_asset_plant_11.png.import new file mode 100644 index 00000000..a06e7f1f --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_11.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yriarwydqmmg" +path="res://.godot/imported/victory_asset_plant_11.png-99a94c0cd8c520b71420c3af9a773913.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_11.png" +dest_files=["res://.godot/imported/victory_asset_plant_11.png-99a94c0cd8c520b71420c3af9a773913.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_12.png b/assets/gardens/victory_assets/victory_asset_plant_12.png new file mode 100644 index 00000000..5f6efad1 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_12.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_12.png.import b/assets/gardens/victory_assets/victory_asset_plant_12.png.import new file mode 100644 index 00000000..0096190e --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_12.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ipos556o7hlw" +path="res://.godot/imported/victory_asset_plant_12.png-7105825241d97a53391455f102ce3b75.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_12.png" +dest_files=["res://.godot/imported/victory_asset_plant_12.png-7105825241d97a53391455f102ce3b75.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_13.png b/assets/gardens/victory_assets/victory_asset_plant_13.png new file mode 100644 index 00000000..eca74f7e Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_13.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_13.png.import b/assets/gardens/victory_assets/victory_asset_plant_13.png.import new file mode 100644 index 00000000..4954d66c --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_13.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqr3eqdfebceh" +path="res://.godot/imported/victory_asset_plant_13.png-eeb6e329c877119a53c8a2f68e710c08.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_13.png" +dest_files=["res://.godot/imported/victory_asset_plant_13.png-eeb6e329c877119a53c8a2f68e710c08.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_14.png b/assets/gardens/victory_assets/victory_asset_plant_14.png new file mode 100644 index 00000000..3580062f Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_14.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_14.png.import b/assets/gardens/victory_assets/victory_asset_plant_14.png.import new file mode 100644 index 00000000..a0cdea34 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_14.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br5gguush2y12" +path="res://.godot/imported/victory_asset_plant_14.png-be3e1ed2e0fc3e59af6a2eb3bebd8fe6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_14.png" +dest_files=["res://.godot/imported/victory_asset_plant_14.png-be3e1ed2e0fc3e59af6a2eb3bebd8fe6.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_15.png b/assets/gardens/victory_assets/victory_asset_plant_15.png new file mode 100644 index 00000000..e45c71f7 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_15.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_15.png.import b/assets/gardens/victory_assets/victory_asset_plant_15.png.import new file mode 100644 index 00000000..28a93393 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_15.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bmqanuxy2hmrb" +path="res://.godot/imported/victory_asset_plant_15.png-9fbb88c052309e49bd760212e621cdc9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_15.png" +dest_files=["res://.godot/imported/victory_asset_plant_15.png-9fbb88c052309e49bd760212e621cdc9.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_16.png b/assets/gardens/victory_assets/victory_asset_plant_16.png new file mode 100644 index 00000000..1fe4f11c Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_16.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_16.png.import b/assets/gardens/victory_assets/victory_asset_plant_16.png.import new file mode 100644 index 00000000..a7060191 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_16.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://x0skor7vxadl" +path="res://.godot/imported/victory_asset_plant_16.png-5c30e22a3df95565205d259edadc7d23.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_16.png" +dest_files=["res://.godot/imported/victory_asset_plant_16.png-5c30e22a3df95565205d259edadc7d23.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_17.png b/assets/gardens/victory_assets/victory_asset_plant_17.png new file mode 100644 index 00000000..ffd6dedc Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_17.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_17.png.import b/assets/gardens/victory_assets/victory_asset_plant_17.png.import new file mode 100644 index 00000000..75402244 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_17.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bg02dhcrwf5nx" +path="res://.godot/imported/victory_asset_plant_17.png-c6bede2b0255e8ea7e6473f74ca26813.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_17.png" +dest_files=["res://.godot/imported/victory_asset_plant_17.png-c6bede2b0255e8ea7e6473f74ca26813.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_18.png b/assets/gardens/victory_assets/victory_asset_plant_18.png new file mode 100644 index 00000000..82057327 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_18.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_18.png.import b/assets/gardens/victory_assets/victory_asset_plant_18.png.import new file mode 100644 index 00000000..661c5560 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_18.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://chtr4d0a80s61" +path="res://.godot/imported/victory_asset_plant_18.png-9a654bed9e35c4084d3e48f0d10fe8e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_18.png" +dest_files=["res://.godot/imported/victory_asset_plant_18.png-9a654bed9e35c4084d3e48f0d10fe8e0.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_19.png b/assets/gardens/victory_assets/victory_asset_plant_19.png new file mode 100644 index 00000000..57905d0b Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_19.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_19.png.import b/assets/gardens/victory_assets/victory_asset_plant_19.png.import new file mode 100644 index 00000000..262fd8d5 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_19.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ctc6i4o6rtj2m" +path="res://.godot/imported/victory_asset_plant_19.png-dd0fe0b3b37a8dba586e903bd433af5f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_19.png" +dest_files=["res://.godot/imported/victory_asset_plant_19.png-dd0fe0b3b37a8dba586e903bd433af5f.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_20.png b/assets/gardens/victory_assets/victory_asset_plant_20.png new file mode 100644 index 00000000..dcd9cd03 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_20.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_20.png.import b/assets/gardens/victory_assets/victory_asset_plant_20.png.import new file mode 100644 index 00000000..23033082 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_20.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1jhhus8v37ik" +path="res://.godot/imported/victory_asset_plant_20.png-c7efc1e34db98d0ee13b14addd7fd702.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_20.png" +dest_files=["res://.godot/imported/victory_asset_plant_20.png-c7efc1e34db98d0ee13b14addd7fd702.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_21.png b/assets/gardens/victory_assets/victory_asset_plant_21.png new file mode 100644 index 00000000..ed582902 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_21.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_21.png.import b/assets/gardens/victory_assets/victory_asset_plant_21.png.import new file mode 100644 index 00000000..934f7c87 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_21.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://n4pv6f7bbtiy" +path="res://.godot/imported/victory_asset_plant_21.png-0f25f8f686068370618987ed14e7165c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_21.png" +dest_files=["res://.godot/imported/victory_asset_plant_21.png-0f25f8f686068370618987ed14e7165c.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_22.png b/assets/gardens/victory_assets/victory_asset_plant_22.png new file mode 100644 index 00000000..f00bf249 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_22.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_22.png.import b/assets/gardens/victory_assets/victory_asset_plant_22.png.import new file mode 100644 index 00000000..07b354ca --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_22.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vjani6ctt7hc" +path="res://.godot/imported/victory_asset_plant_22.png-81e4f0b218c51c33bb067f6a623ff79b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_22.png" +dest_files=["res://.godot/imported/victory_asset_plant_22.png-81e4f0b218c51c33bb067f6a623ff79b.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_23.png b/assets/gardens/victory_assets/victory_asset_plant_23.png new file mode 100644 index 00000000..823650f8 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_23.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_23.png.import b/assets/gardens/victory_assets/victory_asset_plant_23.png.import new file mode 100644 index 00000000..4e1f926b --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_23.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://8kmojsnwp657" +path="res://.godot/imported/victory_asset_plant_23.png-8d59d618d65212c4f9d08923e91f3338.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_23.png" +dest_files=["res://.godot/imported/victory_asset_plant_23.png-8d59d618d65212c4f9d08923e91f3338.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_24.png b/assets/gardens/victory_assets/victory_asset_plant_24.png new file mode 100644 index 00000000..94db5957 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_24.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_24.png.import b/assets/gardens/victory_assets/victory_asset_plant_24.png.import new file mode 100644 index 00000000..1453ee0d --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_24.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyau6e65xdsb8" +path="res://.godot/imported/victory_asset_plant_24.png-b14751e055dbba58a46a778cd6633dbb.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_24.png" +dest_files=["res://.godot/imported/victory_asset_plant_24.png-b14751e055dbba58a46a778cd6633dbb.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_25.png b/assets/gardens/victory_assets/victory_asset_plant_25.png new file mode 100644 index 00000000..37f83ca9 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_25.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_25.png.import b/assets/gardens/victory_assets/victory_asset_plant_25.png.import new file mode 100644 index 00000000..9acac3cc --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_25.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7lgiyapshr23" +path="res://.godot/imported/victory_asset_plant_25.png-62e3a6db42f3d39cb4d0166728b56741.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_25.png" +dest_files=["res://.godot/imported/victory_asset_plant_25.png-62e3a6db42f3d39cb4d0166728b56741.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 diff --git a/assets/gardens/victory_assets/victory_asset_plant_26.png b/assets/gardens/victory_assets/victory_asset_plant_26.png new file mode 100644 index 00000000..5bae1269 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_plant_26.png differ diff --git a/assets/gardens/victory_assets/victory_asset_plant_26.png.import b/assets/gardens/victory_assets/victory_asset_plant_26.png.import new file mode 100644 index 00000000..505f97c1 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_plant_26.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjb3ygn2iycj4" +path="res://.godot/imported/victory_asset_plant_26.png-377818411fbf5a27dce9fa7548f57cec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_plant_26.png" +dest_files=["res://.godot/imported/victory_asset_plant_26.png-377818411fbf5a27dce9fa7548f57cec.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 diff --git a/assets/gardens/victory_assets/victory_asset_sand_umbrella.png b/assets/gardens/victory_assets/victory_asset_sand_umbrella.png new file mode 100644 index 00000000..7d432179 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_sand_umbrella.png differ diff --git a/assets/gardens/victory_assets/victory_asset_sand_umbrella.png.import b/assets/gardens/victory_assets/victory_asset_sand_umbrella.png.import new file mode 100644 index 00000000..754b0dc0 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_sand_umbrella.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bci22xv1ysyxy" +path="res://.godot/imported/victory_asset_sand_umbrella.png-870cb8ee4cbe334033ca07aafd7f1aaf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_sand_umbrella.png" +dest_files=["res://.godot/imported/victory_asset_sand_umbrella.png-870cb8ee4cbe334033ca07aafd7f1aaf.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 diff --git a/assets/gardens/victory_assets/victory_asset_sea_stars.png b/assets/gardens/victory_assets/victory_asset_sea_stars.png new file mode 100644 index 00000000..5148fb34 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_sea_stars.png differ diff --git a/assets/gardens/victory_assets/victory_asset_sea_stars.png.import b/assets/gardens/victory_assets/victory_asset_sea_stars.png.import new file mode 100644 index 00000000..65ba5266 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_sea_stars.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://qhs2fydvrnhk" +path="res://.godot/imported/victory_asset_sea_stars.png-418c4cb9595aaaafbef0223e050e60dc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_sea_stars.png" +dest_files=["res://.godot/imported/victory_asset_sea_stars.png-418c4cb9595aaaafbef0223e050e60dc.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 diff --git a/assets/gardens/victory_assets/victory_asset_see_shells.png b/assets/gardens/victory_assets/victory_asset_see_shells.png new file mode 100644 index 00000000..4d252db5 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_see_shells.png differ diff --git a/assets/gardens/victory_assets/victory_asset_see_shells.png.import b/assets/gardens/victory_assets/victory_asset_see_shells.png.import new file mode 100644 index 00000000..d79559bd --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_see_shells.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://25fnjdr15u77" +path="res://.godot/imported/victory_asset_see_shells.png-8c48172ae4c6e68ae5600c5b0f46bd92.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_see_shells.png" +dest_files=["res://.godot/imported/victory_asset_see_shells.png-8c48172ae4c6e68ae5600c5b0f46bd92.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 diff --git a/assets/gardens/victory_assets/victory_asset_snail.png b/assets/gardens/victory_assets/victory_asset_snail.png new file mode 100644 index 00000000..fac8d798 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_snail.png differ diff --git a/assets/gardens/victory_assets/victory_asset_snail.png.import b/assets/gardens/victory_assets/victory_asset_snail.png.import new file mode 100644 index 00000000..62160e28 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_snail.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbxswqqflg4n0" +path="res://.godot/imported/victory_asset_snail.png-d7fe46e98224fcffc2c2b5eda6831c6e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_snail.png" +dest_files=["res://.godot/imported/victory_asset_snail.png-d7fe46e98224fcffc2c2b5eda6831c6e.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 diff --git a/assets/gardens/victory_assets/victory_asset_snowflakes.png b/assets/gardens/victory_assets/victory_asset_snowflakes.png new file mode 100644 index 00000000..ec3b0acd Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_snowflakes.png differ diff --git a/assets/gardens/victory_assets/victory_asset_snowflakes.png.import b/assets/gardens/victory_assets/victory_asset_snowflakes.png.import new file mode 100644 index 00000000..5169ad86 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_snowflakes.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqxwflyxhcdvw" +path="res://.godot/imported/victory_asset_snowflakes.png-313fc4ece515ef9f27c54fb287e99aea.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_snowflakes.png" +dest_files=["res://.godot/imported/victory_asset_snowflakes.png-313fc4ece515ef9f27c54fb287e99aea.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 diff --git a/assets/gardens/victory_assets/victory_asset_snowman.png b/assets/gardens/victory_assets/victory_asset_snowman.png new file mode 100644 index 00000000..a048e0f7 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_snowman.png differ diff --git a/assets/gardens/victory_assets/victory_asset_snowman.png.import b/assets/gardens/victory_assets/victory_asset_snowman.png.import new file mode 100644 index 00000000..926e8078 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_snowman.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0je2xrnu1gem" +path="res://.godot/imported/victory_asset_snowman.png-3b424f864b30cade1f5017a09f047532.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_snowman.png" +dest_files=["res://.godot/imported/victory_asset_snowman.png-3b424f864b30cade1f5017a09f047532.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 diff --git a/assets/gardens/victory_assets/victory_asset_snowpile.png b/assets/gardens/victory_assets/victory_asset_snowpile.png new file mode 100644 index 00000000..96ac133c Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_snowpile.png differ diff --git a/assets/gardens/victory_assets/victory_asset_snowpile.png.import b/assets/gardens/victory_assets/victory_asset_snowpile.png.import new file mode 100644 index 00000000..5ebac452 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_snowpile.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcjk0l771ugvq" +path="res://.godot/imported/victory_asset_snowpile.png-47f93a141a94e7d2dbe2fde9962e85f7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_snowpile.png" +dest_files=["res://.godot/imported/victory_asset_snowpile.png-47f93a141a94e7d2dbe2fde9962e85f7.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 diff --git a/assets/gardens/victory_assets/victory_asset_sun.png b/assets/gardens/victory_assets/victory_asset_sun.png new file mode 100644 index 00000000..cf6d82a4 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_sun.png differ diff --git a/assets/gardens/victory_assets/victory_asset_sun.png.import b/assets/gardens/victory_assets/victory_asset_sun.png.import new file mode 100644 index 00000000..f9b88e0e --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_sun.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2xj4qqvalwar" +path="res://.godot/imported/victory_asset_sun.png-27c8788cd3f586192aa37d908d3ba0cd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_sun.png" +dest_files=["res://.godot/imported/victory_asset_sun.png-27c8788cd3f586192aa37d908d3ba0cd.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 diff --git a/assets/gardens/victory_assets/victory_asset_torch.png b/assets/gardens/victory_assets/victory_asset_torch.png new file mode 100644 index 00000000..8d1a2faa Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_torch.png differ diff --git a/assets/gardens/victory_assets/victory_asset_torch.png.import b/assets/gardens/victory_assets/victory_asset_torch.png.import new file mode 100644 index 00000000..7f2eecec --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_torch.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://yag8afxcasm1" +path="res://.godot/imported/victory_asset_torch.png-9453b552d5c63d67001ddab22498dabd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_torch.png" +dest_files=["res://.godot/imported/victory_asset_torch.png-9453b552d5c63d67001ddab22498dabd.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 diff --git a/assets/gardens/victory_assets/victory_asset_tumbleweeds.png b/assets/gardens/victory_assets/victory_asset_tumbleweeds.png new file mode 100644 index 00000000..5f778670 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_tumbleweeds.png differ diff --git a/assets/gardens/victory_assets/victory_asset_tumbleweeds.png.import b/assets/gardens/victory_assets/victory_asset_tumbleweeds.png.import new file mode 100644 index 00000000..01e08f96 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_tumbleweeds.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c784fmd7v5wkt" +path="res://.godot/imported/victory_asset_tumbleweeds.png-72bc0db853483cfc636357f54602cdef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_tumbleweeds.png" +dest_files=["res://.godot/imported/victory_asset_tumbleweeds.png-72bc0db853483cfc636357f54602cdef.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 diff --git a/assets/gardens/victory_assets/victory_asset_watermelon.png b/assets/gardens/victory_assets/victory_asset_watermelon.png new file mode 100644 index 00000000..daf056f4 Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_watermelon.png differ diff --git a/assets/gardens/victory_assets/victory_asset_watermelon.png.import b/assets/gardens/victory_assets/victory_asset_watermelon.png.import new file mode 100644 index 00000000..f04eaa5f --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_watermelon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpi7cnaepjgsn" +path="res://.godot/imported/victory_asset_watermelon.png-5bfdf5e6fbcd8483264b85543e870d16.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_watermelon.png" +dest_files=["res://.godot/imported/victory_asset_watermelon.png-5bfdf5e6fbcd8483264b85543e870d16.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 diff --git a/assets/gardens/victory_assets/victory_asset_whale.png b/assets/gardens/victory_assets/victory_asset_whale.png new file mode 100644 index 00000000..802656fd Binary files /dev/null and b/assets/gardens/victory_assets/victory_asset_whale.png differ diff --git a/assets/gardens/victory_assets/victory_asset_whale.png.import b/assets/gardens/victory_assets/victory_asset_whale.png.import new file mode 100644 index 00000000..2274c992 --- /dev/null +++ b/assets/gardens/victory_assets/victory_asset_whale.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://28wjedoatx7c" +path="res://.godot/imported/victory_asset_whale.png-85e24dd82f8b152901ac2291e91ea46c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/gardens/victory_assets/victory_asset_whale.png" +dest_files=["res://.godot/imported/victory_asset_whale.png-85e24dd82f8b152901ac2291e91ea46c.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 diff --git a/assets/kalulu/kalulu_sprite_sheet.png.import b/assets/kalulu/kalulu_sprite_sheet.png.import index 73565f01..a1a8079f 100644 --- a/assets/kalulu/kalulu_sprite_sheet.png.import +++ b/assets/kalulu/kalulu_sprite_sheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dyew66g5dsnt3" -path="res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.ctex" +path.s3tc="res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.s3tc.ctex" +path.etc2="res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/kalulu/kalulu_sprite_sheet.png" -dest_files=["res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.ctex"] +dest_files=["res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.s3tc.ctex", "res://.godot/imported/kalulu_sprite_sheet.png-3266bfa62ea85333598f1c606ce0e83d.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="" diff --git a/assets/kalulu_icon.png.import b/assets/kalulu_icon.png.import index 75adb155..ab9763e2 100644 --- a/assets/kalulu_icon.png.import +++ b/assets/kalulu_icon.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cctkobpymorie" -path="res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.ctex" +path.s3tc="res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.s3tc.ctex" +path.etc2="res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/kalulu_icon.png" -dest_files=["res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.ctex"] +dest_files=["res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.s3tc.ctex", "res://.godot/imported/kalulu_icon.png-bb597b448cea4ff060aed1f51bb02451.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="" diff --git a/assets/lesson_screen/big_button.png.import b/assets/lesson_screen/big_button.png.import index 86a0d58a..7165a455 100644 --- a/assets/lesson_screen/big_button.png.import +++ b/assets/lesson_screen/big_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bb00fhnenbml5" -path="res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.ctex" +path.s3tc="res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.s3tc.ctex" +path.etc2="res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/lesson_screen/big_button.png" -dest_files=["res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.ctex"] +dest_files=["res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.s3tc.ctex", "res://.godot/imported/big_button.png-2d1f065099914861a41cb711caf148c4.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="" diff --git a/assets/lesson_screen/big_button_center.png.import b/assets/lesson_screen/big_button_center.png.import index a8fc39de..47f33db8 100644 --- a/assets/lesson_screen/big_button_center.png.import +++ b/assets/lesson_screen/big_button_center.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dlnklpyefn0m2" -path="res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.ctex" +path.s3tc="res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.s3tc.ctex" +path.etc2="res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/lesson_screen/big_button_center.png" -dest_files=["res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.ctex"] +dest_files=["res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.s3tc.ctex", "res://.godot/imported/big_button_center.png-26d8ff0bd3ec429d10c7fc2ee4fd829c.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="" diff --git a/assets/lesson_screen/bottom.png b/assets/lesson_screen/bottom.png deleted file mode 100644 index 5ff5cd66..00000000 Binary files a/assets/lesson_screen/bottom.png and /dev/null differ diff --git a/assets/lesson_screen/branches.png b/assets/lesson_screen/branches.png deleted file mode 100644 index 7b4d37b7..00000000 Binary files a/assets/lesson_screen/branches.png and /dev/null differ diff --git a/assets/lesson_screen/top_left.png b/assets/lesson_screen/top_left.png deleted file mode 100644 index 1f5b7ce9..00000000 Binary files a/assets/lesson_screen/top_left.png and /dev/null differ diff --git a/assets/lesson_screen/top_right.png b/assets/lesson_screen/top_right.png deleted file mode 100644 index 48c8f44c..00000000 Binary files a/assets/lesson_screen/top_right.png and /dev/null differ diff --git a/assets/look_and_learn/video_foreground.png.import b/assets/look_and_learn/video_foreground.png.import index 1d4e1372..7e1b07ed 100644 --- a/assets/look_and_learn/video_foreground.png.import +++ b/assets/look_and_learn/video_foreground.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://c1i3kqeg7ifoo" -path="res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.ctex" +path.s3tc="res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.s3tc.ctex" +path.etc2="res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/look_and_learn/video_foreground.png" -dest_files=["res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.ctex"] +dest_files=["res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.s3tc.ctex", "res://.godot/imported/video_foreground.png-b57933e17e07d2a26c495548452d5df6.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="" diff --git a/assets/look_and_learn/video_mask.png.import b/assets/look_and_learn/video_mask.png.import index 5b29d52d..6f8bc102 100644 --- a/assets/look_and_learn/video_mask.png.import +++ b/assets/look_and_learn/video_mask.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://c72ebvussuekg" -path="res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.ctex" +path.s3tc="res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.s3tc.ctex" +path.etc2="res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/look_and_learn/video_mask.png" -dest_files=["res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.ctex"] +dest_files=["res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.s3tc.ctex", "res://.godot/imported/video_mask.png-115951e1c97d53411f566a917b9ba3fc.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="" diff --git a/assets/menus/back_button.png.import b/assets/menus/back_button.png.import index 38a3f514..34f98cee 100644 --- a/assets/menus/back_button.png.import +++ b/assets/menus/back_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cw15lg6j37pvj" -path="res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.ctex" +path.s3tc="res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.s3tc.ctex" +path.etc2="res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/back_button.png" -dest_files=["res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.ctex"] +dest_files=["res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.s3tc.ctex", "res://.godot/imported/back_button.png-b90a73672942d9f08b188d6a9f1696a0.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="" diff --git a/assets/menus/checkbox_transparent_background_checked.png.import b/assets/menus/checkbox_transparent_background_checked.png.import index e541c6eb..d2094d21 100644 --- a/assets/menus/checkbox_transparent_background_checked.png.import +++ b/assets/menus/checkbox_transparent_background_checked.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://7q3lm3o8ihxn" -path="res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.ctex" +path.s3tc="res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.s3tc.ctex" +path.etc2="res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/checkbox_transparent_background_checked.png" -dest_files=["res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.ctex"] +dest_files=["res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.s3tc.ctex", "res://.godot/imported/checkbox_transparent_background_checked.png-1dc430c45397b535abbb95e3967216a0.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="" diff --git a/assets/menus/checkbox_transparent_background_unchecked.png.import b/assets/menus/checkbox_transparent_background_unchecked.png.import index 4157018e..8dd8d7c0 100644 --- a/assets/menus/checkbox_transparent_background_unchecked.png.import +++ b/assets/menus/checkbox_transparent_background_unchecked.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://s0k8emrncuwk" -path="res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.ctex" +path.s3tc="res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.s3tc.ctex" +path.etc2="res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/checkbox_transparent_background_unchecked.png" -dest_files=["res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.ctex"] +dest_files=["res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.s3tc.ctex", "res://.godot/imported/checkbox_transparent_background_unchecked.png-c25351e55809d2db634289acc1028afb.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="" diff --git a/assets/menus/checkbox_white_background_checked.png.import b/assets/menus/checkbox_white_background_checked.png.import index 4ff9b4dc..e7209aaf 100644 --- a/assets/menus/checkbox_white_background_checked.png.import +++ b/assets/menus/checkbox_white_background_checked.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dji28uchuubxn" -path="res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.ctex" +path.s3tc="res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.s3tc.ctex" +path.etc2="res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/checkbox_white_background_checked.png" -dest_files=["res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.ctex"] +dest_files=["res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.s3tc.ctex", "res://.godot/imported/checkbox_white_background_checked.png-9b80aad00e4db61e15654feeadb8e668.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="" diff --git a/assets/menus/checkbox_white_background_unchecked.png.import b/assets/menus/checkbox_white_background_unchecked.png.import index 1d4e6a7a..286cd322 100644 --- a/assets/menus/checkbox_white_background_unchecked.png.import +++ b/assets/menus/checkbox_white_background_unchecked.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://d32u1cm8m7wiw" -path="res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.ctex" +path.s3tc="res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.s3tc.ctex" +path.etc2="res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/checkbox_white_background_unchecked.png" -dest_files=["res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.ctex"] +dest_files=["res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.s3tc.ctex", "res://.godot/imported/checkbox_white_background_unchecked.png-7209fcc9e04c13a80ed4396aec64cf23.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="" diff --git a/assets/menus/login/password_background.png.import b/assets/menus/login/password_background.png.import index d176b740..a2bb09fd 100644 --- a/assets/menus/login/password_background.png.import +++ b/assets/menus/login/password_background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://d3rhl050u0ahl" -path="res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.ctex" +path.s3tc="res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.s3tc.ctex" +path.etc2="res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/login/password_background.png" -dest_files=["res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.ctex"] +dest_files=["res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.s3tc.ctex", "res://.godot/imported/password_background.png-6cae367f4dcff551398f76cfd245c9cc.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="" diff --git a/assets/menus/main/plants/blue_palm.png.import b/assets/menus/main/plants/blue_palm.png.import index 4f45c9c6..9fd4baf5 100644 --- a/assets/menus/main/plants/blue_palm.png.import +++ b/assets/menus/main/plants/blue_palm.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://wylvu8nc54ow" -path="res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.ctex" +path.s3tc="res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.s3tc.ctex" +path.etc2="res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/plants/blue_palm.png" -dest_files=["res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.ctex"] +dest_files=["res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.s3tc.ctex", "res://.godot/imported/blue_palm.png-fde1444fb2a9b8953e11e503abac50b6.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="" diff --git a/assets/menus/main/plants/bush.png.import b/assets/menus/main/plants/bush.png.import index 01022d8a..c3332584 100644 --- a/assets/menus/main/plants/bush.png.import +++ b/assets/menus/main/plants/bush.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://digxl4htxkdqp" -path="res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.ctex" +path.s3tc="res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.s3tc.ctex" +path.etc2="res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/plants/bush.png" -dest_files=["res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.ctex"] +dest_files=["res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.s3tc.ctex", "res://.godot/imported/bush.png-f0aa119f63952acb9b3a855ebd06acef.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="" diff --git a/assets/menus/main/plants/flower_body.png.import b/assets/menus/main/plants/flower_body.png.import index 02bc44b8..b3a178dd 100644 --- a/assets/menus/main/plants/flower_body.png.import +++ b/assets/menus/main/plants/flower_body.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dgsekh110qlse" -path="res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.ctex" +path.s3tc="res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.s3tc.ctex" +path.etc2="res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/plants/flower_body.png" -dest_files=["res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.ctex"] +dest_files=["res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.s3tc.ctex", "res://.godot/imported/flower_body.png-6619db38044cad3f1bef2b5c752a3c4a.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="" diff --git a/assets/menus/main/plants/large_flower_body.png.import b/assets/menus/main/plants/large_flower_body.png.import index 567805ec..62c3cd16 100644 --- a/assets/menus/main/plants/large_flower_body.png.import +++ b/assets/menus/main/plants/large_flower_body.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b6l305fj6ynnv" -path="res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.ctex" +path.s3tc="res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.s3tc.ctex" +path.etc2="res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/plants/large_flower_body.png" -dest_files=["res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.ctex"] +dest_files=["res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.s3tc.ctex", "res://.godot/imported/large_flower_body.png-c7e3feabfe10a2a72c7bc6800559fd5b.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="" diff --git a/assets/menus/main/play_button_mask.png.import b/assets/menus/main/play_button_mask.png.import index 3324db7b..7a9df20d 100644 --- a/assets/menus/main/play_button_mask.png.import +++ b/assets/menus/main/play_button_mask.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bbip3wpyidt1q" -path="res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.ctex" +path.s3tc="res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.s3tc.ctex" +path.etc2="res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/play_button_mask.png" -dest_files=["res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.ctex"] +dest_files=["res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.s3tc.ctex", "res://.godot/imported/play_button_mask.png-5ad05aadb5116990ffd618e8dac49d33.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="" diff --git a/assets/menus/main/title.png.import b/assets/menus/main/title.png.import index ed305ada..d28d64a5 100644 --- a/assets/menus/main/title.png.import +++ b/assets/menus/main/title.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cgrl5x2iqbiwg" -path="res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.ctex" +path.s3tc="res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.s3tc.ctex" +path.etc2="res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/main/title.png" -dest_files=["res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.ctex"] +dest_files=["res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.s3tc.ctex", "res://.godot/imported/title.png-92c5b7d29f2f2dfe55a460207b8210ce.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="" diff --git a/assets/menus/modify_button.png.import b/assets/menus/modify_button.png.import index f2dc7277..bfc671eb 100644 --- a/assets/menus/modify_button.png.import +++ b/assets/menus/modify_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://c5jiyxrmmjmdb" -path="res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.ctex" +path.s3tc="res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.s3tc.ctex" +path.etc2="res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/modify_button.png" -dest_files=["res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.ctex"] +dest_files=["res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.s3tc.ctex", "res://.godot/imported/modify_button.png-2b8dde2439c7c1a06f1d07c9263d0418.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="" diff --git a/assets/menus/play_button.png.import b/assets/menus/play_button.png.import index ee747c1a..53c0772d 100644 --- a/assets/menus/play_button.png.import +++ b/assets/menus/play_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ctike5jfpr68v" -path="res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.ctex" +path.s3tc="res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.s3tc.ctex" +path.etc2="res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/play_button.png" -dest_files=["res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.ctex"] +dest_files=["res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.s3tc.ctex", "res://.godot/imported/play_button.png-00741f6ebfe0fb1aa0a4531c109dd421.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="" diff --git a/assets/menus/plus_button.png.import b/assets/menus/plus_button.png.import index 4df11f3a..dc29bc82 100644 --- a/assets/menus/plus_button.png.import +++ b/assets/menus/plus_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ouhnm00r8rt6" -path="res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.ctex" +path.s3tc="res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.s3tc.ctex" +path.etc2="res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/plus_button.png" -dest_files=["res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.ctex"] +dest_files=["res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.s3tc.ctex", "res://.godot/imported/plus_button.png-df33a515f03310d6c8b09c259ab5bb94.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="" diff --git a/assets/menus/save_button.png.import b/assets/menus/save_button.png.import index fe31cb77..11ff3a35 100644 --- a/assets/menus/save_button.png.import +++ b/assets/menus/save_button.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://5n02dxd66fw4" -path="res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.ctex" +path.s3tc="res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.s3tc.ctex" +path.etc2="res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/save_button.png" -dest_files=["res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.ctex"] +dest_files=["res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.s3tc.ctex", "res://.godot/imported/save_button.png-e0abff5de73db7c1ad84988080c20282.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="" diff --git a/assets/menus/save_ok.png.import b/assets/menus/save_ok.png.import index d01163ca..163fa2c4 100644 --- a/assets/menus/save_ok.png.import +++ b/assets/menus/save_ok.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cs7v0nap5hadi" -path="res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.ctex" +path.s3tc="res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.s3tc.ctex" +path.etc2="res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/save_ok.png" -dest_files=["res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.ctex"] +dest_files=["res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.s3tc.ctex", "res://.godot/imported/save_ok.png-00f2e75f4737ed4b80b793ebf1493136.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="" diff --git a/assets/menus/upload.png.import b/assets/menus/upload.png.import index ae74e562..e3ec8268 100644 --- a/assets/menus/upload.png.import +++ b/assets/menus/upload.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://5fffpm7hc12k" -path="res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.ctex" +path.s3tc="res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.s3tc.ctex" +path.etc2="res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/menus/upload.png" -dest_files=["res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.ctex"] +dest_files=["res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.s3tc.ctex", "res://.godot/imported/upload.png-34db21b9ba0699b5022e0a6835ec0d43.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="" diff --git a/assets/minigames/ants/graphics/ant_spritesheet.png.import b/assets/minigames/ants/graphics/ant_spritesheet.png.import index 7bbbe340..ae3cada2 100644 --- a/assets/minigames/ants/graphics/ant_spritesheet.png.import +++ b/assets/minigames/ants/graphics/ant_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cfd278lhnobop" -path="res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.ctex" +path.s3tc="res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.s3tc.ctex" +path.etc2="res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/ants/graphics/ant_spritesheet.png" -dest_files=["res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.ctex"] +dest_files=["res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.s3tc.ctex", "res://.godot/imported/ant_spritesheet.png-c145cf97a43c25c5c71895b7ed6c1eb5.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="" diff --git a/assets/minigames/ants/graphics/background.png.import b/assets/minigames/ants/graphics/background.png.import index 81bf294d..0511a5af 100644 --- a/assets/minigames/ants/graphics/background.png.import +++ b/assets/minigames/ants/graphics/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b2mj2s3o22i8p" -path="res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.ctex" +path.s3tc="res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/ants/graphics/background.png" -dest_files=["res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.ctex"] +dest_files=["res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.s3tc.ctex", "res://.godot/imported/background.png-2ea3da1f26612f4fe38c08e4c10a6033.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="" diff --git a/assets/minigames/ants/graphics/sentence_text_box.png.import b/assets/minigames/ants/graphics/sentence_text_box.png.import index 2a0a38f6..729ce9f2 100644 --- a/assets/minigames/ants/graphics/sentence_text_box.png.import +++ b/assets/minigames/ants/graphics/sentence_text_box.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b2bcmo1keh217" -path="res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.ctex" +path.s3tc="res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.s3tc.ctex" +path.etc2="res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/ants/graphics/sentence_text_box.png" -dest_files=["res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.ctex"] +dest_files=["res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.s3tc.ctex", "res://.godot/imported/sentence_text_box.png-26340fa40aaa48e743d64966bd2c4afa.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="" diff --git a/assets/minigames/boss/background.png.import b/assets/minigames/boss/background.png.import index 36160dd9..734b9583 100644 --- a/assets/minigames/boss/background.png.import +++ b/assets/minigames/boss/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ccfocxdqxujvc" -path="res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.ctex" +path.s3tc="res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/background.png" -dest_files=["res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.ctex"] +dest_files=["res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.s3tc.ctex", "res://.godot/imported/background.png-c8fad62adf6e7e725e8f4fa28351428b.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="" diff --git a/assets/minigames/boss/boss_icon.png b/assets/minigames/boss/boss_icon.png index 7195ced1..28ed0b69 100644 Binary files a/assets/minigames/boss/boss_icon.png and b/assets/minigames/boss/boss_icon.png differ diff --git a/assets/minigames/boss/boss_icon_full.png b/assets/minigames/boss/boss_icon_full.png index 11718060..9ea61904 100644 Binary files a/assets/minigames/boss/boss_icon_full.png and b/assets/minigames/boss/boss_icon_full.png differ diff --git a/assets/minigames/boss/foreground.png.import b/assets/minigames/boss/foreground.png.import index 3715762d..9e9d2793 100644 --- a/assets/minigames/boss/foreground.png.import +++ b/assets/minigames/boss/foreground.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://7w2e4mo7yssm" -path="res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.ctex" +path.s3tc="res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.s3tc.ctex" +path.etc2="res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/foreground.png" -dest_files=["res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.ctex"] +dest_files=["res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.s3tc.ctex", "res://.godot/imported/foreground.png-6c2554e6685390cee51239dbfa88c3c1.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="" diff --git a/assets/minigames/boss/frame_corner.png.import b/assets/minigames/boss/frame_corner.png.import index 596bce7d..d27d1b65 100644 --- a/assets/minigames/boss/frame_corner.png.import +++ b/assets/minigames/boss/frame_corner.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bk4k8v5yrolt1" -path="res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.ctex" +path.s3tc="res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.s3tc.ctex" +path.etc2="res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/frame_corner.png" -dest_files=["res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.ctex"] +dest_files=["res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.s3tc.ctex", "res://.godot/imported/frame_corner.png-63662e0fcc6898223ce9b85ff1d1ada3.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="" diff --git a/assets/minigames/boss/kalulu_sheet.png.import b/assets/minigames/boss/kalulu_sheet.png.import index 3010a573..23f214a7 100644 --- a/assets/minigames/boss/kalulu_sheet.png.import +++ b/assets/minigames/boss/kalulu_sheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bp3t4elur5y1y" -path="res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.ctex" +path.s3tc="res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.s3tc.ctex" +path.etc2="res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/kalulu_sheet.png" -dest_files=["res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.ctex"] +dest_files=["res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.s3tc.ctex", "res://.godot/imported/kalulu_sheet.png-a82ac9402c5205b4531b3cd17bec0bc7.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="" diff --git a/assets/minigames/boss/sun.png.import b/assets/minigames/boss/sun.png.import index c95869b4..a6481df5 100644 --- a/assets/minigames/boss/sun.png.import +++ b/assets/minigames/boss/sun.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bf7od6f56f516" -path="res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.ctex" +path.s3tc="res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.s3tc.ctex" +path.etc2="res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/sun.png" -dest_files=["res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.ctex"] +dest_files=["res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.s3tc.ctex", "res://.godot/imported/sun.png-dfa55dd52b824f292c3e99dd864a9f89.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="" diff --git a/assets/minigames/boss/text_box_long.png.import b/assets/minigames/boss/text_box_long.png.import index c0b77d39..710c4945 100644 --- a/assets/minigames/boss/text_box_long.png.import +++ b/assets/minigames/boss/text_box_long.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cdmfxx6kt5tla" -path="res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.ctex" +path.s3tc="res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.s3tc.ctex" +path.etc2="res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/text_box_long.png" -dest_files=["res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.ctex"] +dest_files=["res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.s3tc.ctex", "res://.godot/imported/text_box_long.png-c072665becb3889915217183915e2a64.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="" diff --git a/assets/minigames/boss/text_box_long_outline_dotted.png.import b/assets/minigames/boss/text_box_long_outline_dotted.png.import index ba430de2..759ea88f 100644 --- a/assets/minigames/boss/text_box_long_outline_dotted.png.import +++ b/assets/minigames/boss/text_box_long_outline_dotted.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bs1twkddxu31y" -path="res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.ctex" +path.s3tc="res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.s3tc.ctex" +path.etc2="res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/boss/text_box_long_outline_dotted.png" -dest_files=["res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.ctex"] +dest_files=["res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.s3tc.ctex", "res://.godot/imported/text_box_long_outline_dotted.png-fb9c3aa3bc07c3ddb16a444d48552d6d.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="" diff --git a/assets/minigames/caterpillar/graphics/background.png.import b/assets/minigames/caterpillar/graphics/background.png.import index d2453de0..7089ccd9 100644 --- a/assets/minigames/caterpillar/graphics/background.png.import +++ b/assets/minigames/caterpillar/graphics/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cdc5fnfdssjnt" -path="res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.ctex" +path.s3tc="res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/caterpillar/graphics/background.png" -dest_files=["res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.ctex"] +dest_files=["res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.s3tc.ctex", "res://.godot/imported/background.png-e5b0237b67a0798fe1413ecef451510a.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="" diff --git a/assets/minigames/caterpillar/graphics/caterpillar_spritesheet.png.import b/assets/minigames/caterpillar/graphics/caterpillar_spritesheet.png.import index abe8c9e0..6ca8fe56 100644 --- a/assets/minigames/caterpillar/graphics/caterpillar_spritesheet.png.import +++ b/assets/minigames/caterpillar/graphics/caterpillar_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cyxl5ep0vuavl" -path="res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.ctex" +path.s3tc="res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.s3tc.ctex" +path.etc2="res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/caterpillar/graphics/caterpillar_spritesheet.png" -dest_files=["res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.ctex"] +dest_files=["res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.s3tc.ctex", "res://.godot/imported/caterpillar_spritesheet.png-e15320a7c10244419bd956df1a0959b8.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="" diff --git a/assets/minigames/crabs/graphic/background.png.import b/assets/minigames/crabs/graphic/background.png.import index 907020b0..f3a7b099 100644 --- a/assets/minigames/crabs/graphic/background.png.import +++ b/assets/minigames/crabs/graphic/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://5bx8ugh178j1" -path="res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.ctex" +path.s3tc="res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/crabs/graphic/background.png" -dest_files=["res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.ctex"] +dest_files=["res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.s3tc.ctex", "res://.godot/imported/background.png-5e0210e87298ac6e04e95c7ece34e89d.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="" diff --git a/assets/minigames/crabs/graphic/background_2.png.import b/assets/minigames/crabs/graphic/background_2.png.import index f97e9859..6c215a10 100644 --- a/assets/minigames/crabs/graphic/background_2.png.import +++ b/assets/minigames/crabs/graphic/background_2.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cq50syf8jy8ol" -path="res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.ctex" +path.s3tc="res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.s3tc.ctex" +path.etc2="res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/crabs/graphic/background_2.png" -dest_files=["res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.ctex"] +dest_files=["res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.s3tc.ctex", "res://.godot/imported/background_2.png-ba5099ea1fd9498d48ea323a8cd4c300.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="" diff --git a/assets/minigames/crabs/graphic/crab_spritesheet.png.import b/assets/minigames/crabs/graphic/crab_spritesheet.png.import index 45c8a660..153b5035 100644 --- a/assets/minigames/crabs/graphic/crab_spritesheet.png.import +++ b/assets/minigames/crabs/graphic/crab_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cjxvog1y6wkfv" -path="res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.ctex" +path.s3tc="res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.s3tc.ctex" +path.etc2="res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/crabs/graphic/crab_spritesheet.png" -dest_files=["res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.ctex"] +dest_files=["res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.s3tc.ctex", "res://.godot/imported/crab_spritesheet.png-21dddf90618c171f86c1406c488930a2.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="" diff --git a/assets/minigames/crabs/graphic/hole_mask.png.import b/assets/minigames/crabs/graphic/hole_mask.png.import index b3a119e5..f49593ac 100644 --- a/assets/minigames/crabs/graphic/hole_mask.png.import +++ b/assets/minigames/crabs/graphic/hole_mask.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://7nrlmc7opox1" -path="res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.ctex" +path.s3tc="res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.s3tc.ctex" +path.etc2="res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/crabs/graphic/hole_mask.png" -dest_files=["res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.ctex"] +dest_files=["res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.s3tc.ctex", "res://.godot/imported/hole_mask.png-ecebdf144a2374016c42ccc2a8a47cb6.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="" diff --git a/assets/minigames/frog/graphics/background.png.import b/assets/minigames/frog/graphics/background.png.import index eb265ad2..046b8883 100644 --- a/assets/minigames/frog/graphics/background.png.import +++ b/assets/minigames/frog/graphics/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bgi4vveige3qv" -path="res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.ctex" +path.s3tc="res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/frog/graphics/background.png" -dest_files=["res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.ctex"] +dest_files=["res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.s3tc.ctex", "res://.godot/imported/background.png-0bda5ad31681b25cd22b6a2490c9350f.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="" diff --git a/assets/minigames/frog/graphics/background_river.png.import b/assets/minigames/frog/graphics/background_river.png.import index 4fe45c5c..0814303e 100644 --- a/assets/minigames/frog/graphics/background_river.png.import +++ b/assets/minigames/frog/graphics/background_river.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://g1pr0xqbmwcb" -path="res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.ctex" +path.s3tc="res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.s3tc.ctex" +path.etc2="res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/frog/graphics/background_river.png" -dest_files=["res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.ctex"] +dest_files=["res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.s3tc.ctex", "res://.godot/imported/background_river.png-0d804af2e42cc58cea90b820caca7c44.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="" diff --git a/assets/minigames/frog/graphics/frog_spritesheet.png.import b/assets/minigames/frog/graphics/frog_spritesheet.png.import index cf84a65b..24456485 100644 --- a/assets/minigames/frog/graphics/frog_spritesheet.png.import +++ b/assets/minigames/frog/graphics/frog_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bmrp8ybx5iqgu" -path="res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.ctex" +path.s3tc="res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.s3tc.ctex" +path.etc2="res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/frog/graphics/frog_spritesheet.png" -dest_files=["res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.ctex"] +dest_files=["res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.s3tc.ctex", "res://.godot/imported/frog_spritesheet.png-76c0a7d8c426412ed0eb71ab671bbaeb.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="" diff --git a/assets/minigames/jellyfish/graphic/background.png.import b/assets/minigames/jellyfish/graphic/background.png.import index 92eaed66..d5b183d5 100644 --- a/assets/minigames/jellyfish/graphic/background.png.import +++ b/assets/minigames/jellyfish/graphic/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://d60ylt2dvc2s" -path="res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.ctex" +path.s3tc="res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/background.png" -dest_files=["res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.ctex"] +dest_files=["res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.s3tc.ctex", "res://.godot/imported/background.png-efb3c9298c89dad479689fd212c0f1b2.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="" diff --git a/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_1.png.import b/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_1.png.import index c67c74eb..7301bd2b 100644 --- a/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_1.png.import +++ b/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_1.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://8pqgvcr4wukd" -path="res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.ctex" +path.s3tc="res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.s3tc.ctex" +path.etc2="res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/blue_jellyfish_layer_1.png" -dest_files=["res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.ctex"] +dest_files=["res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.s3tc.ctex", "res://.godot/imported/blue_jellyfish_layer_1.png-ded26697e61821a4af17afb6bd58f89e.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="" diff --git a/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_2.png.import b/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_2.png.import index cbb802b2..826ced76 100644 --- a/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_2.png.import +++ b/assets/minigames/jellyfish/graphic/blue_jellyfish_layer_2.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b68gvx4lwqked" -path="res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.ctex" +path.s3tc="res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.s3tc.ctex" +path.etc2="res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/blue_jellyfish_layer_2.png" -dest_files=["res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.ctex"] +dest_files=["res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.s3tc.ctex", "res://.godot/imported/blue_jellyfish_layer_2.png-d48d07d14a16b9ae424f0aa828c6c78a.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="" diff --git a/assets/minigames/jellyfish/graphic/green_jellyfish.png.import b/assets/minigames/jellyfish/graphic/green_jellyfish.png.import index 7a0133b0..5957381a 100644 --- a/assets/minigames/jellyfish/graphic/green_jellyfish.png.import +++ b/assets/minigames/jellyfish/graphic/green_jellyfish.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ds2c07hg5gehr" -path="res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.ctex" +path.s3tc="res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.s3tc.ctex" +path.etc2="res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/green_jellyfish.png" -dest_files=["res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.ctex"] +dest_files=["res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.s3tc.ctex", "res://.godot/imported/green_jellyfish.png-a273f442143c4e865bd5def3da194971.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="" diff --git a/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_1.png.import b/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_1.png.import index 4c23bf64..36ade20f 100644 --- a/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_1.png.import +++ b/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_1.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ouogv4kicu4d" -path="res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.ctex" +path.s3tc="res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.s3tc.ctex" +path.etc2="res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/pink_jellyfish_layer_1.png" -dest_files=["res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.ctex"] +dest_files=["res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.s3tc.ctex", "res://.godot/imported/pink_jellyfish_layer_1.png-80b89901a8bd571eabb362c32ae001a5.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="" diff --git a/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_2.png.import b/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_2.png.import index 40ee1c89..61e1e920 100644 --- a/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_2.png.import +++ b/assets/minigames/jellyfish/graphic/pink_jellyfish_layer_2.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cj8mhhve72ff" -path="res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.ctex" +path.s3tc="res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.s3tc.ctex" +path.etc2="res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/pink_jellyfish_layer_2.png" -dest_files=["res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.ctex"] +dest_files=["res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.s3tc.ctex", "res://.godot/imported/pink_jellyfish_layer_2.png-230459161919292a3868ae639ba4e1a2.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="" diff --git a/assets/minigames/jellyfish/graphic/red_jellyfish.png.import b/assets/minigames/jellyfish/graphic/red_jellyfish.png.import index a090c040..8a49e804 100644 --- a/assets/minigames/jellyfish/graphic/red_jellyfish.png.import +++ b/assets/minigames/jellyfish/graphic/red_jellyfish.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dsu5iyecure3" -path="res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.ctex" +path.s3tc="res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.s3tc.ctex" +path.etc2="res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/jellyfish/graphic/red_jellyfish.png" -dest_files=["res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.ctex"] +dest_files=["res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.s3tc.ctex", "res://.godot/imported/red_jellyfish.png-69f999ee21559d347aea09bc070aed39.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="" diff --git a/assets/minigames/minigame_ui/graphic/bush.png.import b/assets/minigames/minigame_ui/graphic/bush.png.import index 114696ea..fb51d480 100644 --- a/assets/minigames/minigame_ui/graphic/bush.png.import +++ b/assets/minigames/minigame_ui/graphic/bush.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dnh4dct8pgcj5" -path="res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.ctex" +path.s3tc="res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.s3tc.ctex" +path.etc2="res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/bush.png" -dest_files=["res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.ctex"] +dest_files=["res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.s3tc.ctex", "res://.godot/imported/bush.png-8b2a230019be154ff388d61416943e26.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_back_disabled.png.import b/assets/minigames/minigame_ui/graphic/button_back_disabled.png.import index 7a9c9620..760b8779 100644 --- a/assets/minigames/minigame_ui/graphic/button_back_disabled.png.import +++ b/assets/minigames/minigame_ui/graphic/button_back_disabled.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bnvx1mujmy3vf" -path="res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.ctex" +path.s3tc="res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.s3tc.ctex" +path.etc2="res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_back_disabled.png" -dest_files=["res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.ctex"] +dest_files=["res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.s3tc.ctex", "res://.godot/imported/button_back_disabled.png-ef5f120ba83ddd342c450eb50b193e29.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_back_normal.png.import b/assets/minigames/minigame_ui/graphic/button_back_normal.png.import index e04cd6e7..b9787c06 100644 --- a/assets/minigames/minigame_ui/graphic/button_back_normal.png.import +++ b/assets/minigames/minigame_ui/graphic/button_back_normal.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dj0ygi5q6kbdw" -path="res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.ctex" +path.s3tc="res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.s3tc.ctex" +path.etc2="res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_back_normal.png" -dest_files=["res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.ctex"] +dest_files=["res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.s3tc.ctex", "res://.godot/imported/button_back_normal.png-9bac017a20eb6651d27b39324da71af4.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_back_pressed.png.import b/assets/minigames/minigame_ui/graphic/button_back_pressed.png.import index 29cd3ab7..e1c850ef 100644 --- a/assets/minigames/minigame_ui/graphic/button_back_pressed.png.import +++ b/assets/minigames/minigame_ui/graphic/button_back_pressed.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://gmoc5mxxfqin" -path="res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.ctex" +path.s3tc="res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.s3tc.ctex" +path.etc2="res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_back_pressed.png" -dest_files=["res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.ctex"] +dest_files=["res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.s3tc.ctex", "res://.godot/imported/button_back_pressed.png-2557e870c079169f2d2bd6a17ce8aeb9.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png.import b/assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png.import index 45a1fb4c..6fc142a6 100644 --- a/assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png.import +++ b/assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://crnxawhf68po3" -path="res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.ctex" +path.s3tc="res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.s3tc.ctex" +path.etc2="res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png" -dest_files=["res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.ctex"] +dest_files=["res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.s3tc.ctex", "res://.godot/imported/button_kalulu_disabled.png-a7a250a3b202651cd2b64b3d6f8c5ce8.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_kalulu_normal.png.import b/assets/minigames/minigame_ui/graphic/button_kalulu_normal.png.import index e1bec104..ea0c83ab 100644 --- a/assets/minigames/minigame_ui/graphic/button_kalulu_normal.png.import +++ b/assets/minigames/minigame_ui/graphic/button_kalulu_normal.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://iw84x6mx8h2g" -path="res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.ctex" +path.s3tc="res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.s3tc.ctex" +path.etc2="res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_kalulu_normal.png" -dest_files=["res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.ctex"] +dest_files=["res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.s3tc.ctex", "res://.godot/imported/button_kalulu_normal.png-846af22a97b5cdb1500d496e6a0cbe50.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png.import b/assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png.import index b2ec84e4..90316366 100644 --- a/assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png.import +++ b/assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ub1dnysbojn8" -path="res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.ctex" +path.s3tc="res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.s3tc.ctex" +path.etc2="res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png" -dest_files=["res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.ctex"] +dest_files=["res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.s3tc.ctex", "res://.godot/imported/button_kalulu_pressed.png-a479a09c3b090d686ecc16921d301226.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_pause_disabled.png.import b/assets/minigames/minigame_ui/graphic/button_pause_disabled.png.import index 7c55b38f..9539afaf 100644 --- a/assets/minigames/minigame_ui/graphic/button_pause_disabled.png.import +++ b/assets/minigames/minigame_ui/graphic/button_pause_disabled.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b0luicu7cgho5" -path="res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.ctex" +path.s3tc="res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.s3tc.ctex" +path.etc2="res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_pause_disabled.png" -dest_files=["res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.ctex"] +dest_files=["res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.s3tc.ctex", "res://.godot/imported/button_pause_disabled.png-7dc41ce8181d799fef30178655c4d7dd.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_pause_normal.png.import b/assets/minigames/minigame_ui/graphic/button_pause_normal.png.import index 62c6ef0a..d6bfaf45 100644 --- a/assets/minigames/minigame_ui/graphic/button_pause_normal.png.import +++ b/assets/minigames/minigame_ui/graphic/button_pause_normal.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bnqgwy3arrm4n" -path="res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.ctex" +path.s3tc="res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.s3tc.ctex" +path.etc2="res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_pause_normal.png" -dest_files=["res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.ctex"] +dest_files=["res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.s3tc.ctex", "res://.godot/imported/button_pause_normal.png-410dfeb2b24e6f4ccbd503ec48479ceb.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_pause_pressed.png.import b/assets/minigames/minigame_ui/graphic/button_pause_pressed.png.import index e6a679b6..0813e492 100644 --- a/assets/minigames/minigame_ui/graphic/button_pause_pressed.png.import +++ b/assets/minigames/minigame_ui/graphic/button_pause_pressed.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bjxt5vglohmk8" -path="res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.ctex" +path.s3tc="res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.s3tc.ctex" +path.etc2="res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_pause_pressed.png" -dest_files=["res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.ctex"] +dest_files=["res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.s3tc.ctex", "res://.godot/imported/button_pause_pressed.png-684213afd797bb0f2a598141b6dce937.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_shell_disabled.png.import b/assets/minigames/minigame_ui/graphic/button_shell_disabled.png.import index ac6cd45b..543f17fa 100644 --- a/assets/minigames/minigame_ui/graphic/button_shell_disabled.png.import +++ b/assets/minigames/minigame_ui/graphic/button_shell_disabled.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://53f3lscl7tws" -path="res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.ctex" +path.s3tc="res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.s3tc.ctex" +path.etc2="res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_shell_disabled.png" -dest_files=["res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.ctex"] +dest_files=["res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.s3tc.ctex", "res://.godot/imported/button_shell_disabled.png-916c851823a3bd967079336e8e2b411d.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_shell_normal.png.import b/assets/minigames/minigame_ui/graphic/button_shell_normal.png.import index 3de3be19..34ee6fb9 100644 --- a/assets/minigames/minigame_ui/graphic/button_shell_normal.png.import +++ b/assets/minigames/minigame_ui/graphic/button_shell_normal.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://03r3arvu1r2t" -path="res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.ctex" +path.s3tc="res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.s3tc.ctex" +path.etc2="res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_shell_normal.png" -dest_files=["res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.ctex"] +dest_files=["res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.s3tc.ctex", "res://.godot/imported/button_shell_normal.png-ee922a52468c1fb0d2c5433528fbca78.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="" diff --git a/assets/minigames/minigame_ui/graphic/button_shell_pressed.png.import b/assets/minigames/minigame_ui/graphic/button_shell_pressed.png.import index 1a461ff4..3247428d 100644 --- a/assets/minigames/minigame_ui/graphic/button_shell_pressed.png.import +++ b/assets/minigames/minigame_ui/graphic/button_shell_pressed.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://clrnqn0fqjx3q" -path="res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.ctex" +path.s3tc="res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.s3tc.ctex" +path.etc2="res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/button_shell_pressed.png" -dest_files=["res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.ctex"] +dest_files=["res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.s3tc.ctex", "res://.godot/imported/button_shell_pressed.png-03f6dfe49ed1c9a8dfda274a18369711.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="" diff --git a/assets/minigames/minigame_ui/graphic/large_flower_body.png.import b/assets/minigames/minigame_ui/graphic/large_flower_body.png.import index 391a4728..539ec32f 100644 --- a/assets/minigames/minigame_ui/graphic/large_flower_body.png.import +++ b/assets/minigames/minigame_ui/graphic/large_flower_body.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b6b8kb5l3yh04" -path="res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.ctex" +path.s3tc="res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.s3tc.ctex" +path.etc2="res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/large_flower_body.png" -dest_files=["res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.ctex"] +dest_files=["res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.s3tc.ctex", "res://.godot/imported/large_flower_body.png-e4cc5c7240bb0cdd8e8f6e9eb5e337f1.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="" diff --git a/assets/minigames/minigame_ui/graphic/popin_background.png.import b/assets/minigames/minigame_ui/graphic/popin_background.png.import index 019504da..fdefd4f4 100644 --- a/assets/minigames/minigame_ui/graphic/popin_background.png.import +++ b/assets/minigames/minigame_ui/graphic/popin_background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://vcfpmwst262s" -path="res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.ctex" +path.s3tc="res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.s3tc.ctex" +path.etc2="res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/popin_background.png" -dest_files=["res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.ctex"] +dest_files=["res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.s3tc.ctex", "res://.godot/imported/popin_background.png-1eed939191a8e691f6867e928c0c1e47.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="" diff --git a/assets/minigames/minigame_ui/graphic/popin_foreground.png.import b/assets/minigames/minigame_ui/graphic/popin_foreground.png.import index 685cc950..56a28fb8 100644 --- a/assets/minigames/minigame_ui/graphic/popin_foreground.png.import +++ b/assets/minigames/minigame_ui/graphic/popin_foreground.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://f2ys2fy1il2k" -path="res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.ctex" +path.s3tc="res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.s3tc.ctex" +path.etc2="res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/popin_foreground.png" -dest_files=["res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.ctex"] +dest_files=["res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.s3tc.ctex", "res://.godot/imported/popin_foreground.png-1501a93c85b4af7b4b5f6b0cc86dd3c8.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="" diff --git a/assets/minigames/minigame_ui/graphic/primary_text_box.png.import b/assets/minigames/minigame_ui/graphic/primary_text_box.png.import index b798e63b..78c34767 100644 --- a/assets/minigames/minigame_ui/graphic/primary_text_box.png.import +++ b/assets/minigames/minigame_ui/graphic/primary_text_box.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://c34sgkbvr3h8q" -path="res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.ctex" +path.s3tc="res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.s3tc.ctex" +path.etc2="res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/primary_text_box.png" -dest_files=["res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.ctex"] +dest_files=["res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.s3tc.ctex", "res://.godot/imported/primary_text_box.png-e6e7d0f2e6a28bafc3bf983ee5c88924.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="" diff --git a/assets/minigames/minigame_ui/graphic/primary_text_box_outline.png.import b/assets/minigames/minigame_ui/graphic/primary_text_box_outline.png.import index 03f96260..133a9ed7 100644 --- a/assets/minigames/minigame_ui/graphic/primary_text_box_outline.png.import +++ b/assets/minigames/minigame_ui/graphic/primary_text_box_outline.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://bbtr0cyiapi3g" -path="res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.ctex" +path.s3tc="res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.s3tc.ctex" +path.etc2="res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/primary_text_box_outline.png" -dest_files=["res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.ctex"] +dest_files=["res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.s3tc.ctex", "res://.godot/imported/primary_text_box_outline.png-5b726d4cac88e8411d188e6023d8d5da.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="" diff --git a/assets/minigames/minigame_ui/graphic/title.png.import b/assets/minigames/minigame_ui/graphic/title.png.import index ece59ff2..1781d112 100644 --- a/assets/minigames/minigame_ui/graphic/title.png.import +++ b/assets/minigames/minigame_ui/graphic/title.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://babk0f7ayvar1" -path="res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.ctex" +path.s3tc="res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.s3tc.ctex" +path.etc2="res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/minigame_ui/graphic/title.png" -dest_files=["res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.ctex"] +dest_files=["res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.s3tc.ctex", "res://.godot/imported/title.png-7e5193721310b57b3ffb1167ccba43df.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="" diff --git a/assets/minigames/monkeys/graphic/background.png.import b/assets/minigames/monkeys/graphic/background.png.import index fac96f5d..f058db0d 100644 --- a/assets/minigames/monkeys/graphic/background.png.import +++ b/assets/minigames/monkeys/graphic/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://demg0gbj4lwic" -path="res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.ctex" +path.s3tc="res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/background.png" -dest_files=["res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.ctex"] +dest_files=["res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.s3tc.ctex", "res://.godot/imported/background.png-3e0c4215e692346e0eaa221c7e37d87a.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="" diff --git a/assets/minigames/monkeys/graphic/background_shadows.png.import b/assets/minigames/monkeys/graphic/background_shadows.png.import index 8695ce95..b3bb8f20 100644 --- a/assets/minigames/monkeys/graphic/background_shadows.png.import +++ b/assets/minigames/monkeys/graphic/background_shadows.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b5dpemo34ts5s" -path="res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.ctex" +path.s3tc="res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.s3tc.ctex" +path.etc2="res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/background_shadows.png" -dest_files=["res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.ctex"] +dest_files=["res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.s3tc.ctex", "res://.godot/imported/background_shadows.png-abf4b46cbe05c69b23d0c391b191de22.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="" diff --git a/assets/minigames/monkeys/graphic/billboard.png.import b/assets/minigames/monkeys/graphic/billboard.png.import index e8afd316..867db4d6 100644 --- a/assets/minigames/monkeys/graphic/billboard.png.import +++ b/assets/minigames/monkeys/graphic/billboard.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://blejqny5syems" -path="res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.ctex" +path.s3tc="res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.s3tc.ctex" +path.etc2="res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/billboard.png" -dest_files=["res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.ctex"] +dest_files=["res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.s3tc.ctex", "res://.godot/imported/billboard.png-744336044fedeb85a9d8220cf978f225.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="" diff --git a/assets/minigames/monkeys/graphic/caterpillar.png.import b/assets/minigames/monkeys/graphic/caterpillar.png.import index 51b804c6..b17da33c 100644 --- a/assets/minigames/monkeys/graphic/caterpillar.png.import +++ b/assets/minigames/monkeys/graphic/caterpillar.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://u2x8lg54e1g" -path="res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.ctex" +path.s3tc="res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.s3tc.ctex" +path.etc2="res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/caterpillar.png" -dest_files=["res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.ctex"] +dest_files=["res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.s3tc.ctex", "res://.godot/imported/caterpillar.png-c28d405f3f7d508211c0ecbc27d2cc5c.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="" diff --git a/assets/minigames/monkeys/graphic/ground.png.import b/assets/minigames/monkeys/graphic/ground.png.import index 93a7d83f..ddd8a26d 100644 --- a/assets/minigames/monkeys/graphic/ground.png.import +++ b/assets/minigames/monkeys/graphic/ground.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://b6k16tfsm2p4u" -path="res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.ctex" +path.s3tc="res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.s3tc.ctex" +path.etc2="res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/ground.png" -dest_files=["res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.ctex"] +dest_files=["res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.s3tc.ctex", "res://.godot/imported/ground.png-15ba339f1b6209172fdb711379739ef5.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="" diff --git a/assets/minigames/monkeys/graphic/king_spritesheet.png.import b/assets/minigames/monkeys/graphic/king_spritesheet.png.import index 5c578fa6..beae88b1 100644 --- a/assets/minigames/monkeys/graphic/king_spritesheet.png.import +++ b/assets/minigames/monkeys/graphic/king_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://boxmlmbplr12i" -path="res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.ctex" +path.s3tc="res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.s3tc.ctex" +path.etc2="res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/king_spritesheet.png" -dest_files=["res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.ctex"] +dest_files=["res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.s3tc.ctex", "res://.godot/imported/king_spritesheet.png-46e752a76092c6981ba363d5eca9c3e2.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="" diff --git a/assets/minigames/monkeys/graphic/monkey_spritesheet.png.import b/assets/minigames/monkeys/graphic/monkey_spritesheet.png.import index a757d97c..d98dd604 100644 --- a/assets/minigames/monkeys/graphic/monkey_spritesheet.png.import +++ b/assets/minigames/monkeys/graphic/monkey_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://d0jobqj4fvrwy" -path="res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.ctex" +path.s3tc="res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.s3tc.ctex" +path.etc2="res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/monkey_spritesheet.png" -dest_files=["res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.ctex"] +dest_files=["res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.s3tc.ctex", "res://.godot/imported/monkey_spritesheet.png-79c879ef4807d3aa5e28bf955b5a3746.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="" diff --git a/assets/minigames/monkeys/graphic/palmtree_01.png.import b/assets/minigames/monkeys/graphic/palmtree_01.png.import index 59718d05..4eae09fd 100644 --- a/assets/minigames/monkeys/graphic/palmtree_01.png.import +++ b/assets/minigames/monkeys/graphic/palmtree_01.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://eor7gaddgj5d" -path="res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.ctex" +path.s3tc="res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.s3tc.ctex" +path.etc2="res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/palmtree_01.png" -dest_files=["res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.ctex"] +dest_files=["res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.s3tc.ctex", "res://.godot/imported/palmtree_01.png-d2c9bb3d1571ad618dba3e80ef4d0456.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="" diff --git a/assets/minigames/monkeys/graphic/palmtree_02.png.import b/assets/minigames/monkeys/graphic/palmtree_02.png.import index 66d83605..93b7757f 100644 --- a/assets/minigames/monkeys/graphic/palmtree_02.png.import +++ b/assets/minigames/monkeys/graphic/palmtree_02.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://fex5yvybinsx" -path="res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.ctex" +path.s3tc="res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.s3tc.ctex" +path.etc2="res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/monkeys/graphic/palmtree_02.png" -dest_files=["res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.ctex"] +dest_files=["res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.s3tc.ctex", "res://.godot/imported/palmtree_02.png-0180af1631e93bd44dcded1d875a89be.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="" diff --git a/assets/minigames/parakeets/graphic/background_1.png.import b/assets/minigames/parakeets/graphic/background_1.png.import index 41556a30..9e2bb4e6 100644 --- a/assets/minigames/parakeets/graphic/background_1.png.import +++ b/assets/minigames/parakeets/graphic/background_1.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cc01gd1hm6hc3" -path="res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.ctex" +path.s3tc="res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.s3tc.ctex" +path.etc2="res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/background_1.png" -dest_files=["res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.ctex"] +dest_files=["res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.s3tc.ctex", "res://.godot/imported/background_1.png-8ac3644edd63999756849ff3e759d11b.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="" diff --git a/assets/minigames/parakeets/graphic/background_2.png.import b/assets/minigames/parakeets/graphic/background_2.png.import index 7bfa587f..593a676a 100644 --- a/assets/minigames/parakeets/graphic/background_2.png.import +++ b/assets/minigames/parakeets/graphic/background_2.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://pj0mlw24jayt" -path="res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.ctex" +path.s3tc="res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.s3tc.ctex" +path.etc2="res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/background_2.png" -dest_files=["res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.ctex"] +dest_files=["res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.s3tc.ctex", "res://.godot/imported/background_2.png-347fda916494b7c02674be20cbfaaae0.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="" diff --git a/assets/minigames/parakeets/graphic/background_3.png.import b/assets/minigames/parakeets/graphic/background_3.png.import index fda1a9e0..89682b2e 100644 --- a/assets/minigames/parakeets/graphic/background_3.png.import +++ b/assets/minigames/parakeets/graphic/background_3.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cs16kbsvnsltg" -path="res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.ctex" +path.s3tc="res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.s3tc.ctex" +path.etc2="res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/background_3.png" -dest_files=["res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.ctex"] +dest_files=["res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.s3tc.ctex", "res://.godot/imported/background_3.png-63a8c14a4cb795cb6e87dd2e5ae19ca9.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="" diff --git a/assets/minigames/parakeets/graphic/green_parakeet_spritesheet.png.import b/assets/minigames/parakeets/graphic/green_parakeet_spritesheet.png.import index d8363558..14a615f0 100644 --- a/assets/minigames/parakeets/graphic/green_parakeet_spritesheet.png.import +++ b/assets/minigames/parakeets/graphic/green_parakeet_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://xo0vj3ubvidu" -path="res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.ctex" +path.s3tc="res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.s3tc.ctex" +path.etc2="res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/green_parakeet_spritesheet.png" -dest_files=["res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.ctex"] +dest_files=["res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.s3tc.ctex", "res://.godot/imported/green_parakeet_spritesheet.png-1c24cd90a1fc5e0c07128873d7f7644c.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="" diff --git a/assets/minigames/parakeets/graphic/nest.png.import b/assets/minigames/parakeets/graphic/nest.png.import index 2cde19eb..8d1bc2c0 100644 --- a/assets/minigames/parakeets/graphic/nest.png.import +++ b/assets/minigames/parakeets/graphic/nest.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ca2jljrk2wnjt" -path="res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.ctex" +path.s3tc="res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.s3tc.ctex" +path.etc2="res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/nest.png" -dest_files=["res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.ctex"] +dest_files=["res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.s3tc.ctex", "res://.godot/imported/nest.png-d6526be76febf21ea30b47b12ae7e29f.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="" diff --git a/assets/minigames/parakeets/graphic/red_parakeet_spritesheet.png.import b/assets/minigames/parakeets/graphic/red_parakeet_spritesheet.png.import index 9e6ca0ca..2c6e8986 100644 --- a/assets/minigames/parakeets/graphic/red_parakeet_spritesheet.png.import +++ b/assets/minigames/parakeets/graphic/red_parakeet_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ct4ags1dnh17v" -path="res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.ctex" +path.s3tc="res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.s3tc.ctex" +path.etc2="res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/red_parakeet_spritesheet.png" -dest_files=["res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.ctex"] +dest_files=["res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.s3tc.ctex", "res://.godot/imported/red_parakeet_spritesheet.png-6348e73c3282a1fcc2c4ef6b7ae32a62.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="" diff --git a/assets/minigames/parakeets/graphic/tree.png.import b/assets/minigames/parakeets/graphic/tree.png.import index 7ed38df9..f3d47302 100644 --- a/assets/minigames/parakeets/graphic/tree.png.import +++ b/assets/minigames/parakeets/graphic/tree.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://0p171y6thba8" -path="res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.ctex" +path.s3tc="res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.s3tc.ctex" +path.etc2="res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/tree.png" -dest_files=["res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.ctex"] +dest_files=["res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.s3tc.ctex", "res://.godot/imported/tree.png-1e16c7baa542f9e01223cd622d6ec61c.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="" diff --git a/assets/minigames/parakeets/graphic/tree_trunk.png.import b/assets/minigames/parakeets/graphic/tree_trunk.png.import index 421fe28a..f973ad53 100644 --- a/assets/minigames/parakeets/graphic/tree_trunk.png.import +++ b/assets/minigames/parakeets/graphic/tree_trunk.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://clvh07xfgjmri" -path="res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.ctex" +path.s3tc="res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.s3tc.ctex" +path.etc2="res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/tree_trunk.png" -dest_files=["res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.ctex"] +dest_files=["res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.s3tc.ctex", "res://.godot/imported/tree_trunk.png-5c553d87c35516a5545f3031181f8178.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="" diff --git a/assets/minigames/parakeets/graphic/yellow_parakeet_spritesheet.png.import b/assets/minigames/parakeets/graphic/yellow_parakeet_spritesheet.png.import index c1fdf219..fe39f896 100644 --- a/assets/minigames/parakeets/graphic/yellow_parakeet_spritesheet.png.import +++ b/assets/minigames/parakeets/graphic/yellow_parakeet_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dd37d3qdrfrt0" -path="res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.ctex" +path.s3tc="res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.s3tc.ctex" +path.etc2="res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/parakeets/graphic/yellow_parakeet_spritesheet.png" -dest_files=["res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.ctex"] +dest_files=["res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.s3tc.ctex", "res://.godot/imported/yellow_parakeet_spritesheet.png-dc1a2f533d2ab4ef7cba014a1e83cfee.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="" diff --git a/assets/minigames/penguin/graphic/background.png.import b/assets/minigames/penguin/graphic/background.png.import index fa3201e5..82c3ee8b 100644 --- a/assets/minigames/penguin/graphic/background.png.import +++ b/assets/minigames/penguin/graphic/background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cvnv0beq0dcr4" -path="res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.ctex" +path.s3tc="res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.s3tc.ctex" +path.etc2="res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/penguin/graphic/background.png" -dest_files=["res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.ctex"] +dest_files=["res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.s3tc.ctex", "res://.godot/imported/background.png-733f1ae36940b3c6e4828f77b3c98adb.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="" diff --git a/assets/minigames/penguin/graphic/penguin.png.import b/assets/minigames/penguin/graphic/penguin.png.import index 981eaa67..8461642a 100644 --- a/assets/minigames/penguin/graphic/penguin.png.import +++ b/assets/minigames/penguin/graphic/penguin.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://4mr2idafmxcp" -path="res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.ctex" +path.s3tc="res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.s3tc.ctex" +path.etc2="res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/penguin/graphic/penguin.png" -dest_files=["res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.ctex"] +dest_files=["res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.s3tc.ctex", "res://.godot/imported/penguin.png-59157139f96ad77ee515b94c8f6b0c54.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="" diff --git a/assets/minigames/turtles/graphic/green_turtle_spritesheet.png.import b/assets/minigames/turtles/graphic/green_turtle_spritesheet.png.import index 3b6def78..5b4322fa 100644 --- a/assets/minigames/turtles/graphic/green_turtle_spritesheet.png.import +++ b/assets/minigames/turtles/graphic/green_turtle_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cpyluuh331y6u" -path="res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.ctex" +path.s3tc="res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.s3tc.ctex" +path.etc2="res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/turtles/graphic/green_turtle_spritesheet.png" -dest_files=["res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.ctex"] +dest_files=["res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.s3tc.ctex", "res://.godot/imported/green_turtle_spritesheet.png-b1503559ba979fc938d9381ac49ec72b.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="" diff --git a/assets/minigames/turtles/graphic/khaki_turtle_spritesheet.png.import b/assets/minigames/turtles/graphic/khaki_turtle_spritesheet.png.import index 0ffebf69..7a9f38d4 100644 --- a/assets/minigames/turtles/graphic/khaki_turtle_spritesheet.png.import +++ b/assets/minigames/turtles/graphic/khaki_turtle_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://d14qsri0qk7ka" -path="res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.ctex" +path.s3tc="res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.s3tc.ctex" +path.etc2="res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/turtles/graphic/khaki_turtle_spritesheet.png" -dest_files=["res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.ctex"] +dest_files=["res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.s3tc.ctex", "res://.godot/imported/khaki_turtle_spritesheet.png-a086f44af79aa8241854ed0402dd727c.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="" diff --git a/assets/minigames/turtles/graphic/purple_turtle_spritesheet.png.import b/assets/minigames/turtles/graphic/purple_turtle_spritesheet.png.import index 460c4d7e..3b2de35d 100644 --- a/assets/minigames/turtles/graphic/purple_turtle_spritesheet.png.import +++ b/assets/minigames/turtles/graphic/purple_turtle_spritesheet.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cgtaho31ifol5" -path="res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.ctex" +path.s3tc="res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.s3tc.ctex" +path.etc2="res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/turtles/graphic/purple_turtle_spritesheet.png" -dest_files=["res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.ctex"] +dest_files=["res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.s3tc.ctex", "res://.godot/imported/purple_turtle_spritesheet.png-71c379fad43eb5a5e325a6344e8c2842.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="" diff --git a/assets/minigames/turtles/graphic/turtle_background.png.import b/assets/minigames/turtles/graphic/turtle_background.png.import index 4467b5a7..3584f619 100644 --- a/assets/minigames/turtles/graphic/turtle_background.png.import +++ b/assets/minigames/turtles/graphic/turtle_background.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://caiayxwsgup2e" -path="res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.ctex" +path.s3tc="res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.s3tc.ctex" +path.etc2="res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/turtles/graphic/turtle_background.png" -dest_files=["res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.ctex"] +dest_files=["res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.s3tc.ctex", "res://.godot/imported/turtle_background.png-c9c8938677dce565310fd246ee48a16d.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="" diff --git a/assets/minigames/turtles/graphic/turtle_island.png.import b/assets/minigames/turtles/graphic/turtle_island.png.import index b403b827..738a4724 100644 --- a/assets/minigames/turtles/graphic/turtle_island.png.import +++ b/assets/minigames/turtles/graphic/turtle_island.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://c3i6riv7blkux" -path="res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.ctex" +path.s3tc="res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.s3tc.ctex" +path.etc2="res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/minigames/turtles/graphic/turtle_island.png" -dest_files=["res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.ctex"] +dest_files=["res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.s3tc.ctex", "res://.godot/imported/turtle_island.png-b1b57dce767df44e00eb00c5fd24d944.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="" diff --git a/assets/particles/bigstar_x36_15fps.png.import b/assets/particles/bigstar_x36_15fps.png.import index 7ae96b92..94bc8e1a 100644 --- a/assets/particles/bigstar_x36_15fps.png.import +++ b/assets/particles/bigstar_x36_15fps.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dx7w01wdyq0b5" -path="res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.ctex" +path.s3tc="res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.s3tc.ctex" +path.etc2="res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/particles/bigstar_x36_15fps.png" -dest_files=["res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.ctex"] +dest_files=["res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.s3tc.ctex", "res://.godot/imported/bigstar_x36_15fps.png-2e3129601cf22a7c16cf688a282a1566.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="" diff --git a/assets/prof_tool_icon.png.import b/assets/prof_tool_icon.png.import index 34051415..2f9cae20 100644 --- a/assets/prof_tool_icon.png.import +++ b/assets/prof_tool_icon.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dipdtrs4i7i7v" -path="res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.ctex" +path.s3tc="res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.s3tc.ctex" +path.etc2="res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/prof_tool_icon.png" -dest_files=["res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.ctex"] +dest_files=["res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.s3tc.ctex", "res://.godot/imported/prof_tool_icon.png-547c9cde6a7d8e3765bcd13d7689a2c2.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="" diff --git a/assets/splash.png.import b/assets/splash.png.import index 9ec4c42b..8dc9dc02 100644 --- a/assets/splash.png.import +++ b/assets/splash.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dbymcxksnha54" -path="res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.ctex" +path.s3tc="res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.s3tc.ctex" +path.etc2="res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/splash.png" -dest_files=["res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.ctex"] +dest_files=["res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.s3tc.ctex", "res://.godot/imported/splash.png-8aa957744d9f4b764dd4680b37c88571.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="" diff --git a/assets/vfx/firework.png.import b/assets/vfx/firework.png.import index ed8c725b..f0dacfde 100644 --- a/assets/vfx/firework.png.import +++ b/assets/vfx/firework.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://sa7dtkkhrjw7" -path="res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.ctex" +path.s3tc="res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.s3tc.ctex" +path.etc2="res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/vfx/firework.png" -dest_files=["res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.ctex"] +dest_files=["res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.s3tc.ctex", "res://.godot/imported/firework.png-52ca1322efdfc2cd4b1814752549e23c.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="" diff --git a/assets/vfx/fx_02.png.import b/assets/vfx/fx_02.png.import index 2604fed0..e00cc53a 100644 --- a/assets/vfx/fx_02.png.import +++ b/assets/vfx/fx_02.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://3idggaf5hbbm" -path="res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.ctex" +path.s3tc="res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.s3tc.ctex" +path.etc2="res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/vfx/fx_02.png" -dest_files=["res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.ctex"] +dest_files=["res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.s3tc.ctex", "res://.godot/imported/fx_02.png-d95f6d1261af349fc7a2d12c27ea5233.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="" diff --git a/assets/vfx/fx_09.png.import b/assets/vfx/fx_09.png.import index 9a442bf9..f35dfb9d 100644 --- a/assets/vfx/fx_09.png.import +++ b/assets/vfx/fx_09.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://dif3xpncwixbh" -path="res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.ctex" +path.s3tc="res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.s3tc.ctex" +path.etc2="res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/vfx/fx_09.png" -dest_files=["res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.ctex"] +dest_files=["res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.s3tc.ctex", "res://.godot/imported/fx_09.png-2c655fd7c01218059d37c9b594139fc9.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="" diff --git a/assets/vfx/halo.png.import b/assets/vfx/halo.png.import index 745d7cc7..e6d94fef 100644 --- a/assets/vfx/halo.png.import +++ b/assets/vfx/halo.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://cbjnvgc5jkpj8" -path="res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.ctex" +path.s3tc="res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.s3tc.ctex" +path.etc2="res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/vfx/halo.png" -dest_files=["res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.ctex"] +dest_files=["res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.s3tc.ctex", "res://.godot/imported/halo.png-db32dd271a1357bbd35df9ced74ca9b6.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="" diff --git a/assets/vfx/star.png.import b/assets/vfx/star.png.import index abd1eeed..1c561113 100644 --- a/assets/vfx/star.png.import +++ b/assets/vfx/star.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://ckmh0rn7e8mq" -path="res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.ctex" +path.s3tc="res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.s3tc.ctex" +path.etc2="res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://assets/vfx/star.png" -dest_files=["res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.ctex"] +dest_files=["res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.s3tc.ctex", "res://.godot/imported/star.png-afe7289cc3dc6175eb3695511747ad4e.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="" diff --git a/export_presets.cfg b/export_presets.cfg index 9fd5e781..93145521 100644 --- a/export_presets.cfg +++ b/export_presets.cfg @@ -8,7 +8,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../Export/android/kalulu_app.aab" +export_path="../Export/kalulu_app.aab" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -38,7 +38,7 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=77 +version/code=79 version/name="" package/unique_name="org.godotengine.kalulu" package/name="Kalulu" @@ -264,7 +264,7 @@ architectures/armeabi-v7a=false architectures/arm64-v8a=true architectures/x86=false architectures/x86_64=false -version/code=77 +version/code=79 version/name="" package/unique_name="org.godotengine.kalulu" package/name="Kalulu" @@ -490,7 +490,7 @@ architectures/armeabi-v7a=true architectures/arm64-v8a=false architectures/x86=false architectures/x86_64=false -version/code=77 +version/code=79 version/name="" package/unique_name="org.godotengine.kalulu" package/name="Kalulu" @@ -805,7 +805,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../Export/macOS/Kalulu_macOS.dmg" +export_path="../Export/macos/Kalulu_macOS.dmg" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -1072,7 +1072,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../Export/IOS/KaluluApp.ipa" +export_path="../Export/ios/KaluluApp.ipa" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -1410,7 +1410,7 @@ custom_features="" export_filter="all_resources" include_filter="model_database.db" exclude_filter="" -export_path="../Export/ProfTool/MacOS/Prof_Tool_MacOS_1.4.0.dmg" +export_path="../Export/Autobuild/Prof_Tool/1.4.1 (77)/MacOS/Prof_Tool_MacOS_1.4.1.dmg" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -1437,8 +1437,8 @@ application/icon_interpolation=4 application/bundle_identifier="com.excellolab.proftool" application/signature="" application/app_category="Games" -application/short_version="1.4.0" -application/version="1.4.0" +application/short_version="1.4.1" +application/version="1.4.1" application/copyright="" application/copyright_localized={} application/min_macos_version_x86_64="10.12" @@ -1483,7 +1483,7 @@ codesign/entitlements/app_sandbox/files_user_selected=0 codesign/entitlements/app_sandbox/helper_executables=[] codesign/entitlements/additional="" codesign/custom_options=PackedStringArray() -notarization/notarization=2 +notarization/notarization=0 privacy/microphone_usage_description="" privacy/microphone_usage_description_localized={} privacy/camera_usage_description="" @@ -1677,7 +1677,7 @@ custom_features="" export_filter="all_resources" include_filter="" exclude_filter="" -export_path="../Export/ProfTool/Windows/Prof_Tool_Windows_1.4.0.zip" +export_path="./Prof_Tool_Windows_1.4.2.zip" patches=PackedStringArray() patch_delta_encoding=false patch_delta_compression_level_zstd=19 @@ -1711,8 +1711,8 @@ application/modify_resources=true application/icon="uid://dipdtrs4i7i7v" application/console_wrapper_icon="" application/icon_interpolation=4 -application/file_version="1.4.0" -application/product_version="1.4.0" +application/file_version="1.4.1" +application/product_version="1.4.1" application/company_name="ExcelloLab" application/product_name="Prof_Tool" application/file_description="Open-source educational app to teach reading skills using Godot, based on the graphemic method, designed for children aged 5+" diff --git a/kalulu_localization.csv b/kalulu_localization.csv index 95412fcc..7154c035 100644 --- a/kalulu_localization.csv +++ b/kalulu_localization.csv @@ -11,6 +11,11 @@ EMAIL,Adresse mail,Correo electrónico,Endereço eletrônico,Indirizzo email PASSWORD,Mot de passe,Contraseña,Senha,Password LOG_IN,Se connecter,Ingresar,Conexão,Accedi INVALID_EMAIL_OR_PASSWORD,Adresse mail ou mot de passe invalide,Correo electrónico o contraseña inválida,Endereço de e-mail ou senha inválidos,Email o password non validi +LOGIN_USER_NOT_FOUND,Aucun compte ne correspond à cette adresse mail,No existe ninguna cuenta con este correo electrónico,Nenhuma conta corresponde a este e-mail,Nessun account corrisponde a questa email +LOGIN_WRONG_PASSWORD,Mot de passe incorrect,Contraseña incorrecta,Senha incorreta,Password errata +LOGIN_MISSING_CREDENTIALS,Veuillez renseigner votre adresse mail et votre mot de passe,"Por favor, introduzca su correo electrónico y su contraseña","Por favor, informe seu e-mail e sua senha",Inserisci email e password +LOGIN_SERVER_ERROR,"Erreur serveur, veuillez réessayer plus tard","Error del servidor, inténtelo más tarde","Erro do servidor, tente novamente mais tarde","Errore del server, riprova più tardi" +LOGIN_NETWORK_ERROR,"Connexion au serveur échouée, vérifiez votre accès Internet","Error de conexión al servidor, verifique su acceso a Internet","Falha na conexão com o servidor, verifique seu acesso à Internet","Connessione al server fallita, verifica il tuo accesso a Internet" RESET_PASSWORD,Réinitialiser le mot de passe,Restablecer la contraseña,Redefinir senha,Reimposta password CHECK_YOUR_EMAIL,Veuillez vérifier votre boîte mail,"Por favor, revise su correo electrónico","Por favor, verifique seu e-mail",Controlla la tua email RESET_PASSWORD_FAILED,"Erreur lors de la réinitialisation, réessayez plus tard","Error al restablecer la contraseña, inténtelo más tarde","Erro ao redefinir a senha, tente novamente mais tarde","Errore nel reimpostare la password, riprova più tardi" @@ -404,7 +409,7 @@ VALIDATE,Confirmer,Confirmar,Confirmar,Conferma SUMMARY_EMAIL,Adresse email : {mail},Correo electrónico: {mail},Endereço de e-mail : {mail},Indirizzo email: {mail} SUMMARY_TYPE,Type de compte : {type},Tipo de cuenta: {type},Tipo de conta : {type},Tipo di account: {type} SUMMARY_METHOD,Méthode d'éducation : {method},Método de enseñanza: {method},Método educacional : {method},Metodo educativo: {method} -APPONLY,Application uniquement,Solo aplicación,Somente aplicativo,Solo applicazione +APP_ONLY,Application uniquement,Solo aplicación,Somente aplicativo,Solo applicazione COMPLETE,Complète (livrets et jeux papiers),Completo (cuaderno y juegos en papel),Completo (livretos e jogos de papel),Completo (libretti e giochi cartacei) SUMMARY_NUMBER_OF_DEVICES,Nombre d'appareils : {number},Cantidad de dispositivos: {number},Número de dispositivos : {number},Numero di dispositivi: {number} SUMMARY_NUMBER_OF_STUDENTS,Nombre d'élèves : {number},Cantidad de estudiantes: {number},Número de alunos : {number},Numero di studenti: {number} @@ -434,9 +439,15 @@ CHECKING_DATA,Vérification des données...,Comprobando datos...,Verificação d TEACHER_SETTINGS_HELP,"Pour accéder aux paramètres, veuillez appuyer sur le plus et la barre verticale, puis maintenez le bouton ""Paramètres"" pendant 5 secondes","Para acceder a los ajustes, pulse el signo más y la barra vertical y, a continuación, mantenga pulsado el botón «Configuración» durante 5 segundos","Para acessar as configurações, pressione o sinal de mais e a barra vertical e, em seguida, mantenha pressionado o botão ""Parâmetros"" por 5 segundos","Per accedere alle impostazioni, premi il segno più e la barra verticale, quindi tieni premuto il pulsante ""Impostazioni"" per 5 secondi" DELETE_ACCOUNT,Supprimer le compte,Eliminar cuenta,Excluir conta,Elimina account DELETE_ACCOUNT_POPUP,Voulez-vous vraiment supprimer votre compte ? Cette action est irréversible !,¿De verdad quieres eliminar tu cuenta? ¡Esta acción es irreversible!,Você realmente deseja excluir sua conta? Essa ação é irreversível!,Vuoi davvero eliminare il tuo account? Questa azione è irreversibile! +CHANGE_LANGUAGE,Changer la langue,Cambiar el idioma,Mudar o idioma,Cambia lingua +CHANGE_LANGUAGE_POPUP,"Changer la langue du compte supprimera toute la progression et les données de tous les élèves. Cette action est irréversible. Sélectionnez la nouvelle langue ci-dessous.","Cambiar el idioma de la cuenta borrará todo el progreso y los datos de todos los alumnos. Esta acción es irreversible. Seleccione el nuevo idioma a continuación.","Mudar o idioma da conta apagará todo o progresso e os dados de todos os alunos. Essa ação é irreversível. Selecione o novo idioma abaixo.","Cambiare la lingua dell'account cancellerà tutti i progressi e i dati di tutti gli studenti. Questa azione è irreversibile. Seleziona di seguito la nuova lingua." +CHANGE_LANGUAGE_ERROR,"Impossible de changer la langue. Veuillez vérifier votre connexion et réessayer.","No se pudo cambiar el idioma. Compruebe su conexión y vuelva a intentarlo.","Não foi possível mudar o idioma. Verifique sua conexão e tente novamente.","Impossibile cambiare la lingua. Verifica la connessione e riprova." DISCONNECTED_ERROR,Vous avez été déconnecté. Veuillez renseigner vos identifiants à nouveau.,Se ha cerrado la sesión. Vuelva a introducir sus datos de acceso.,Você foi desconectado. Digite seus detalhes de login novamente.,Sei stato disconnesso. Inserisci nuovamente le tue credenziali. INVALID_LANGUAGE_DIRECTORY,Dossier de langue invalide,Carpeta de idioma no válida,Pasta de idioma inválida,Cartella lingua non valida NO_INTERNET_ACCESS,Vous n'êtes pas connecté à Internet. Veuillez vérifier votre connexion et réessayer.,No está conectado a Internet. Compruebe su conexión e inténtelo de nuevo.,Você não está conectado à Internet. Verifique sua conexão e tente novamente.,Non sei connesso a Internet. Verifica la connessione e riprova. +ERROR_EXTRACTING_PACKAGE,Le pack de langue téléchargé n'a pas pu être extrait. Veuillez réessayer.,No se ha podido extraer el paquete de idioma descargado. Inténtelo de nuevo.,Não foi possível extrair o pacote de idioma baixado. Tente novamente.,Impossibile estrarre il pacchetto lingua scaricato. Riprova. +ERROR_INVALID_PACKAGE,Le pack de langue téléchargé est invalide ou incomplet. Veuillez réessayer plus tard.,El paquete de idioma descargado no es válido o está incompleto. Inténtelo de nuevo más tarde.,O pacote de idioma baixado é inválido ou está incompleto. Tente novamente mais tarde.,Il pacchetto lingua scaricato non è valido o è incompleto. Riprova più tardi. +ERROR_REPLACING_PACKAGE,Impossible de remplacer l'ancien pack de langue. Veuillez redémarrer l'application et réessayer.,No se ha podido reemplazar el paquete de idioma anterior. Reinicie la aplicación e inténtelo de nuevo.,Não foi possível substituir o pacote de idioma anterior. Reinicie o aplicativo e tente novamente.,Impossibile sostituire il pacchetto lingua precedente. Riavvia l'applicazione e riprova. PICK_YOUR_DEVICE,Choisissez votre appareil,Elige tu dispositivo,Escolha seu dispositivo,Scegli il tuo dispositivo SIGN_IN,Connexion,Conexión,Conexão,Accedi RETURN_TO_MAIN_MENU,Retour à l’accueil,Volver a la página principal,Voltar para a página inicial,Torna alla schermata principale diff --git a/project.godot b/project.godot index 0906419a..8fee4e35 100644 --- a/project.godot +++ b/project.godot @@ -16,11 +16,11 @@ compatibility/default_parent_skeleton_in_mesh_instance_3d=true config/name="Kalulu" config/description="Open-source educational app to teach reading skills using Godot, based on the graphemic method, designed for children aged 5+" -config/version="3.0.0" -run/main_scene="uid://xndd7r8jpai5" +config/version="3.0.1" +run/main_scene="res://sources/menus/splash_screen/splash_screen.tscn" config/features=PackedStringArray("4.6", "Forward Plus") boot_splash/bg_color=Color(0.141176, 0.141176, 0.141176, 1) -config/icon="uid://cctkobpymorie" +config/icon="res://assets/kalulu_icon.png" custom/unlock_everything=false custom/unlock_everything.debug=false @@ -36,6 +36,7 @@ Globals="*res://sources/language_tool/globals.gd" LessonLogger="*res://sources/utils/autoloads/lesson_logger.gd" MusicManager="*res://sources/utils/autoloads/music_manager.tscn" OpeningCurtain="*res://sources/utils/autoloads/opening_curtain.tscn" +SceneLoader="*res://sources/utils/autoloads/scene_loader.gd" ServerManager="*res://sources/utils/autoloads/server_manager.tscn" UnicodeNormalizer="*res://sources/utils/autoloads/unicode_normalizer.gd" UserDataManager="*res://sources/utils/autoloads/user_data_manager.gd" @@ -91,6 +92,10 @@ right_click={ ] } +[input_devices] + +pointing/android/enable_pan_and_scale_gestures=true + [internationalization] locale/translation_remaps={} @@ -98,7 +103,7 @@ locale/translations=PackedStringArray("res://kalulu_localization.es.translation" [rendering] +textures/canvas_textures/default_texture_filter=2 renderer/rendering_method="gl_compatibility" renderer/rendering_method.mobile="gl_compatibility" textures/vram_compression/import_etc2_astc=true -viewport/hdr_2d=true diff --git a/resources/gardens/garden.gd b/resources/gardens/garden.gd index 372ebcdb..e5d7ace8 100644 --- a/resources/gardens/garden.gd +++ b/resources/gardens/garden.gd @@ -2,43 +2,51 @@ class_name Garden extends Control -enum FlowerSizes{ - NOT_STARTED, - SMALL, - MEDIUM, - LARGE +const BACKGROUND_PATH_MODEL: String = "res://assets/gardens/gardens/garden_%02d.png" +const MAX_LESSONS: int = 5 +# Maps lesson count → which slot indices to use +const SLOT_SELECTION: Dictionary = { + 1: [2], + 2: [1, 3], + 3: [0, 2, 4], + 4: [0, 1, 3, 4], + 5: [0, 1, 2, 3, 4], } - -const FLOWER_PATH_MODEL: String = "res://assets/gardens/flowers/plant_%02d_%02d_%s.png" -const BACKGROUND_PATH_MODEL: String = "res://assets/gardens/gardens/garden_%02d_open.png" -const LESSON_BUTTON_SCENE: PackedScene = preload("res://sources/lesson_screen/lesson_button.tscn") -const FLOWER_MATERIAL_PATH: String = "res://resources/gardens/flower_material.tres" -const FLOWER_Z_INDEX: int = 1 +const WHEEL_WEDGE_LOCKED: Color = Color("e6e6e6") +const ANIMAL_LOCKED_COLOR: Color = Color("c9c9c9") +const WHEEL_HIGHLIGHT: Color = Color("fbb03b") @export var garden_layout: GardenLayout: set = set_garden_layout -@export var garden_colors: Array[Color] = [] +## Title is for developer reference only — not used in-game. +@export var title: String = "" +@export var unlocked_lesson: Color = Color("0a555b") +@export var unlocked_lesson_text: Color = Color("9be3ea") +@export var completed_lesson: Color = Color("9be3ea") +@export var completed_lesson_text: Color = Color("0a555b") +@export_group("Wheel Colors") +@export var wheel_wedge_unlocked: Color = Color("9be3ea") +@export var wheel_background: Color = Color("0a555b") +## Outline color flagging the next step to play. +@export var animal_unlocked_color: Color = Color.WHITE -var flowers: Array[GardenLayout.Flower] = [] -var flowers_sizes: Array[FlowerSizes] = [] -var flowers_visible: Array[bool] = [] var color: Color var current_progression: float = 0.0 var max_progression: float = 0.0 var garden_index: int = -1 +var active_buttons: Array[LessonButton] = [] -@onready var buttons: Control = $Buttons -@onready var flowers_container: Control = $Flowers -@onready var flower_material: Material = load(FLOWER_MATERIAL_PATH) -@onready var flower_controls: Array[TextureRect] = [] +@onready var all_slots: Array[LessonButton] = [ + $Buttons/Slot1, $Buttons/Slot2, $Buttons/Slot3, $Buttons/Slot4, $Buttons/Slot5 +] +@onready var all_victory_assets: Array[TextureRect] = [] @onready var background: TextureRect = %Background -func get_button_size() -> Vector2: - var lesson_buttons: Array[LessonButton] = get_lesson_buttons() - if lesson_buttons.is_empty(): - return Vector2.ZERO - return lesson_buttons[0].get_size() +func _ready() -> void: + all_victory_assets.append_array(%Victory_Assets.get_children().filter(func(node: Node) -> bool: + return node is TextureRect + )) func set_garden_layout(p_garden_layout: GardenLayout) -> void: @@ -46,101 +54,83 @@ func set_garden_layout(p_garden_layout: GardenLayout) -> void: Log.error("Garden: Cannot set garden layout because it is null") return garden_layout = p_garden_layout - set_flowers(garden_layout.flowers) set_background(garden_layout.color) - set_lesson_buttons(garden_layout.lesson_buttons) + _configure_slots(garden_layout.lesson_buttons.size()) + _apply_colors_to_buttons() + _hide_all_victory_assets() -func set_flowers(p_flowers: Array[GardenLayout.Flower], default_size: FlowerSizes = FlowerSizes.NOT_STARTED) -> void: - flowers = p_flowers - flowers_sizes = [] - flowers_visible = [] - for _i: int in range(flowers.size()): - flowers_sizes.append(default_size) - flowers_visible.append(true) - _ensure_flower_controls_count(flowers.size()) - update_flowers() - - -func update_flowers() -> void: - for index: int in range(flowers.size()): - if index >= flower_controls.size(): - break - var flower: GardenLayout.Flower = flowers[index] - var flower_scene: TextureRect = flower_controls[index] - var flower_is_visible: bool = index < flowers_visible.size() and flowers_visible[index] - flower_scene.visible = flower_is_visible - if not flower_is_visible: - continue - var flower_size: String = FlowerSizes.keys()[flowers_sizes[index]] - flower_size = flower_size.to_lower() - flower_scene.texture = load(FLOWER_PATH_MODEL % [flower.color+1, flower.type+1, flower_size]) - flower_scene.size = flower_scene.get_combined_minimum_size() * 3 - flower_scene.pivot_offset = Vector2(flower_scene.size.x / 2, flower_scene.size.y) - flower_scene.position = Vector2(flower.position.x - flower_scene.size.x / 2, flower.position.y - flower_scene.size.y) - - -func set_lesson_buttons(p_lesson_buttons: Array[GardenLayout.GardenLayoutLessonButton]) -> void: - _ensure_button_controls_count(p_lesson_buttons.size()) - var lesson_buttons: Array[LessonButton] = get_lesson_buttons() - for lesson_button_control: LessonButton in lesson_buttons: - lesson_button_control.hide() - for index: int in range(p_lesson_buttons.size()): - var lesson_button: GardenLayout.GardenLayoutLessonButton = p_lesson_buttons[index] - var lesson_button_control: LessonButton = lesson_buttons[index] - lesson_button_control.position = Vector2(lesson_button.position) - lesson_button_control.show() - lesson_button_control.pivot_offset = lesson_button_control.size / 2 +func _configure_slots(lesson_count: int) -> void: + if not all_slots or all_slots.is_empty(): + return + if lesson_count > MAX_LESSONS: + Log.error("Garden: Too many lessons (%d) for garden %d — maximum is %d" % [lesson_count, garden_index, MAX_LESSONS]) + lesson_count = MAX_LESSONS + for slot: LessonButton in all_slots: + slot.hide() + slot.set_button_disabled(true) + active_buttons.clear() + var indices: Array = SLOT_SELECTION.get(lesson_count, []) + for index: int in range(indices.size()): + var slot: LessonButton = all_slots[indices[index]] + slot.show() + active_buttons.append(slot) func set_background(p_color: int) -> void: if not background: return - background.texture = load(BACKGROUND_PATH_MODEL % [p_color+1]) - color = garden_colors[p_color] - for button: LessonButton in get_lesson_buttons(): - button.completed_color = color + var path: String = BACKGROUND_PATH_MODEL % [p_color + 1] + var texture: Texture2D = load(path) if ResourceLoader.exists(path) else load(BACKGROUND_PATH_MODEL % [1]) + background.texture = texture + color = unlocked_lesson -func _ensure_button_controls_count(target_count: int) -> void: - while get_lesson_buttons().size() < target_count: - var new_button: LessonButton = LESSON_BUTTON_SCENE.instantiate() - new_button.completed_color = color - buttons.add_child(new_button) - new_button.owner = self +func _apply_colors_to_buttons() -> void: + for button: LessonButton in active_buttons: + button.set_garden_colors(unlocked_lesson, unlocked_lesson_text, completed_lesson, completed_lesson_text) -func _ensure_flower_controls_count(target_count: int) -> void: - for child: Node in flowers_container.get_children(): - child.queue_free() - flower_controls.clear() - for _i: int in range(target_count): - var new_flower: TextureRect = _create_flower_control() - flowers_container.add_child(new_flower) - new_flower.owner = self - flower_controls.append(new_flower) +func _hide_all_victory_assets() -> void: + if not all_victory_assets: + return + for asset: TextureRect in all_victory_assets: + asset.visible = false -func _create_flower_control() -> TextureRect: - var flower_control: TextureRect = TextureRect.new() - flower_control.material = flower_material - flower_control.z_index = FLOWER_Z_INDEX - flower_control.mouse_filter = Control.MOUSE_FILTER_IGNORE - return flower_control +func update_victory_assets_visibility(completed_minigames: int, total_minigames: int) -> void: + if not all_victory_assets or total_minigames <= 0: + return + var visible_count: int = 0 + if completed_minigames >= total_minigames: + visible_count = all_victory_assets.size() + elif completed_minigames > 0: + visible_count = int(float(completed_minigames) * float(all_victory_assets.size()) / float(total_minigames)) + visible_count = clampi(visible_count, 1, all_victory_assets.size() - 1) + for index: int in range(all_victory_assets.size()): + all_victory_assets[index].visible = index < visible_count + + +func get_button_size() -> Vector2: + if all_slots.is_empty(): + return Vector2.ZERO + return all_slots[0].get_size() func get_lesson_buttons() -> Array[LessonButton]: - var lesson_buttons: Array[LessonButton] = [] - for button: Node in buttons.get_children(): - if button is LessonButton: - lesson_buttons.append(button as LessonButton) - return lesson_buttons + return active_buttons func set_lesson_label(ind: int, text: String) -> void: - var lesson_buttons: Array[LessonButton] = get_lesson_buttons() - assert(ind < lesson_buttons.size()) - lesson_buttons[ind].text = text + assert(ind < active_buttons.size()) + active_buttons[ind].text = text + + +func get_slot_center(slot_index: int) -> Vector2: + if slot_index < 0 or slot_index >= all_slots.size(): + return Vector2.ZERO + var slot: LessonButton = all_slots[slot_index] + return slot.position + slot.size / 2.0 func get_progress_ratio() -> float: diff --git a/resources/gardens/garden.tscn b/resources/gardens/garden.tscn deleted file mode 100644 index 147dd98d..00000000 --- a/resources/gardens/garden.tscn +++ /dev/null @@ -1,51 +0,0 @@ -[gd_scene format=3 uid="uid://btg3qd8eld1mm"] - -[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] -[ext_resource type="Texture2D" uid="uid://b5kildofgmthb" path="res://assets/gardens/gardens/garden_01_open.png" id="3_p7iv3"] -[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] - -[node name="Garden" type="Control" unique_id=1950346826] -custom_minimum_size = Vector2(2400, 2.08165e-12) -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -script = ExtResource("1_5owem") -garden_colors = Array[Color]([Color(0.588235, 0.439216, 0.878431, 1), Color(1, 0.909804, 0.137255, 1), Color(0.929412, 0.603922, 0.709804, 1), Color(0.658824, 0.262745, 0.286275, 1), Color(0.247059, 0.196078, 0.647059, 1), Color(0.619608, 0.976471, 0.670588, 1), Color(0.764706, 0.760784, 0.768627, 1), Color(1, 0.686275, 0.341176, 1), Color(0.305882, 0.996078, 0.894118, 1), Color(0.478431, 0.819608, 1, 1), Color(0.764706, 0.760784, 0.768627, 1), Color(1, 0.909804, 0.137255, 1), Color(0.658824, 0.262745, 0.286275, 1), Color(0.929412, 0.603922, 0.709804, 1), Color(0.619608, 0.976471, 0.670588, 1), Color(0.247059, 0.196078, 0.647059, 1), Color(0.305882, 0.996078, 0.894118, 1), Color(0.478431, 0.819608, 1, 1), Color(1, 0.686275, 0.341176, 1), Color(0.588235, 0.439216, 0.878431, 1)]) - -[node name="Background" type="TextureRect" parent="." unique_id=667507132] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("3_p7iv3") -expand_mode = 1 - -[node name="Buttons" type="Control" parent="." unique_id=1943933146] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 - -[node name="LessonButton" parent="Buttons" unique_id=1734726442 instance=ExtResource("4_epm30")] -layout_mode = 0 -completed_color = Color(0.588235, 0.439216, 0.878431, 1) - -[node name="Flowers" type="Control" parent="." unique_id=1191503680] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 diff --git a/resources/gardens/garden_01.tscn b/resources/gardens/garden_01.tscn new file mode 100644 index 00000000..ab98261e --- /dev/null +++ b/resources/gardens/garden_01.tscn @@ -0,0 +1,220 @@ +[gd_scene format=3 uid="uid://c6b4rj4fdppum"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://d26hapg1hf8a6" path="res://assets/gardens/gardens/garden_01.png" id="3_p7iv3"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://bfqwlmmliem8f" path="res://assets/gardens/victory_assets/animals/jellyfish.png" id="jellyfish_tex"] +[ext_resource type="Texture2D" uid="uid://dcekseb1b3ruw" path="res://assets/gardens/victory_assets/victory_asset_plant_01.png" id="plant_01"] +[ext_resource type="Texture2D" uid="uid://clkr31osbqs7u" path="res://assets/gardens/victory_assets/victory_asset_plant_02.png" id="plant_02"] +[ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="plant_03"] +[ext_resource type="Texture2D" uid="uid://bqp1nkk53y1is" path="res://assets/gardens/victory_assets/victory_asset_plant_03.png" id="plant_04"] +[ext_resource type="Texture2D" uid="uid://dvxnktx1wiyxp" path="res://assets/gardens/victory_assets/victory_asset_bubbles.png" id="plant_05"] +[ext_resource type="Texture2D" uid="uid://f2arml2f4b8p" path="res://assets/gardens/victory_assets/victory_asset_plant_04.png" id="plant_06"] +[ext_resource type="Texture2D" uid="uid://dufnm3bkfe5yv" path="res://assets/gardens/victory_assets/victory_asset_plant_05.png" id="plant_07"] +[ext_resource type="Texture2D" uid="uid://dt2a0dea0hv0c" path="res://assets/gardens/victory_assets/victory_asset_fish_02.png" id="plant_08"] + +[node name="GardenRoot" type="Control" unique_id=229113687] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Blue Jellyfish Garden" +unlocked_lesson = Color(0.0392157, 0.333333, 0.356863, 1) +unlocked_lesson_text = Color(0.607843, 0.890196, 0.917647, 1) +completed_lesson = Color(0.607843, 0.890196, 0.917647, 1) +completed_lesson_text = Color(0.0392157, 0.333333, 0.356863, 1) +wheel_wedge_unlocked = Color(0.607843, 0.890196, 0.917647, 1) +wheel_background = Color(0.09019608, 0.42745098, 0.47058824, 1) +animal_unlocked_color = Color(0.26666668, 0.7607843, 0.8235294, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1905044868] +unique_name_in_owner = true +modulate = Color(0.0901961, 0.427451, 0.470588, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("3_p7iv3") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=1176691180] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1312910041] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 405.0 +offset_top = 227.0 +offset_right = 484.0 +offset_bottom = 856.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_01") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=460994140] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 615.0 +offset_top = 1346.0 +offset_right = 698.0 +offset_bottom = 1486.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_02") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=780672007] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 1202.0 +offset_top = 1091.0 +offset_right = 1391.0 +offset_bottom = 1233.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_03") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=251444828] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 864.0 +offset_top = 308.0 +offset_right = 983.0 +offset_bottom = 476.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_04") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=338325053] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 744.0 +offset_top = 688.0 +offset_right = 801.0 +offset_bottom = 811.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_05") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=441814129] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 1742.0 +offset_top = 762.0 +offset_right = 1815.0 +offset_bottom = 887.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_06") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=1628951623] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 880.0 +offset_top = 1172.0 +offset_right = 932.0 +offset_bottom = 1380.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_07") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1795730999] +modulate = Color(0.0392157, 0.333333, 0.356863, 1) +layout_mode = 0 +offset_left = 1142.0 +offset_top = 284.0 +offset_right = 1303.0 +offset_bottom = 445.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_08") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=345562197] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=180067904 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 584.0 +offset_top = 1066.0 +offset_right = 824.0 +offset_bottom = 1306.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=226995512 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 867.0 +offset_top = 880.0 +offset_right = 1107.0 +offset_bottom = 1120.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=799562597 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1170.0 +offset_top = 800.0 +offset_right = 1410.0 +offset_bottom = 1040.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1706300394 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1445.0 +offset_top = 628.0 +offset_right = 1685.0 +offset_bottom = 868.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=1420840664 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1744.0 +offset_top = 478.0 +offset_right = 1984.0 +offset_bottom = 718.0 +pivot_offset = Vector2(120, 120) + +[node name="Jellyfish" type="TextureRect" parent="." unique_id=1416633720] +layout_mode = 0 +offset_left = 1511.0 +offset_top = 32.0 +offset_right = 1650.0 +offset_bottom = 272.0 +scale = Vector2(2, 2) +texture = ExtResource("jellyfish_tex") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_02.tscn b/resources/gardens/garden_02.tscn new file mode 100644 index 00000000..0ee7e7f1 --- /dev/null +++ b/resources/gardens/garden_02.tscn @@ -0,0 +1,233 @@ +[gd_scene format=3 uid="uid://btfvuniqgiddp"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://4wt50lu3cwbl" path="res://assets/gardens/gardens/garden_02.png" id="2_v4g1g"] +[ext_resource type="Texture2D" uid="uid://dro75vltqiq6j" path="res://assets/gardens/victory_assets/victory_asset_plant_07.png" id="3_b2jov"] +[ext_resource type="Texture2D" uid="uid://gm5x5p2f07rh" path="res://assets/gardens/victory_assets/victory_asset_plant_10.png" id="4_7vcey"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://blaltndbcv2yq" path="res://assets/gardens/victory_assets/victory_asset_plant_08.png" id="6_4i3vl"] +[ext_resource type="Texture2D" uid="uid://co6vu63bybpnc" path="res://assets/gardens/victory_assets/victory_asset_plant_09.png" id="7_vujr1"] +[ext_resource type="Texture2D" uid="uid://bv510d5r4dn82" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_01.png" id="8_556ma"] +[ext_resource type="Texture2D" uid="uid://dckd1xhcdf2ie" path="res://assets/gardens/victory_assets/victory_asset_plant_06.png" id="9_vwhyb"] +[ext_resource type="Texture2D" uid="uid://bpxc4vhri16pd" path="res://assets/gardens/victory_assets/victory_asset_pearl.png" id="10_v4g1g"] +[ext_resource type="Texture2D" uid="uid://bsw6v8ix7bb2s" path="res://assets/gardens/victory_assets/animals/turtle.png" id="12_v4g1g"] +[ext_resource type="Texture2D" uid="uid://dvxnktx1wiyxp" path="res://assets/gardens/victory_assets/victory_asset_bubbles.png" id="plant_05"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.345098, 0.266667, 0.490196, 1) +unlocked_lesson_text = Color(0.894118, 0.827451, 0.937255, 1) +completed_lesson = Color(0.894118, 0.827451, 0.937255, 1) +completed_lesson_text = Color(0.345098, 0.266667, 0.490196, 1) +wheel_wedge_unlocked = Color(0.894118, 0.827451, 0.937255, 1) +wheel_background = Color(0.45490196, 0.3529412, 0.64705884, 1) +animal_unlocked_color = Color(0.68235296, 0.54509807, 0.8392157, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.454902, 0.352941, 0.647059, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_v4g1g") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 747.0 +offset_top = 1256.0 +offset_right = 878.0 +offset_bottom = 1487.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("3_b2jov") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=1525586982] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 1043.0 +offset_top = 1142.0 +offset_right = 1100.0 +offset_bottom = 1265.0 +rotation = 0.2443461 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("plant_05") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=2071114773] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 616.0 +offset_top = 648.0 +offset_right = 697.0 +offset_bottom = 730.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_7vcey") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1578211500] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 907.0 +offset_top = 275.0 +offset_right = 1070.0 +offset_bottom = 437.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("6_4i3vl") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=520271408] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 1199.0 +offset_top = 1279.0 +offset_right = 1304.0 +offset_bottom = 1454.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_vujr1") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=213526714] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 1337.0 +offset_top = 441.0 +offset_right = 1464.0 +offset_bottom = 502.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_556ma") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=1466685334] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 1660.0 +offset_top = 526.0 +offset_right = 1819.0 +offset_bottom = 696.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_vwhyb") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=2004645372] +modulate = Color(0.34509805, 0.26666668, 0.49019608, 1) +layout_mode = 0 +offset_left = 1531.0 +offset_top = 1278.0 +offset_right = 1619.0 +offset_bottom = 1369.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("10_v4g1g") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 494.0 +offset_top = 1052.0 +offset_right = 734.0 +offset_bottom = 1292.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 762.0 +offset_top = 887.0 +offset_right = 1002.0 +offset_bottom = 1127.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1066.0 +offset_top = 810.0 +offset_right = 1306.0 +offset_bottom = 1050.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1405.0 +offset_top = 885.0 +offset_right = 1645.0 +offset_bottom = 1125.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1720.0 +offset_top = 1020.0 +offset_right = 1960.0 +offset_bottom = 1260.0 +pivot_offset = Vector2(120, 120) + +[node name="Turtle_01" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 500.0 +offset_top = 155.0 +offset_right = 640.0 +offset_bottom = 292.0 +scale = Vector2(2, 2) +texture = ExtResource("12_v4g1g") +expand_mode = 1 +stretch_mode = 5 + +[node name="Turtle_02" type="TextureRect" parent="." unique_id=674773067] +layout_mode = 0 +offset_left = 376.99997 +offset_top = 474.99994 +offset_right = 517.0 +offset_bottom = 611.99994 +rotation = -0.33784395 +scale = Vector2(1.2, 1.2) +texture = ExtResource("12_v4g1g") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_03.tscn b/resources/gardens/garden_03.tscn new file mode 100644 index 00000000..3159761b --- /dev/null +++ b/resources/gardens/garden_03.tscn @@ -0,0 +1,214 @@ +[gd_scene format=3 uid="uid://fl3fleqx7r0k"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_bwhap"] +[ext_resource type="Texture2D" uid="uid://ch1ah3nkjy5cl" path="res://assets/gardens/gardens/garden_03.png" id="2_j3ks8"] +[ext_resource type="Texture2D" uid="uid://yriarwydqmmg" path="res://assets/gardens/victory_assets/victory_asset_plant_11.png" id="3_gandt"] +[ext_resource type="Texture2D" uid="uid://ipos556o7hlw" path="res://assets/gardens/victory_assets/victory_asset_plant_12.png" id="4_qxgmk"] +[ext_resource type="Texture2D" uid="uid://cbq3e4in12oeh" path="res://assets/gardens/victory_assets/victory_asset_moon.png" id="5_3en22"] +[ext_resource type="Texture2D" uid="uid://bqr3eqdfebceh" path="res://assets/gardens/victory_assets/victory_asset_plant_13.png" id="6_alcdm"] +[ext_resource type="Texture2D" uid="uid://dr6cq4ua8fnk3" path="res://assets/gardens/victory_assets/victory_asset_ladybug.png" id="7_rkrhb"] +[ext_resource type="Texture2D" uid="uid://coxmj8uwyu6vd" path="res://assets/gardens/victory_assets/victory_asset_mushroom.png" id="8_ur7o4"] +[ext_resource type="Texture2D" uid="uid://dw3qhu03gxfi7" path="res://assets/gardens/victory_assets/victory_asset_bees.png" id="9_ec7px"] +[ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_j3ks8"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="11_odjw4"] +[ext_resource type="Texture2D" uid="uid://cn0brlkbklxuu" path="res://assets/gardens/victory_assets/animals/ant.png" id="12_j3ks8"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_bwhap") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.52156866, 0.03137255, 0.40392157, 1) +unlocked_lesson_text = Color(0.92156863, 0.7529412, 0.87058824, 1) +completed_lesson = Color(0.92156863, 0.7529412, 0.87058824, 1) +completed_lesson_text = Color(0.52156866, 0.03137255, 0.40392157, 1) +wheel_wedge_unlocked = Color(0.92156863, 0.7529412, 0.87058824, 1) +wheel_background = Color(0.83137256, 0.2901961, 0.7019608, 1) +animal_unlocked_color = Color(0.9490196, 0.36078432, 0.6784314, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.83137256, 0.2901961, 0.7019608, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_j3ks8") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 521.0 +offset_top = 1273.0 +offset_right = 707.0 +offset_bottom = 1407.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_gandt") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=501856240] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 1511.0 +offset_top = 1078.0 +offset_right = 1589.0 +offset_bottom = 1210.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_qxgmk") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1136001964] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 1396.0 +offset_top = 165.0 +offset_right = 1555.0 +offset_bottom = 404.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_3en22") +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=405923099] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 1078.0 +offset_top = 1294.0 +offset_right = 1184.0 +offset_bottom = 1405.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("6_alcdm") +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1834620438] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 881.0 +offset_top = 1109.0 +offset_right = 957.0 +offset_bottom = 1183.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_rkrhb") +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=749079738] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 1661.0 +offset_top = 448.0 +offset_right = 1819.0 +offset_bottom = 597.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_ur7o4") +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=680317182] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 1050.0 +offset_top = 872.0 +offset_right = 1279.0 +offset_bottom = 990.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_ec7px") +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1465342151] +modulate = Color(0.52156866, 0.03137255, 0.40392157, 1) +layout_mode = 0 +offset_left = 984.00006 +offset_top = 214.0 +offset_right = 1211.0 +offset_bottom = 373.0 +scale = Vector2(1.8, 1.8) +mouse_filter = 2 +texture = ExtResource("10_j3ks8") +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("11_odjw4")] +layout_mode = 0 +offset_left = 525.0 +offset_top = 798.0 +offset_right = 765.0 +offset_bottom = 1038.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("11_odjw4")] +layout_mode = 0 +offset_left = 793.0 +offset_top = 633.0 +offset_right = 1033.0 +offset_bottom = 873.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("11_odjw4")] +layout_mode = 0 +offset_left = 1097.0 +offset_top = 556.0 +offset_right = 1337.0 +offset_bottom = 796.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("11_odjw4")] +layout_mode = 0 +offset_left = 1436.0 +offset_top = 631.0 +offset_right = 1676.0 +offset_bottom = 871.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("11_odjw4")] +layout_mode = 0 +offset_left = 1751.0 +offset_top = 766.0 +offset_right = 1991.0 +offset_bottom = 1006.0 +pivot_offset = Vector2(120, 120) + +[node name="Ant" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 547.0 +offset_top = 219.0 +offset_right = 701.0 +offset_bottom = 325.0 +scale = Vector2(2.5, 2.5) +texture = ExtResource("12_j3ks8") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_04.tscn b/resources/gardens/garden_04.tscn new file mode 100644 index 00000000..fd4e6df9 --- /dev/null +++ b/resources/gardens/garden_04.tscn @@ -0,0 +1,204 @@ +[gd_scene format=3 uid="uid://ct6lb3q40fx74"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://l32ekwfso26s" path="res://assets/gardens/gardens/garden_04.png" id="2_0vwua"] +[ext_resource type="Texture2D" uid="uid://br5gguush2y12" path="res://assets/gardens/victory_assets/victory_asset_plant_14.png" id="3_o1sox"] +[ext_resource type="Texture2D" uid="uid://25fnjdr15u77" path="res://assets/gardens/victory_assets/victory_asset_see_shells.png" id="4_1pxce"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://bci22xv1ysyxy" path="res://assets/gardens/victory_assets/victory_asset_sand_umbrella.png" id="5_f13an"] +[ext_resource type="Texture2D" uid="uid://bmqanuxy2hmrb" path="res://assets/gardens/victory_assets/victory_asset_plant_15.png" id="6_stp03"] +[ext_resource type="Texture2D" uid="uid://bpi7cnaepjgsn" path="res://assets/gardens/victory_assets/victory_asset_watermelon.png" id="7_r5gxh"] +[ext_resource type="Texture2D" uid="uid://b2xj4qqvalwar" path="res://assets/gardens/victory_assets/victory_asset_sun.png" id="8_tf7gm"] +[ext_resource type="Texture2D" uid="uid://qhs2fydvrnhk" path="res://assets/gardens/victory_assets/victory_asset_sea_stars.png" id="9_nt0kr"] +[ext_resource type="Texture2D" uid="uid://ddneerabvuyoe" path="res://assets/gardens/victory_assets/victory_asset_birds.png" id="10_0vwua"] +[ext_resource type="Texture2D" uid="uid://d3vt2qpngkkjs" path="res://assets/gardens/victory_assets/animals/crab.png" id="12_2bwv2"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.7490196, 0.2784314, 0, 1) +unlocked_lesson_text = Color(1, 0.7921569, 0.6901961, 1) +completed_lesson = Color(1, 0.7921569, 0.6901961, 1) +completed_lesson_text = Color(0.7490196, 0.2784314, 0, 1) +wheel_wedge_unlocked = Color(1, 0.7921569, 0.6901961, 1) +wheel_background = Color(1, 0.49803922, 0.2, 1) +animal_unlocked_color = Color(1, 0.41960785, 0.2509804, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(1, 0.49803922, 0.2, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_0vwua") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 1574.0 +offset_top = 89.0 +offset_right = 1814.0 +offset_bottom = 502.0 +scale = Vector2(2, 2) +texture = ExtResource("3_o1sox") +stretch_mode = 4 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=660391370] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 568.0 +offset_top = 994.0 +offset_right = 742.0 +offset_bottom = 1221.0 +scale = Vector2(1.6, 1.6) +texture = ExtResource("4_1pxce") +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=2143352103] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 836.0 +offset_top = 342.0 +offset_right = 1096.0 +offset_bottom = 504.0 +scale = Vector2(2, 2) +texture = ExtResource("5_f13an") +stretch_mode = 4 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1871183176] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 1154.0 +offset_top = 1269.0 +offset_right = 1295.0 +offset_bottom = 1456.0 +scale = Vector2(2, 2) +texture = ExtResource("6_stp03") +stretch_mode = 4 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1947559940] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 1639.0 +offset_top = 950.0 +offset_right = 1847.0 +offset_bottom = 1084.0 +scale = Vector2(1.6, 1.6) +texture = ExtResource("7_r5gxh") +stretch_mode = 4 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1976100345] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 1222.0 +offset_top = 120.0 +offset_right = 1461.0 +offset_bottom = 280.0 +scale = Vector2(2, 2) +texture = ExtResource("8_tf7gm") +stretch_mode = 4 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=621612364] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 913.0 +offset_top = 1103.0 +offset_right = 1095.0 +offset_bottom = 1230.0 +scale = Vector2(1.6, 1.6) +texture = ExtResource("9_nt0kr") +stretch_mode = 4 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=977643190] +modulate = Color(0.7490196, 0.2784314, 0, 1) +layout_mode = 0 +offset_left = 1475.0 +offset_top = 525.0 +offset_right = 1634.0 +offset_bottom = 673.0 +scale = Vector2(1.5, 1.5) +texture = ExtResource("10_0vwua") +stretch_mode = 4 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 428.0 +offset_top = 632.0 +offset_right = 668.0 +offset_bottom = 872.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 750.0 +offset_top = 684.0 +offset_right = 990.0 +offset_bottom = 924.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1085.0 +offset_top = 760.0 +offset_right = 1325.0 +offset_bottom = 1000.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1383.0 +offset_top = 975.0 +offset_right = 1623.0 +offset_bottom = 1215.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1607.0 +offset_top = 1250.0 +offset_right = 1847.0 +offset_bottom = 1490.0 +pivot_offset = Vector2(120, 120) + +[node name="Crab" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 630.0 +offset_top = 260.0 +offset_right = 782.0 +offset_bottom = 362.0 +scale = Vector2(2, 2) +texture = ExtResource("12_2bwv2") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_05.tscn b/resources/gardens/garden_05.tscn new file mode 100644 index 00000000..c7c42032 --- /dev/null +++ b/resources/gardens/garden_05.tscn @@ -0,0 +1,220 @@ +[gd_scene format=3 uid="uid://bjs0o30gmhv3l"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://d3bu30iutptwx" path="res://assets/gardens/gardens/garden_05.png" id="2_l6rp4"] +[ext_resource type="Texture2D" uid="uid://c0lcx7x0naofl" path="res://assets/gardens/victory_assets/victory_asset_clouds.png" id="3_l6rp4"] +[ext_resource type="Texture2D" uid="uid://x0skor7vxadl" path="res://assets/gardens/victory_assets/victory_asset_plant_16.png" id="4_0y47p"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://bqafuj82xbdqm" path="res://assets/gardens/victory_assets/victory_asset_bird_treehouse.png" id="5_fja20"] +[ext_resource type="Texture2D" uid="uid://bd5pxoufamqy" path="res://assets/gardens/victory_assets/animals/yellow_parakeet.png" id="5_l6rp4"] +[ext_resource type="Texture2D" uid="uid://bg02dhcrwf5nx" path="res://assets/gardens/victory_assets/victory_asset_plant_17.png" id="6_oapcv"] +[ext_resource type="Texture2D" uid="uid://chtr4d0a80s61" path="res://assets/gardens/victory_assets/victory_asset_plant_18.png" id="7_sjfs7"] +[ext_resource type="Texture2D" uid="uid://c784fmd7v5wkt" path="res://assets/gardens/victory_assets/victory_asset_tumbleweeds.png" id="8_se3av"] +[ext_resource type="Texture2D" uid="uid://bpqo8maufc3gr" path="res://assets/gardens/victory_assets/victory_asset_ladybugs.png" id="9_r7c56"] +[ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_s6qsy"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.7019608, 0.44313726, 0, 1) +unlocked_lesson_text = Color(1, 0.9411765, 0.78039217, 1) +completed_lesson = Color(1, 0.9411765, 0.78039217, 1) +completed_lesson_text = Color(0.7019608, 0.44313726, 0, 1) +wheel_wedge_unlocked = Color(1, 0.9411765, 0.78039217, 1) +wheel_background = Color(0.92156863, 0.6431373, 0, 1) +animal_unlocked_color = Color(1, 0.7607843, 0.10980392, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.92156863, 0.6431373, 0, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_l6rp4") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 624.0 +offset_top = 138.0 +offset_right = 841.0 +offset_bottom = 254.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_l6rp4") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=948698376] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 1132.0 +offset_top = 1289.0 +offset_right = 1208.0 +offset_bottom = 1450.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_0y47p") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1120198189] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 1732.0 +offset_top = 554.0 +offset_right = 1818.0 +offset_bottom = 752.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_fja20") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1510363231] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 629.0 +offset_top = 1161.0 +offset_right = 809.0 +offset_bottom = 1342.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("6_oapcv") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1851075152] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 1107.0 +offset_top = 347.0 +offset_right = 1235.0 +offset_bottom = 516.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_sjfs7") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=852394586] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 1355.0 +offset_top = 1179.0 +offset_right = 1453.0 +offset_bottom = 1280.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_se3av") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=1383257948] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 1426.0 +offset_top = 345.0 +offset_right = 1585.0 +offset_bottom = 509.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_r7c56") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1370235462] +modulate = Color(0.7019608, 0.44313726, 0, 1) +layout_mode = 0 +offset_left = 635.0 +offset_top = 522.0 +offset_right = 862.0 +offset_bottom = 681.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("10_s6qsy") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 404.0 +offset_top = 751.0 +offset_right = 644.0 +offset_bottom = 991.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 753.0 +offset_top = 869.0 +offset_right = 993.0 +offset_bottom = 1109.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1087.0 +offset_top = 792.0 +offset_right = 1327.0 +offset_bottom = 1032.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1428.0 +offset_top = 853.0 +offset_right = 1668.0 +offset_bottom = 1093.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1720.0 +offset_top = 1020.0 +offset_right = 1960.0 +offset_bottom = 1260.0 +pivot_offset = Vector2(120, 120) + +[node name="Yellow Parakeet" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 1625.0 +offset_top = 1303.0 +offset_right = 1745.0 +offset_bottom = 1460.0 +scale = Vector2(2, 2) +texture = ExtResource("5_l6rp4") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_06.tscn b/resources/gardens/garden_06.tscn new file mode 100644 index 00000000..6bc12144 --- /dev/null +++ b/resources/gardens/garden_06.tscn @@ -0,0 +1,220 @@ +[gd_scene format=3 uid="uid://dua725v1fckur"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://bhamsdjj677b3" path="res://assets/gardens/gardens/garden_06.png" id="2_c82qa"] +[ext_resource type="Texture2D" uid="uid://c0lcx7x0naofl" path="res://assets/gardens/victory_assets/victory_asset_clouds.png" id="3_c82qa"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://ctc6i4o6rtj2m" path="res://assets/gardens/victory_assets/victory_asset_plant_19.png" id="4_o7idj"] +[ext_resource type="Texture2D" uid="uid://ixkyfsxu07qx" path="res://assets/gardens/victory_assets/animals/caterpillar.png" id="5_c82qa"] +[ext_resource type="Texture2D" uid="uid://d1jhhus8v37ik" path="res://assets/gardens/victory_assets/victory_asset_plant_20.png" id="5_rqhnb"] +[ext_resource type="Texture2D" uid="uid://dbxswqqflg4n0" path="res://assets/gardens/victory_assets/victory_asset_snail.png" id="6_o1130"] +[ext_resource type="Texture2D" uid="uid://dw3qhu03gxfi7" path="res://assets/gardens/victory_assets/victory_asset_bees.png" id="7_diva3"] +[ext_resource type="Texture2D" uid="uid://bokqjqq5uaar3" path="res://assets/gardens/victory_assets/victory_asset_leaves.png" id="8_ghdsm"] +[ext_resource type="Texture2D" uid="uid://coxmj8uwyu6vd" path="res://assets/gardens/victory_assets/victory_asset_mushroom.png" id="9_1053v"] +[ext_resource type="Texture2D" uid="uid://db6cwc8crw6wo" path="res://assets/gardens/victory_assets/victory_asset_butterfly_02.png" id="10_rqhnb"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.30588236, 0.38039216, 0.03529412, 1) +unlocked_lesson_text = Color(0.96862745, 1, 0.7529412, 1) +completed_lesson = Color(0.96862745, 1, 0.7529412, 1) +completed_lesson_text = Color(0.30588236, 0.38039216, 0.03529412, 1) +wheel_wedge_unlocked = Color(0.96862745, 1, 0.7529412, 1) +wheel_background = Color(0.43529412, 0.50980395, 0.16078432, 1) +animal_unlocked_color = Color(0.7882353, 0.85882354, 0.26666668, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.43529412, 0.50980395, 0.16078432, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_c82qa") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1413.0 +offset_top = 141.0 +offset_right = 1630.0 +offset_bottom = 257.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_c82qa") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=1983677388] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1107.0 +offset_top = 1233.0 +offset_right = 1213.0 +offset_bottom = 1522.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("4_o7idj") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1166073981] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1643.0 +offset_top = 503.0 +offset_right = 1760.0 +offset_bottom = 679.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_rqhnb") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=89715746] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 661.0 +offset_top = 1295.0 +offset_right = 903.0 +offset_bottom = 1402.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("6_o1130") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=728940996] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1033.0 +offset_top = 1033.0 +offset_right = 1262.0 +offset_bottom = 1151.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("7_diva3") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1963527205] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 805.0 +offset_top = 543.0 +offset_right = 980.0 +offset_bottom = 709.0 +scale = Vector2(1.2, 1.2) +mouse_filter = 2 +texture = ExtResource("8_ghdsm") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=418014102] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1479.0 +offset_top = 1237.0 +offset_right = 1637.0 +offset_bottom = 1386.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("9_1053v") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1856525272] +modulate = Color(0.30588236, 0.38039216, 0.03529412, 1) +layout_mode = 0 +offset_left = 1113.0 +offset_top = 351.00003 +offset_right = 1299.0 +offset_bottom = 566.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("10_rqhnb") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 496.0 +offset_top = 954.0 +offset_right = 736.0 +offset_bottom = 1194.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 764.0 +offset_top = 789.0 +offset_right = 1004.0 +offset_bottom = 1029.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1068.0 +offset_top = 712.0 +offset_right = 1308.0 +offset_bottom = 952.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1407.0 +offset_top = 787.0 +offset_right = 1647.0 +offset_bottom = 1027.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1722.0 +offset_top = 922.0 +offset_right = 1962.0 +offset_bottom = 1162.0 +pivot_offset = Vector2(120, 120) + +[node name="Caterpillar" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 481.0 +offset_top = 237.0 +offset_right = 660.0 +offset_bottom = 358.0 +scale = Vector2(2, 2) +texture = ExtResource("5_c82qa") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_07.tscn b/resources/gardens/garden_07.tscn new file mode 100644 index 00000000..10d18029 --- /dev/null +++ b/resources/gardens/garden_07.tscn @@ -0,0 +1,219 @@ +[gd_scene format=3 uid="uid://bcvw6yolfv1y"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://clcff3fg5jd2k" path="res://assets/gardens/gardens/garden_07.png" id="2_qm42s"] +[ext_resource type="Texture2D" uid="uid://dro75vltqiq6j" path="res://assets/gardens/victory_assets/victory_asset_plant_07.png" id="3_68wn2"] +[ext_resource type="Texture2D" uid="uid://n4pv6f7bbtiy" path="res://assets/gardens/victory_assets/victory_asset_plant_21.png" id="3_qm42s"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://vjani6ctt7hc" path="res://assets/gardens/victory_assets/victory_asset_plant_22.png" id="5_4e8bi"] +[ext_resource type="Texture2D" uid="uid://yo3o4m6o7a0" path="res://assets/gardens/victory_assets/animals/frog.png" id="5_qm42s"] +[ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="6_qltia"] +[ext_resource type="Texture2D" uid="uid://bf77plws02i6k" path="res://assets/gardens/victory_assets/victory_asset_flies.png" id="7_vspma"] +[ext_resource type="Texture2D" uid="uid://crkysknynt38e" path="res://assets/gardens/victory_assets/victory_asset_frog.png" id="8_68wn2"] +[ext_resource type="Texture2D" uid="uid://o1af03kn2mcg" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_02.png" id="9_3oqd6"] +[ext_resource type="Texture2D" uid="uid://ckmw2sfht4bq5" path="res://assets/gardens/victory_assets/victory_asset_hearts.png" id="10_pobi3"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0, 0.45882353, 0.25882354, 1) +unlocked_lesson_text = Color(0.7019608, 1, 0.87058824, 1) +completed_lesson = Color(0.7019608, 1, 0.87058824, 1) +completed_lesson_text = Color(0, 0.45882353, 0.25882354, 1) +wheel_wedge_unlocked = Color(0.7019608, 1, 0.87058824, 1) +wheel_background = Color(0.078431375, 0.7607843, 0.4627451, 1) +animal_unlocked_color = Color(0.078431375, 0.7607843, 0.4627451, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.078431375, 0.7607843, 0.4627451, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_qm42s") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 531.0 +offset_top = 307.0 +offset_right = 639.0 +offset_bottom = 538.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_qm42s") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=171933914] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 1227.0 +offset_top = 1089.0 +offset_right = 1358.0 +offset_bottom = 1320.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("3_68wn2") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1303970396] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 673.0 +offset_top = 1283.0 +offset_right = 877.0 +offset_bottom = 1391.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("5_4e8bi") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=857948709] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 1215.0 +offset_top = 549.0 +offset_right = 1404.0 +offset_bottom = 691.0 +scale = Vector2(1.2, 1.2) +mouse_filter = 2 +texture = ExtResource("6_qltia") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1162690616] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 1489.0 +offset_top = 1151.0 +offset_right = 1622.0 +offset_bottom = 1238.0 +mouse_filter = 2 +texture = ExtResource("7_vspma") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1791492646] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 891.0 +offset_top = 1109.0 +offset_right = 1023.0 +offset_bottom = 1224.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_68wn2") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=975248578] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 801.0 +offset_top = 469.0 +offset_right = 965.0 +offset_bottom = 609.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_3oqd6") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=855537289] +modulate = Color(0, 0.45882353, 0.25882354, 1) +layout_mode = 0 +offset_left = 1061.0 +offset_top = 1045.0 +offset_right = 1126.0 +offset_bottom = 1179.0 +scale = Vector2(1.2, 1.2) +mouse_filter = 2 +texture = ExtResource("10_pobi3") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 494.0 +offset_top = 1052.0 +offset_right = 734.0 +offset_bottom = 1292.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 762.0 +offset_top = 887.0 +offset_right = 1002.0 +offset_bottom = 1127.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1066.0 +offset_top = 810.0 +offset_right = 1306.0 +offset_bottom = 1050.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1405.0 +offset_top = 885.0 +offset_right = 1645.0 +offset_bottom = 1125.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1726.0 +offset_top = 718.0 +offset_right = 1966.0 +offset_bottom = 958.0 +pivot_offset = Vector2(120, 120) + +[node name="Frog" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 1489.0 +offset_top = 359.0 +offset_right = 1657.0 +offset_bottom = 484.0 +scale = Vector2(2, 2) +texture = ExtResource("5_qm42s") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_08.tscn b/resources/gardens/garden_08.tscn new file mode 100644 index 00000000..ef1ab2a4 --- /dev/null +++ b/resources/gardens/garden_08.tscn @@ -0,0 +1,218 @@ +[gd_scene format=3 uid="uid://blk1dw8m5qrxx"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://kgeoctiggnxx" path="res://assets/gardens/gardens/garden_08.png" id="2_fd7lh"] +[ext_resource type="Texture2D" uid="uid://br5gguush2y12" path="res://assets/gardens/victory_assets/victory_asset_plant_14.png" id="3_6wkbm"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://yag8afxcasm1" path="res://assets/gardens/victory_assets/victory_asset_torch.png" id="4_xgdw6"] +[ext_resource type="Texture2D" uid="uid://kygm5ieixgne" path="res://assets/gardens/victory_assets/animals/monkey.png" id="5_fd7lh"] +[ext_resource type="Texture2D" uid="uid://8kmojsnwp657" path="res://assets/gardens/victory_assets/victory_asset_plant_23.png" id="5_sqwgp"] +[ext_resource type="Texture2D" uid="uid://dlxljmb4wnx2o" path="res://assets/gardens/victory_assets/victory_asset_monkey.png" id="6_04ydh"] +[ext_resource type="Texture2D" uid="uid://dyau6e65xdsb8" path="res://assets/gardens/victory_assets/victory_asset_plant_24.png" id="7_xgdw6"] +[ext_resource type="Texture2D" uid="uid://d3i313p52n6h8" path="res://assets/gardens/victory_assets/victory_asset_coconut.png" id="8_1by5a"] +[ext_resource type="Texture2D" uid="uid://c7lgiyapshr23" path="res://assets/gardens/victory_assets/victory_asset_plant_25.png" id="9_08dq4"] +[ext_resource type="Texture2D" uid="uid://uepox6kvky5" path="res://assets/gardens/victory_assets/victory_asset_crown.png" id="10_7g80l"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.36078432, 0.19607843, 0.03137255, 1) +unlocked_lesson_text = Color(1, 0.8784314, 0.7607843, 1) +completed_lesson = Color(1, 0.8784314, 0.7607843, 1) +completed_lesson_text = Color(0.36078432, 0.19607843, 0.03137255, 1) +wheel_wedge_unlocked = Color(1, 0.8784314, 0.7607843, 1) +wheel_background = Color(0.54901963, 0.40784314, 0.26666668, 1) +animal_unlocked_color = Color(0.8509804, 0.6, 0.33333334, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.54901963, 0.40784314, 0.26666668, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_fd7lh") +expand_mode = 1 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 575.0 +offset_top = 154.0 +offset_right = 815.0 +offset_bottom = 567.0 +mouse_filter = 2 +texture = ExtResource("3_6wkbm") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=1630745727] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 1331.0 +offset_top = 1168.0 +offset_right = 1382.0 +offset_bottom = 1380.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_xgdw6") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1794013317] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 1207.0 +offset_top = 649.0 +offset_right = 1346.0 +offset_bottom = 757.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_sqwgp") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=454634667] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 1016.0 +offset_top = 103.0 +offset_right = 1491.0 +offset_bottom = 506.0 +scale = Vector2(0.8, 0.8) +mouse_filter = 2 +texture = ExtResource("6_04ydh") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=496718290] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 581.0 +offset_top = 1105.0 +offset_right = 849.0 +offset_bottom = 1313.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_xgdw6") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1049631704] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 992.0 +offset_top = 555.0 +offset_right = 1062.0 +offset_bottom = 629.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_1by5a") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=1645385804] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 1536.0001 +offset_top = 335.0 +offset_right = 1649.0001 +offset_bottom = 504.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("9_08dq4") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1819785466] +modulate = Color(0.36078432, 0.19607843, 0.03137255, 1) +layout_mode = 0 +offset_left = 1558.0 +offset_top = 1258.0 +offset_right = 1648.0 +offset_bottom = 1327.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("10_7g80l") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 434.0 +offset_top = 650.0 +offset_right = 674.0 +offset_bottom = 890.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 738.0 +offset_top = 835.0 +offset_right = 978.0 +offset_bottom = 1075.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1084.0 +offset_top = 982.0 +offset_right = 1324.0 +offset_bottom = 1222.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1449.0 +offset_top = 871.0 +offset_right = 1689.0 +offset_bottom = 1111.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1732.0 +offset_top = 624.0 +offset_right = 1972.0 +offset_bottom = 864.0 +pivot_offset = Vector2(120, 120) + +[node name="Monkey" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 1467.0 +offset_top = 1372.0 +offset_right = 1625.0 +offset_bottom = 1507.0 +scale = Vector2(2, 2) +texture = ExtResource("5_fd7lh") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_09.tscn b/resources/gardens/garden_09.tscn new file mode 100644 index 00000000..b4fdecf4 --- /dev/null +++ b/resources/gardens/garden_09.tscn @@ -0,0 +1,219 @@ +[gd_scene format=3 uid="uid://bboubmocwjw80"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://dqk14m4demy3a" path="res://assets/gardens/gardens/garden_09.png" id="2_30y1d"] +[ext_resource type="Texture2D" uid="uid://c0lcx7x0naofl" path="res://assets/gardens/victory_assets/victory_asset_clouds.png" id="3_30y1d"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://x0skor7vxadl" path="res://assets/gardens/victory_assets/victory_asset_plant_16.png" id="4_pac6c"] +[ext_resource type="Texture2D" uid="uid://da7ppeamjqjpw" path="res://assets/gardens/victory_assets/animals/red_parakeet.png" id="5_30y1d"] +[ext_resource type="Texture2D" uid="uid://bqafuj82xbdqm" path="res://assets/gardens/victory_assets/victory_asset_bird_treehouse.png" id="5_j4wf1"] +[ext_resource type="Texture2D" uid="uid://bg02dhcrwf5nx" path="res://assets/gardens/victory_assets/victory_asset_plant_17.png" id="6_ym7nb"] +[ext_resource type="Texture2D" uid="uid://chtr4d0a80s61" path="res://assets/gardens/victory_assets/victory_asset_plant_18.png" id="7_6bl1j"] +[ext_resource type="Texture2D" uid="uid://c784fmd7v5wkt" path="res://assets/gardens/victory_assets/victory_asset_tumbleweeds.png" id="8_j8gqo"] +[ext_resource type="Texture2D" uid="uid://bpqo8maufc3gr" path="res://assets/gardens/victory_assets/victory_asset_ladybugs.png" id="9_2xyhj"] +[ext_resource type="Texture2D" uid="uid://its5dfr0ipak" path="res://assets/gardens/victory_assets/victory_asset_butterfly_01.png" id="10_cr4yr"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.6, 0, 0, 1) +unlocked_lesson_text = Color(1, 0.7254902, 0.7019608, 1) +completed_lesson = Color(1, 0.7254902, 0.7019608, 1) +completed_lesson_text = Color(0.6, 0, 0, 1) +wheel_wedge_unlocked = Color(1, 0.7607843, 0.7411765, 1) +wheel_background = Color(0.92156863, 0.3882353, 0.3882353, 1) +animal_unlocked_color = Color(1, 0.4, 0.4117647, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.92156863, 0.3882353, 0.3882353, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_30y1d") +expand_mode = 1 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 685.0 +offset_top = 125.0 +offset_right = 902.0 +offset_bottom = 241.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_30y1d") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=155087516] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 1195.0 +offset_top = 1383.0 +offset_right = 1271.0 +offset_bottom = 1544.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_pac6c") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=492879557] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 1641.0 +offset_top = 541.0 +offset_right = 1727.0 +offset_bottom = 739.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("5_j4wf1") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1151142486] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 799.0 +offset_top = 1301.0 +offset_right = 979.0 +offset_bottom = 1482.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("6_ym7nb") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1467200212] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 835.0 +offset_top = 499.0 +offset_right = 963.0 +offset_bottom = 668.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_6bl1j") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=306689141] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 1551.0 +offset_top = 1333.0 +offset_right = 1649.0 +offset_bottom = 1434.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_j8gqo") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=1009479170] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 1235.0 +offset_top = 473.0 +offset_right = 1394.0 +offset_bottom = 637.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("9_2xyhj") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1832005076] +modulate = Color(0.6, 0, 0, 1) +layout_mode = 0 +offset_left = 1145.0 +offset_top = 1117.0 +offset_right = 1372.0 +offset_bottom = 1276.0 +scale = Vector2(1.25, 1.25) +mouse_filter = 2 +texture = ExtResource("10_cr4yr") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 572.0 +offset_top = 1008.0 +offset_right = 812.0 +offset_bottom = 1248.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 850.0 +offset_top = 881.0 +offset_right = 1090.0 +offset_bottom = 1121.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1154.0 +offset_top = 820.0 +offset_right = 1394.0 +offset_bottom = 1060.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1457.0 +offset_top = 899.0 +offset_right = 1697.0 +offset_bottom = 1139.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1732.0 +offset_top = 1020.0 +offset_right = 1972.0 +offset_bottom = 1260.0 +pivot_offset = Vector2(120, 120) + +[node name="Red Parakeet" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 429.0 +offset_top = 349.0 +offset_right = 549.0 +offset_bottom = 506.0 +scale = Vector2(2, 2) +texture = ExtResource("5_30y1d") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_10.tscn b/resources/gardens/garden_10.tscn new file mode 100644 index 00000000..49e248fa --- /dev/null +++ b/resources/gardens/garden_10.tscn @@ -0,0 +1,219 @@ +[gd_scene format=3 uid="uid://4uyls7ihyc51"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://cahtl4j3wxahn" path="res://assets/gardens/gardens/garden_10.png" id="2_sa1k7"] +[ext_resource type="Texture2D" uid="uid://dcekseb1b3ruw" path="res://assets/gardens/victory_assets/victory_asset_plant_01.png" id="3_0g0ua"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://clkr31osbqs7u" path="res://assets/gardens/victory_assets/victory_asset_plant_02.png" id="4_md4b1"] +[ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="5_urjxd"] +[ext_resource type="Texture2D" uid="uid://dufnm3bkfe5yv" path="res://assets/gardens/victory_assets/victory_asset_plant_05.png" id="6_ipdnh"] +[ext_resource type="Texture2D" uid="uid://dt2a0dea0hv0c" path="res://assets/gardens/victory_assets/victory_asset_fish_02.png" id="7_xkwcf"] +[ext_resource type="Texture2D" uid="uid://bqp1nkk53y1is" path="res://assets/gardens/victory_assets/victory_asset_plant_03.png" id="8_w51id"] +[ext_resource type="Texture2D" uid="uid://dcuobvoav863b" path="res://assets/gardens/victory_assets/animals/pink_jellyfish.png" id="8_xkwcf"] +[ext_resource type="Texture2D" uid="uid://dvxnktx1wiyxp" path="res://assets/gardens/victory_assets/victory_asset_bubbles.png" id="9_knmfc"] +[ext_resource type="Texture2D" uid="uid://f2arml2f4b8p" path="res://assets/gardens/victory_assets/victory_asset_plant_04.png" id="10_83oc2"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.6509804, 0.2901961, 0.5019608, 1) +unlocked_lesson_text = Color(1, 0.81960785, 0.9254902, 1) +completed_lesson = Color(1, 0.81960785, 0.9254902, 1) +completed_lesson_text = Color(0.6509804, 0.2901961, 0.5019608, 1) +wheel_wedge_unlocked = Color(1, 0.81960785, 0.9254902, 1) +wheel_background = Color(0.87058824, 0.3882353, 0.67058825, 1) +animal_unlocked_color = Color(1, 0.49019608, 0.76862746, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.87058824, 0.3882353, 0.67058825, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_sa1k7") +expand_mode = 1 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 370.0 +offset_top = 148.0 +offset_right = 449.0 +offset_bottom = 777.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("3_0g0ua") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=639876396] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 809.0 +offset_top = 1309.0 +offset_right = 892.0 +offset_bottom = 1449.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("4_md4b1") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=2017285664] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 1134.0 +offset_top = 1008.0 +offset_right = 1323.0 +offset_bottom = 1150.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_urjxd") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1043593306] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 1073.0 +offset_top = 1290.0 +offset_right = 1125.0 +offset_bottom = 1498.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("6_ipdnh") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=287565494] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 1317.0 +offset_top = 301.0 +offset_right = 1478.0 +offset_bottom = 462.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_xkwcf") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1951757820] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 791.0 +offset_top = 330.0 +offset_right = 910.0 +offset_bottom = 498.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_w51id") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=574678348] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 559.0 +offset_top = 612.0 +offset_right = 616.0 +offset_bottom = 735.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_knmfc") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=1778122463] +modulate = Color(0.6509804, 0.2901961, 0.5019608, 1) +layout_mode = 0 +offset_left = 1321.0 +offset_top = 1352.0 +offset_right = 1394.0 +offset_bottom = 1477.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("10_83oc2") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 494.0 +offset_top = 1052.0 +offset_right = 734.0 +offset_bottom = 1292.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 762.0 +offset_top = 887.0 +offset_right = 1002.0 +offset_bottom = 1127.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1034.0 +offset_top = 706.0 +offset_right = 1274.0 +offset_bottom = 946.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1387.0 +offset_top = 723.0 +offset_right = 1627.0 +offset_bottom = 963.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1586.0 +offset_top = 978.0 +offset_right = 1826.0 +offset_bottom = 1218.0 +pivot_offset = Vector2(120, 120) + +[node name="Pink Jellyfish" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 1667.0 +offset_top = 19.0 +offset_right = 2245.0 +offset_bottom = 996.0 +scale = Vector2(0.6, 0.6) +texture = ExtResource("8_xkwcf") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_11.tscn b/resources/gardens/garden_11.tscn new file mode 100644 index 00000000..26f2a405 --- /dev/null +++ b/resources/gardens/garden_11.tscn @@ -0,0 +1,231 @@ +[gd_scene format=3 uid="uid://c2yff8xrssk83"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://dpl670l7onk5n" path="res://assets/gardens/gardens/garden_11.png" id="2_13gkf"] +[ext_resource type="Texture2D" uid="uid://dckd1xhcdf2ie" path="res://assets/gardens/victory_assets/victory_asset_plant_06.png" id="3_13gkf"] +[ext_resource type="Texture2D" uid="uid://dro75vltqiq6j" path="res://assets/gardens/victory_assets/victory_asset_plant_07.png" id="3_th10l"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://6bosyi1wv8vu" path="res://assets/gardens/victory_assets/animals/khaki_turtle.png" id="5_13gkf"] +[ext_resource type="Texture2D" uid="uid://blaltndbcv2yq" path="res://assets/gardens/victory_assets/victory_asset_plant_08.png" id="5_m2rr7"] +[ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="6_th10l"] +[ext_resource type="Texture2D" uid="uid://bv510d5r4dn82" path="res://assets/gardens/victory_assets/victory_asset_dragon_flies_01.png" id="7_t2ok3"] +[ext_resource type="Texture2D" uid="uid://bpxc4vhri16pd" path="res://assets/gardens/victory_assets/victory_asset_pearl.png" id="8_26esv"] +[ext_resource type="Texture2D" uid="uid://co6vu63bybpnc" path="res://assets/gardens/victory_assets/victory_asset_plant_09.png" id="9_lswb8"] +[ext_resource type="Texture2D" uid="uid://gm5x5p2f07rh" path="res://assets/gardens/victory_assets/victory_asset_plant_10.png" id="10_m37ct"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0.3372549, 0.29803923, 0.16470589, 1) +unlocked_lesson_text = Color(0.9490196, 0.8901961, 0.72156864, 1) +completed_lesson = Color(0.9490196, 0.8901961, 0.72156864, 1) +completed_lesson_text = Color(0.3372549, 0.29803923, 0.16470589, 1) +wheel_wedge_unlocked = Color(0.9490196, 0.8901961, 0.72156864, 1) +wheel_background = Color(0.6117647, 0.5176471, 0.23137255, 1) +animal_unlocked_color = Color(0.7882353, 0.70980394, 0.43529412, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.6117647, 0.5176471, 0.23137255, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_13gkf") +expand_mode = 1 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 1623.0 +offset_top = 549.0 +offset_right = 1782.0 +offset_bottom = 719.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("3_13gkf") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=1249100073] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 799.0 +offset_top = 1233.0 +offset_right = 930.0 +offset_bottom = 1464.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("3_th10l") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=1357302889] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 1225.0 +offset_top = 311.0 +offset_right = 1388.0 +offset_bottom = 473.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("5_m2rr7") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=482395264] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 1121.0 +offset_top = 1293.0 +offset_right = 1310.0 +offset_bottom = 1435.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("6_th10l") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=1185193626] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 989.0 +offset_top = 1081.0 +offset_right = 1116.0 +offset_bottom = 1142.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("7_t2ok3") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=1997244728] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 1569.0 +offset_top = 1255.0 +offset_right = 1657.0 +offset_bottom = 1346.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("8_26esv") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=990129889] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 853.0 +offset_top = 351.0 +offset_right = 958.0 +offset_bottom = 526.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("9_lswb8") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=420651120] +modulate = Color(0.3372549, 0.29803923, 0.16470589, 1) +layout_mode = 0 +offset_left = 567.0 +offset_top = 679.0 +offset_right = 648.0 +offset_bottom = 761.0 +scale = Vector2(2, 2) +mouse_filter = 2 +texture = ExtResource("10_m37ct") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 494.0 +offset_top = 1052.0 +offset_right = 734.0 +offset_bottom = 1292.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 762.0 +offset_top = 887.0 +offset_right = 1002.0 +offset_bottom = 1127.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1066.0 +offset_top = 810.0 +offset_right = 1306.0 +offset_bottom = 1050.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1405.0 +offset_top = 885.0 +offset_right = 1645.0 +offset_bottom = 1125.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1720.0 +offset_top = 1020.0 +offset_right = 1960.0 +offset_bottom = 1260.0 +pivot_offset = Vector2(120, 120) + +[node name="Turtle_01" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 569.0 +offset_top = 99.0 +offset_right = 709.0 +offset_bottom = 236.0 +scale = Vector2(2, 2) +texture = ExtResource("5_13gkf") +expand_mode = 1 +stretch_mode = 5 + +[node name="Turtle_02" type="TextureRect" parent="." unique_id=1077405437] +layout_mode = 0 +offset_left = 395.0 +offset_top = 409.00003 +offset_right = 535.0 +offset_bottom = 546.0 +rotation = -0.30425045 +scale = Vector2(1.2, 1.2) +texture = ExtResource("5_13gkf") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_12.tscn b/resources/gardens/garden_12.tscn new file mode 100644 index 00000000..bcf6691d --- /dev/null +++ b/resources/gardens/garden_12.tscn @@ -0,0 +1,220 @@ +[gd_scene format=3 uid="uid://dlq2i1hs2w3n6"] + +[ext_resource type="Script" uid="uid://ch5h4p1o54whq" path="res://resources/gardens/garden.gd" id="1_5owem"] +[ext_resource type="Texture2D" uid="uid://b6pmtjjp4rejb" path="res://assets/gardens/gardens/garden_12.png" id="2_xmsgp"] +[ext_resource type="Texture2D" uid="uid://jid1k44bn2xx" path="res://assets/gardens/victory_assets/victory_asset_mountain.png" id="3_xmsgp"] +[ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="4_epm30"] +[ext_resource type="Texture2D" uid="uid://cjb3ygn2iycj4" path="res://assets/gardens/victory_assets/victory_asset_plant_26.png" id="4_go3so"] +[ext_resource type="Texture2D" uid="uid://dgssb0oonuqku" path="res://assets/gardens/victory_assets/victory_asset_fish_01.png" id="5_88yjd"] +[ext_resource type="Texture2D" uid="uid://cy1nrnl520goj" path="res://assets/gardens/victory_assets/animals/penguin.png" id="5_xmsgp"] +[ext_resource type="Texture2D" uid="uid://d0je2xrnu1gem" path="res://assets/gardens/victory_assets/victory_asset_snowman.png" id="6_4h4hf"] +[ext_resource type="Texture2D" uid="uid://bcjk0l771ugvq" path="res://assets/gardens/victory_assets/victory_asset_snowpile.png" id="7_wf34p"] +[ext_resource type="Texture2D" uid="uid://0g80o48ewp7d" path="res://assets/gardens/victory_assets/victory_asset_cloud_snow.png" id="8_4h4hf"] +[ext_resource type="Texture2D" uid="uid://28wjedoatx7c" path="res://assets/gardens/victory_assets/victory_asset_whale.png" id="9_m7voh"] +[ext_resource type="Texture2D" uid="uid://bqxwflyxhcdvw" path="res://assets/gardens/victory_assets/victory_asset_snowflakes.png" id="10_g51bh"] + +[node name="GardenRoot" type="Control" unique_id=167073905] +custom_minimum_size = Vector2(2400, 2.08165e-12) +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_5owem") +title = "Purple Turtle Garden" +unlocked_lesson = Color(0, 0.5529412, 0.76862746, 1) +unlocked_lesson_text = Color(0.78431374, 0.9019608, 0.9529412, 1) +completed_lesson = Color(0.78431374, 0.9019608, 0.9529412, 1) +completed_lesson_text = Color(0, 0.5529412, 0.76862746, 1) +wheel_wedge_unlocked = Color(0.78431374, 0.9019608, 0.9529412, 1) +wheel_background = Color(0.3372549, 0.76862746, 0.9372549, 1) +animal_unlocked_color = Color(0.34901962, 0.84705883, 1, 1) + +[node name="Background" type="TextureRect" parent="." unique_id=1058030897] +unique_name_in_owner = true +modulate = Color(0.3372549, 0.76862746, 0.9372549, 1) +layout_mode = 0 +offset_left = 350.0 +offset_top = 50.0 +offset_right = 2050.0 +offset_bottom = 1750.0 +mouse_filter = 2 +texture = ExtResource("2_xmsgp") +expand_mode = 1 + +[node name="Victory_Assets" type="Control" parent="." unique_id=787934313] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Victory_Asset_01" type="TextureRect" parent="Victory_Assets" unique_id=1278004645] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 755.0 +offset_top = 314.0 +offset_right = 978.0 +offset_bottom = 394.0 +scale = Vector2(2.5, 2.5) +mouse_filter = 2 +texture = ExtResource("3_xmsgp") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_02" type="TextureRect" parent="Victory_Assets" unique_id=668076947] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 1376.0 +offset_top = 275.0 +offset_right = 1475.0 +offset_bottom = 409.0 +scale = Vector2(3, 3) +mouse_filter = 2 +texture = ExtResource("4_go3so") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_03" type="TextureRect" parent="Victory_Assets" unique_id=2032790296] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 852.0 +offset_top = 1155.0 +offset_right = 1013.0 +offset_bottom = 1316.0 +scale = Vector2(1.5, 1.5) +mouse_filter = 2 +texture = ExtResource("5_88yjd") +expand_mode = 1 +stretch_mode = 5 +flip_h = true + +[node name="Victory_Asset_04" type="TextureRect" parent="Victory_Assets" unique_id=1525582337] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 1705.0 +offset_top = 867.0 +offset_right = 1796.0 +offset_bottom = 952.0 +scale = Vector2(3, 3) +mouse_filter = 2 +texture = ExtResource("6_4h4hf") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_05" type="TextureRect" parent="Victory_Assets" unique_id=322571717] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 1490.0001 +offset_top = 1523.0 +offset_right = 1627.0001 +offset_bottom = 1586.0 +scale = Vector2(3, 3) +mouse_filter = 2 +texture = ExtResource("7_wf34p") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_06" type="TextureRect" parent="Victory_Assets" unique_id=513223434] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 993.0 +offset_top = 35.0 +offset_right = 1118.0 +offset_bottom = 187.0 +scale = Vector2(2.2, 2.2) +mouse_filter = 2 +texture = ExtResource("8_4h4hf") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_07" type="TextureRect" parent="Victory_Assets" unique_id=354507578] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 851.0 +offset_top = 927.0 +offset_right = 1009.0 +offset_bottom = 992.0 +scale = Vector2(3, 3) +mouse_filter = 2 +texture = ExtResource("9_m7voh") +expand_mode = 1 +stretch_mode = 5 + +[node name="Victory_Asset_08" type="TextureRect" parent="Victory_Assets" unique_id=705391478] +modulate = Color(0, 0.5529412, 0.76862746, 1) +layout_mode = 0 +offset_left = 1609.0 +offset_top = 612.0 +offset_right = 1685.0 +offset_bottom = 689.0 +scale = Vector2(3, 3) +mouse_filter = 2 +texture = ExtResource("10_g51bh") +expand_mode = 1 +stretch_mode = 5 + +[node name="Buttons" type="Control" parent="." unique_id=1964597] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="Slot1" parent="Buttons" unique_id=1361620593 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 434.0 +offset_top = 452.0 +offset_right = 674.0 +offset_bottom = 692.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot2" parent="Buttons" unique_id=1025579258 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 800.0 +offset_top = 537.0 +offset_right = 1040.0 +offset_bottom = 777.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot3" parent="Buttons" unique_id=353688519 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1165.0 +offset_top = 658.0 +offset_right = 1405.0 +offset_bottom = 898.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot4" parent="Buttons" unique_id=1536126098 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1410.0 +offset_top = 1016.0 +offset_right = 1650.0 +offset_bottom = 1256.0 +pivot_offset = Vector2(120, 120) + +[node name="Slot5" parent="Buttons" unique_id=960033946 instance=ExtResource("4_epm30")] +layout_mode = 0 +offset_left = 1144.0 +offset_top = 1328.0 +offset_right = 1384.0 +offset_bottom = 1568.0 +pivot_offset = Vector2(120, 120) + +[node name="Penguin" type="TextureRect" parent="." unique_id=518902024] +layout_mode = 0 +offset_left = 564.0 +offset_top = 2.0 +offset_right = 691.0 +offset_bottom = 159.0 +scale = Vector2(2, 2) +texture = ExtResource("5_xmsgp") +expand_mode = 1 +stretch_mode = 5 diff --git a/resources/gardens/garden_layout.gd b/resources/gardens/garden_layout.gd index 7e0484cf..27336383 100644 --- a/resources/gardens/garden_layout.gd +++ b/resources/gardens/garden_layout.gd @@ -3,38 +3,20 @@ class_name GardenLayout extends Resource enum FirstOrLast { - First, - Neither, - Last + FIRST, + NEITHER, + LAST } @export var color: int = 0 -@export var flowers_export: Array[Dictionary] = []: - set = set_flowers_export @export var lesson_buttons_export: Array[Dictionary] = []: set = set_lesson_buttons_export -@export var is_first_or_last: FirstOrLast = FirstOrLast.Neither +@export var is_first_or_last: FirstOrLast = FirstOrLast.NEITHER -var flowers: Array[Flower] = []: - set = set_flowers var lesson_buttons: Array[GardenLayoutLessonButton] = []: set = set_lesson_buttons -func set_flowers_export(p_flowers_export: Array[Dictionary]) -> void: - flowers_export = p_flowers_export - flowers.clear() - for flower_dict: Dictionary in flowers_export: - flowers.append(Flower.from_dict(flower_dict)) - - -func set_flowers(p_flowers: Array[Flower]) -> void: - flowers = p_flowers - flowers_export.clear() - for flower: Flower in flowers: - flowers_export.append(flower.to_dict()) - - func set_lesson_buttons_export(p_lesson_buttons_export: Array[Dictionary]) -> void: lesson_buttons_export = p_lesson_buttons_export lesson_buttons.clear() @@ -49,44 +31,20 @@ func set_lesson_buttons(p_lesson_buttons: Array[GardenLayoutLessonButton]) -> vo lesson_buttons_export.append(lesson_button.to_dict()) -class Flower: - var color: int = 0 - var type: int = 0 - var position: Vector2 = Vector2i.ZERO - - - func _init(p_color: int = 0, p_type: int = 0, p_position: Vector2i = Vector2i.ZERO) -> void: - color = p_color - type = p_type - position = p_position - - - static func from_dict(d: Dictionary) -> Flower: - return Flower.new(d.color as int, d.type as int, d.position as Vector2i) - - - func to_dict() -> Dictionary: - return { - color = color, - type = type, - position = position, - } - - class GardenLayoutLessonButton: var position: Vector2i = Vector2i.ZERO var path_out_position: Vector2i = Vector2i.ZERO - - + + func _init(p_position: Vector2i = Vector2i.ZERO, p_path_out_position: Vector2i = Vector2i.ZERO) -> void: position = p_position path_out_position = p_path_out_position - - + + static func from_dict(d: Dictionary) -> GardenLayoutLessonButton: return GardenLayoutLessonButton.new(d.position as Vector2i, d.path_out_position as Vector2i) - - + + func to_dict() -> Dictionary: return { position = position, diff --git a/resources/shaders/grayscale.gdshader b/resources/shaders/grayscale.gdshader new file mode 100644 index 00000000..406d9cef --- /dev/null +++ b/resources/shaders/grayscale.gdshader @@ -0,0 +1,7 @@ +shader_type canvas_item; + +void fragment() { + vec4 tex = texture(TEXTURE, UV); + float gray = dot(tex.rgb, vec3(0.299, 0.587, 0.114)); + COLOR = vec4(gray, gray, gray, tex.a); +} diff --git a/resources/shaders/grayscale.gdshader.uid b/resources/shaders/grayscale.gdshader.uid new file mode 100644 index 00000000..bcf37314 --- /dev/null +++ b/resources/shaders/grayscale.gdshader.uid @@ -0,0 +1 @@ +uid://bulhmeqr1cvlx diff --git a/resources/themes/minigames_label_settings_turtles.tres b/resources/themes/minigames_label_settings_turtles.tres index 5ac4cbcc..c96eec8d 100644 --- a/resources/themes/minigames_label_settings_turtles.tres +++ b/resources/themes/minigames_label_settings_turtles.tres @@ -4,7 +4,7 @@ [resource] font = ExtResource("1_s26u4") -font_size = 100 +font_size = 90 font_color = Color(0.2, 0.2, 0.2, 1) outline_color = Color(0.2, 0.2, 0.2, 1) shadow_size = 0 diff --git a/resources/user/student_data.gd b/resources/user/student_data.gd index e059c974..e8ccaaa1 100644 --- a/resources/user/student_data.gd +++ b/resources/user/student_data.gd @@ -2,14 +2,14 @@ class_name StudentData extends Resource enum Level { - Beginner, - Reviewer, - Adult + BEGINNER, + REVIEWER, + ADULT } @export var code: int = 0 @export var name: String = "" -@export var level: Level = Level.Beginner +@export var level: Level = Level.BEGINNER @export var age: int = 0 @export var last_modified: String = "" diff --git a/resources/user/student_progression.gd b/resources/user/student_progression.gd index 4f119eae..67736be5 100644 --- a/resources/user/student_progression.gd +++ b/resources/user/student_progression.gd @@ -4,9 +4,9 @@ extends Resource signal progression_changed() enum Status{ - Locked, - Unlocked, - Completed, + LOCKED, + UNLOCKED, + COMPLETED, } static var cached_boss_gate_lessons: Array[int] = [] @@ -28,6 +28,52 @@ func _init() -> void: init_unlocks() +static func get_minigame_count_for_lesson(lesson_number: int) -> int: + return Database.get_exercise_for_lesson(lesson_number).size() + + +static func _build_default_lesson_unlock(lesson_number: int) -> Dictionary: + var minigame_count: int = get_minigame_count_for_lesson(lesson_number) + return { + "look_and_learn": Status.LOCKED, + "games": _make_locked_games_array(minigame_count), + "last_duration": _make_zero_durations(minigame_count), + "total_duration": _make_zero_durations(minigame_count), + } + + +static func _make_locked_games_array(minigame_count: int) -> Array: + var games: Array = [] + for _index: int in range(minigame_count): + games.append(Status.LOCKED) + return games + + +static func _make_zero_durations(minigame_count: int) -> PackedInt32Array: + var durations: PackedInt32Array = PackedInt32Array() + durations.resize(minigame_count) + return durations + + +# Resizes a games status array to target_size, keeping the existing statuses for +# the slots that remain (trim surplus / pad new slots with LOCKED). Used when a +# lesson's minigame count changes so old saves don't lose progress on resize. +static func _resize_games_array(games: Array, target_size: int) -> Array: + var resized: Array = [] + for index: int in range(target_size): + resized.append(games[index] if index < games.size() else Status.LOCKED) + return resized + + +# Same idea for the duration metrics: keep recorded times for remaining slots. +static func _resize_durations(durations: PackedInt32Array, target_size: int) -> PackedInt32Array: + var resized: PackedInt32Array = PackedInt32Array() + resized.resize(target_size) + for index: int in range(mini(target_size, durations.size())): + resized[index] = durations[index] + return resized + + # Make sure the unlocks are correct func init_unlocks() -> void: if not unlocks: @@ -35,27 +81,18 @@ func init_unlocks() -> void: else: unlocks = unlocks # Force ensure_data_integrity() _sanitize_boss_progression() - + # Verify the lessons var number_of_lessons: int = Database.get_lessons_count() if unlocks.size() != number_of_lessons: for index: int in range(number_of_lessons): if not unlocks.has(index+1): - unlocks[index + 1] = { - "look_and_learn": Status.Locked, - "games": [ - Status.Locked, - Status.Locked, - Status.Locked, - ], - "last_duration": PackedInt32Array([0, 0, 0]), - "total_duration": PackedInt32Array([0, 0, 0]) - } + unlocks[index + 1] = _build_default_lesson_unlock(index + 1) # Make sure that the first garden is always accessible if unlocks.has(1): - if unlocks[1]["look_and_learn"] == Status.Locked: - unlocks[1]["look_and_learn"] = Status.Unlocked + if unlocks[1]["look_and_learn"] == Status.LOCKED: + unlocks[1]["look_and_learn"] = Status.UNLOCKED _sanitize_boss_progression() @@ -74,41 +111,50 @@ func ensure_data_integrity(data: Dictionary[int, Dictionary]) -> Dictionary: if not result.has(index): if not is_init: Log.warn("StudentProgression: Garden %d missing → added with default values." % index) - result[index] = { - "games": [Status.Locked, Status.Locked, Status.Locked], - "look_and_learn": Status.Locked, - "last_duration": PackedInt32Array([0, 0, 0]), - "total_duration": PackedInt32Array([0, 0, 0]) - } + result[index] = _build_default_lesson_unlock(index) # Check internal structure for index: int in result.keys(): var garden: Dictionary = result[index] + var minigame_count: int = get_minigame_count_for_lesson(index) # Check missing keys if not garden.has("games"): if not is_init: Log.warn("StudentProgression: Garden %d: Add missing key 'games'." % index) - garden["games"] = [Status.Locked, Status.Locked, Status.Locked] + garden["games"] = _make_locked_games_array(minigame_count) if not garden.has("look_and_learn"): if not is_init: Log.warn("StudentProgression: Garden %d: Add missing key 'look_and_learn'." % index) - garden["look_and_learn"] = Status.Locked + garden["look_and_learn"] = Status.LOCKED if not garden.has("last_duration"): - garden["last_duration"] = PackedInt32Array([0, 0, 0]) + garden["last_duration"] = _make_zero_durations(minigame_count) if not garden.has("total_duration"): - garden["total_duration"] = PackedInt32Array([0, 0, 0]) + garden["total_duration"] = _make_zero_durations(minigame_count) - # Check array "games" - if typeof(garden["games"]) != TYPE_ARRAY or (garden["games"] as Array).size() != 3: + # Check array "games": a corrupt (non-array) value is reset, but a size + # mismatch (the lesson's minigame count changed) is resized in place so we + # keep existing progress for the slots that remain instead of wiping it. + if typeof(garden["games"]) != TYPE_ARRAY: if not is_init: Log.warn("StudentProgression: Garden %d: invalid format for 'games' → reset." % index) - garden["games"] = [Status.Locked, Status.Locked, Status.Locked] + garden["games"] = _make_locked_games_array(minigame_count) + elif (garden["games"] as Array).size() != minigame_count: + if not is_init: + Log.warn("StudentProgression: Garden %d: 'games' resized from %d to %d, progress preserved." % [index, (garden["games"] as Array).size(), minigame_count]) + garden["games"] = _resize_games_array(garden["games"] as Array, minigame_count) + + # Keep duration metrics aligned with the minigame count, preserving the + # recorded times for the slots that remain. + if (garden["last_duration"] as PackedInt32Array).size() != minigame_count: + garden["last_duration"] = _resize_durations(garden["last_duration"] as PackedInt32Array, minigame_count) + if (garden["total_duration"] as PackedInt32Array).size() != minigame_count: + garden["total_duration"] = _resize_durations(garden["total_duration"] as PackedInt32Array, minigame_count) # Check value outside of possible enum values - for game_index: int in range(3): - if garden["games"][game_index] not in [Status.Locked, Status.Unlocked, Status.Completed]: - garden["games"][game_index] = Status.Locked - if garden["look_and_learn"] not in [Status.Locked, Status.Unlocked, Status.Completed]: - garden["look_and_learn"] = Status.Locked + for game_index: int in range((garden["games"] as Array).size()): + if garden["games"][game_index] not in [Status.LOCKED, Status.UNLOCKED, Status.COMPLETED]: + garden["games"][game_index] = Status.LOCKED + if garden["look_and_learn"] not in [Status.LOCKED, Status.UNLOCKED, Status.COMPLETED]: + garden["look_and_learn"] = Status.LOCKED # Check progression rules for index: int in range(min_key, max_key + 1): @@ -119,37 +165,64 @@ func ensure_data_integrity(data: Dictionary[int, Dictionary]) -> Dictionary: if result.has(index - 1): var prev: Dictionary = result[index - 1] prev_completed = ( - prev["look_and_learn"] == Status.Completed and - (prev["games"] as Array).all(func(x: int) -> bool: return x == Status.Completed) + prev["look_and_learn"] == Status.COMPLETED and + (prev["games"] as Array).all(func(x: int) -> bool: return x == Status.COMPLETED) ) else: # First garden (key 1) is always unlocked prev_completed = true + var minigame_count: int = (garden["games"] as Array).size() + # Case: previous garden not completed if not prev_completed: - for game_index: int in range(3): - if garden["games"][game_index] != Status.Locked or garden["look_and_learn"] != Status.Locked: - if not is_init: - Log.warn("StudentProgression: Garden %d: invalid progression (previous not finished) → reset." % index) - garden["games"] = [Status.Locked, Status.Locked, Status.Locked] - garden["look_and_learn"] = Status.Locked - break + var needs_reset: bool = garden["look_and_learn"] != Status.LOCKED + if not needs_reset: + for game_index: int in range(minigame_count): + if garden["games"][game_index] != Status.LOCKED: + needs_reset = true + break + if needs_reset: + if not is_init: + Log.warn("StudentProgression: Garden %d: invalid progression (previous not finished) → reset." % index) + garden["games"] = _make_locked_games_array(minigame_count) + garden["look_and_learn"] = Status.LOCKED continue - # Case: lesson completed → unlock games if needed - if garden["look_and_learn"] == Status.Completed: - for game_index: int in range(3): - if garden["games"][game_index] == Status.Locked: - garden["games"][game_index] = Status.Unlocked + # Enforce sequential unlock: first non-COMPLETED game → UNLOCKED, everything + # after it → LOCKED (including out-of-order COMPLETED in old saves). + if garden["look_and_learn"] == Status.COMPLETED: + var next_to_play: int = -1 + for game_index: int in range(minigame_count): + if garden["games"][game_index] != Status.COMPLETED: + next_to_play = game_index + break + if next_to_play >= 0: + if garden["games"][next_to_play] == Status.LOCKED: + garden["games"][next_to_play] = Status.UNLOCKED if not is_init: - Log.warn("StudentProgression: Garden %d: game %d unlocked because lesson is completed" % [index, game_index + 1]) - - # Case: previous garden completed → unlock lesson if needed - elif garden["look_and_learn"] == Status.Locked: - garden["look_and_learn"] = Status.Unlocked - if not is_init: - Log.warn("StudentProgression: Garden %d: lesson unlocked because previous garden is completed" % index) + Log.warn("StudentProgression: Garden %d: minigame %d unlocked because it is next to play" % [index, next_to_play]) + for game_index: int in range(next_to_play + 1, minigame_count): + if garden["games"][game_index] != Status.LOCKED: + var was_completed: bool = garden["games"][game_index] == Status.COMPLETED + garden["games"][game_index] = Status.LOCKED + if not is_init: + if was_completed: + Log.warn("StudentProgression: Garden %d: minigame %d demoted from COMPLETED to LOCKED (out of play order — minigame %d not yet completed)" % [index, game_index, next_to_play]) + else: + Log.warn("StudentProgression: Garden %d: minigame %d re-locked (waits for minigame %d to be completed)" % [index, game_index, game_index - 1]) + else: + # L&L not completed → no game may be UNLOCKED (COMPLETED preserved). + for game_index: int in range(minigame_count): + if garden["games"][game_index] == Status.UNLOCKED: + garden["games"][game_index] = Status.LOCKED + if not is_init: + Log.warn("StudentProgression: Garden %d: minigame %d re-locked (look-and-learn not completed)" % [index, game_index]) + # Case: previous garden completed → unlock lesson if needed + if garden["look_and_learn"] == Status.LOCKED: + garden["look_and_learn"] = Status.UNLOCKED + if not is_init: + Log.warn("StudentProgression: Garden %d: lesson unlocked because previous garden is completed" % index) _sanitize_boss_progression() return result @@ -229,7 +302,7 @@ func get_max_unlocked_lesson_index() -> int: for index: int in range(unlocks.size()): if is_lesson_blocked_by_boss(index + 1): break - if unlocks[index + 1]["look_and_learn"] >= Status.Unlocked: + if unlocks[index + 1]["look_and_learn"] >= Status.UNLOCKED: max_unlocked_level = index else: break @@ -238,19 +311,25 @@ func get_max_unlocked_lesson_index() -> int: func is_lesson_completed(lesson_number: int) -> bool: - return unlocks[lesson_number]["look_and_learn"] == Status.Completed and unlocks[lesson_number]["games"][0] == Status.Completed and unlocks[lesson_number]["games"][1] == Status.Completed and unlocks[lesson_number]["games"][2] == Status.Completed + if unlocks[lesson_number]["look_and_learn"] != Status.COMPLETED: + return false + for game_status: int in unlocks[lesson_number]["games"]: + if game_status != Status.COMPLETED: + return false + return true # Return true if the progression is saved or false if the look and learn was already completed func look_and_learn_completed(lesson_number: int) -> bool: - if unlocks[lesson_number]["look_and_learn"] == Status.Completed: + if unlocks[lesson_number]["look_and_learn"] == Status.COMPLETED: return false - - unlocks[lesson_number]["look_and_learn"] = Status.Completed - - for index: int in range(3): - unlocks[lesson_number]["games"][index] = Status.Unlocked - + + unlocks[lesson_number]["look_and_learn"] = Status.COMPLETED + + var games: Array = unlocks[lesson_number]["games"] + if games.size() > 0 and games[0] == Status.LOCKED: + games[0] = Status.UNLOCKED + last_modified = Time.get_datetime_string_from_system(true) progression_changed.emit() return true @@ -258,20 +337,27 @@ func look_and_learn_completed(lesson_number: int) -> bool: # Return true if the progression is saved or false if the game was already completed func game_completed(lesson_number: int, game_number: int) -> bool: - # If the game is already completed, do nothing - if unlocks[lesson_number]["games"][game_number] == Status.Completed: + var games: Array = unlocks[lesson_number]["games"] + + if games[game_number] == Status.COMPLETED: return false - - unlocks[lesson_number]["games"][game_number] = Status.Completed - + + games[game_number] = Status.COMPLETED + + var next_game_index: int = game_number + 1 + if next_game_index < games.size() and games[next_game_index] == Status.LOCKED: + games[next_game_index] = Status.UNLOCKED + var all_completed: bool = true - for index: int in range(3): - all_completed = all_completed and unlocks[lesson_number]["games"][index] == Status.Completed - + for game_status: int in games: + if game_status != Status.COMPLETED: + all_completed = false + break + if all_completed: if unlocks.has(lesson_number + 1): - unlocks[lesson_number + 1]["look_and_learn"] = Status.Unlocked - + unlocks[lesson_number + 1]["look_and_learn"] = Status.UNLOCKED + last_modified = Time.get_datetime_string_from_system(true) progression_changed.emit() return true @@ -320,13 +406,14 @@ func clear_boss_block() -> void: func add_level_time(lesson_number: int, game_number: int, time_spent: int) -> void: Log.trace("StudentProgression: Add time to level %d, minigame %d. Time added: %s" % [lesson_number, game_number, time_spent]) - if game_number > 2: - Log.error("StudentProgression: Cannot log a level time for a minigame number superior to 2") - return - if not unlocks.has(lesson_number): Log.error("StudentProgression: Cannot log a level time for lesson %d because it does not exists in progression data" % lesson_number) return + + var minigame_count: int = (unlocks[lesson_number]["games"] as Array).size() + if game_number < 0 or game_number >= minigame_count: + Log.error("StudentProgression: Cannot log a level time for minigame %d in lesson %d (lesson has %d minigame(s))" % [game_number, lesson_number, minigame_count]) + return if not (unlocks[lesson_number] as Dictionary).has("last_duration") or not (unlocks[lesson_number]["last_duration"] as PackedInt32Array).size() > game_number: Log.error("StudentProgression: Cannot log a last_duration for lesson %d, game %d, because it does not exists" % [lesson_number, game_number]) diff --git a/resources/user/teacher_settings.gd b/resources/user/teacher_settings.gd index b0c1c92e..1588b132 100644 --- a/resources/user/teacher_settings.gd +++ b/resources/user/teacher_settings.gd @@ -2,12 +2,12 @@ class_name TeacherSettings extends Resource enum AccountType { - Teacher, - Parent + TEACHER, + PARENT } enum EducationMethod { - AppOnly, - Complete + APP_ONLY, + COMPLETE } const AVAILABLE_CODES: Array[int] = [123, 124, 125, 126, 132, 134, 135, 136, 142, 143, 145, 146, 152, 153, 154, 213, 214, 215, 216, 231, 234, 235, 236, 241, 243, 245, 246, 251, 253, 254, 321, 324, 325, 326, 312, 314, 315, 316, 342, 341, 345, 346, 352, 351, 354, 423, 421, 425, 426, 432, 431, 435, 436, 412, 413, 415, 416, 452, 453, 451, 523, 524, 521, 526, 532, 534, 531, 536, 542, 543, 541, 546, 512, 513, 514, 623, 624, 625, 621, 632, 634, 635, 631, 642, 643, 645, 641, 652, 653, 654] diff --git a/resources/user/user_difficulty.gd b/resources/user/user_difficulty.gd index 78e1553a..d4648d3f 100644 --- a/resources/user/user_difficulty.gd +++ b/resources/user/user_difficulty.gd @@ -16,6 +16,7 @@ func get_difficulty(minigame_name: String) -> int: # Adds a game to the minigame history of the user and update difficulty if needed func add_game(minigame_name: String, minigame_won: bool) -> void: + Log.trace("UserDifficulty: %s difficulty updated: win ? %s" % [minigame_name, minigame_won]) var history: UserMinigameHistory = minigames_histories.get(minigame_name, UserMinigameHistory.new()) history.add_game(minigame_won) minigames_histories[minigame_name] = history diff --git a/sources/gardens/boss_button.gd b/sources/gardens/boss_button.gd index 79111909..18b163dc 100644 --- a/sources/gardens/boss_button.gd +++ b/sources/gardens/boss_button.gd @@ -3,6 +3,8 @@ extends LessonButton @export var icon_texture: Texture2D: set = _set_icon_texture +@export var completed_icon_texture: Texture2D: + set = _set_completed_icon_texture @onready var icon: TextureRect = %Icon @@ -11,10 +13,28 @@ func _ready() -> void: super() if label: label.hide() - _set_icon_texture(icon_texture) + _refresh_icon() func _set_icon_texture(value: Texture2D) -> void: icon_texture = value - if icon: - icon.texture = value + _refresh_icon() + + +func _set_completed_icon_texture(value: Texture2D) -> void: + completed_icon_texture = value + _refresh_icon() + + +func _set_completed(value: bool) -> void: + super(value) + _refresh_icon() + + +func _refresh_icon() -> void: + if not icon: + return + if completed and completed_icon_texture: + icon.texture = completed_icon_texture + else: + icon.texture = icon_texture diff --git a/sources/gardens/boss_button.tscn b/sources/gardens/boss_button.tscn index b0f6b52f..e4aebf58 100644 --- a/sources/gardens/boss_button.tscn +++ b/sources/gardens/boss_button.tscn @@ -1,31 +1,29 @@ [gd_scene format=3 uid="uid://dkxci0n2tcyxc"] -[ext_resource type="Texture2D" uid="uid://3iuuq06ovbos" path="res://assets/theme/button_normal_empty.svg" id="1_pdrhc"] -[ext_resource type="Texture2D" uid="uid://j7sffldhbunj" path="res://assets/theme/button_pressed_empty.svg" id="2_2g676"] -[ext_resource type="Texture2D" uid="uid://be30a3cmy0w46" path="res://assets/theme/button_focused_empty.svg" id="3_fksie"] -[ext_resource type="Texture2D" uid="uid://c0rumwiaimvxy" path="res://assets/theme/button_disabled.svg" id="4_4vg60"] [ext_resource type="Script" uid="uid://bbjhs5nta7xxj" path="res://sources/gardens/boss_button.gd" id="5_3d6pj"] -[ext_resource type="Texture2D" uid="uid://dwk8xgv3xsmm0" path="res://assets/theme/button_center.svg" id="6_o0qkw"] [ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="7_rtwam"] [ext_resource type="Texture2D" uid="uid://cfnjk06m367r3" path="res://assets/minigames/boss/boss_icon.png" id="8_oy4mt"] +[ext_resource type="Texture2D" uid="uid://bc3e0qths2cvt" path="res://assets/minigames/boss/boss_icon_full.png" id="9_full"] +[ext_resource type="Texture2D" uid="uid://cxjy5f7oyl8mq" path="res://assets/gardens/buttons/lesson_circle.png" id="lesson_circle"] [node name="BossButton" type="TextureButton" unique_id=1297494779] +self_modulate = Color(1, 1, 1, 0) z_index = 2 offset_right = 512.0 offset_bottom = 512.0 pivot_offset = Vector2(180, 180) size_flags_horizontal = 4 size_flags_vertical = 4 -texture_normal = ExtResource("1_pdrhc") -texture_pressed = ExtResource("2_2g676") -texture_hover = ExtResource("3_fksie") -texture_disabled = ExtResource("4_4vg60") -texture_focused = ExtResource("1_pdrhc") +mouse_filter = 1 +texture_normal = ExtResource("lesson_circle") +texture_pressed = ExtResource("lesson_circle") +texture_hover = ExtResource("lesson_circle") +texture_disabled = ExtResource("lesson_circle") +texture_focused = ExtResource("lesson_circle") stretch_mode = 0 script = ExtResource("5_3d6pj") icon_texture = ExtResource("8_oy4mt") -base_color = Color(0.537255, 0.231373, 0.8, 1) -completed_color = Color(0.537255, 0.231373, 0.8, 1) +completed_icon_texture = ExtResource("9_full") [node name="RightFX" parent="." unique_id=1100015067 instance=ExtResource("7_rtwam")] unique_name_in_owner = true @@ -38,6 +36,24 @@ anchor_right = 0.5 anchor_bottom = 0.5 grow_horizontal = 2 grow_vertical = 2 +mouse_filter = 1 + +[node name="Border" type="TextureRect" parent="." unique_id=758604924] +unique_name_in_owner = true +visible = false +show_behind_parent = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -15.0 +offset_top = -15.0 +offset_right = 15.0 +offset_bottom = 15.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("lesson_circle") +expand_mode = 1 [node name="Center" type="TextureRect" parent="." unique_id=758604923] unique_name_in_owner = true @@ -48,7 +64,8 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("6_o0qkw") +texture = ExtResource("lesson_circle") +expand_mode = 1 [node name="Label" type="Label" parent="." unique_id=962237768] unique_name_in_owner = true @@ -62,8 +79,6 @@ offset_top = 8.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 1 -theme_override_colors/font_outline_color = Color(0, 0, 0, 1) -theme_override_constants/outline_size = 10 theme_override_font_sizes/font_size = 110 horizontal_alignment = 1 vertical_alignment = 1 @@ -80,7 +95,8 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("6_o0qkw") +texture = ExtResource("lesson_circle") +expand_mode = 1 [node name="Icon" type="TextureRect" parent="." unique_id=502041740] unique_name_in_owner = true @@ -89,12 +105,11 @@ layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = 144.0 -offset_top = 80.0 -offset_right = -23.0 -offset_bottom = 84.0 +offset_left = 56.0 +offset_top = 56.0 +offset_right = -56.0 +offset_bottom = -56.0 grow_horizontal = 2 grow_vertical = 2 -scale = Vector2(0.7, 0.7) texture = ExtResource("8_oy4mt") -stretch_mode = 6 +stretch_mode = 5 diff --git a/sources/gardens/gardens.gd b/sources/gardens/gardens.gd index 3d2c8aa7..9f3f57dd 100644 --- a/sources/gardens/gardens.gd +++ b/sources/gardens/gardens.gd @@ -4,25 +4,58 @@ extends Control signal minigame_layout_opened() const KALULU: GDScript = preload("res://sources/minigames/base/kalulu_ingame.gd") -const GARDEN_SCENE: PackedScene = preload("res://resources/gardens/garden.tscn") -const LOOK_AND_LEARN_SCENE: PackedScene = preload("res://sources/look_and_learn/look_and_learn.tscn") +const MINIGAME_WEDGE_SCENE: PackedScene = preload("res://sources/gardens/minigame_wedge.tscn") +# Wheel geometry, in MinigameSelection-local coords (canvas 2560×1800). +const WHEEL_CENTER: Vector2 = Vector2(1280, 900) +# Matches the inner edge of big_button.png; past this the gray ring hides everything. +const WHEEL_RADIUS: float = 815.0 +const WHEEL_ARC_SEGMENTS: int = 48 +const WHEEL_ICON_DISTANCE_RATIO: float = 0.55 +const WHEEL_DIVIDER_WIDTH: float = 12.0 +const WHEEL_HIGHLIGHT_WIDTH: float = 24.0 +# Outline around the central Look-and-Learn button. Drawn at the button's visible +# edge. Colored dark by default, gold when L&L is the next-to-play step. +const LESSON_BUTTON_OUTLINE_RADIUS: float = 192.0 +# Top inset of the wheel's central label so the grapheme text sits just below the +# button center, mirroring the movie icon just above it. The 384x384 button has +# its center at y=192; the label (vertical-centered) then centers at y=(this+384)/2. +const LESSON_BUTTON_LABEL_TOP_OFFSET: float = 104.0 +# Loaded on demand instead of preloaded: this script never unloads (it has +# static variables), so preloaded constants would pin every garden's assets in +# memory for the whole app lifetime — including while minigames run, which +# OOM-crashes low-memory devices. +const GARDEN_SCENE_PATHS: Array[String] = [ + "res://resources/gardens/garden_01.tscn", + "res://resources/gardens/garden_02.tscn", + "res://resources/gardens/garden_03.tscn", + "res://resources/gardens/garden_04.tscn", + "res://resources/gardens/garden_05.tscn", + "res://resources/gardens/garden_06.tscn", + "res://resources/gardens/garden_07.tscn", + "res://resources/gardens/garden_08.tscn", + "res://resources/gardens/garden_09.tscn", + "res://resources/gardens/garden_10.tscn", + "res://resources/gardens/garden_11.tscn", + "res://resources/gardens/garden_12.tscn", +] +const LOOK_AND_LEARN_SCENE_PATH: String = "res://sources/look_and_learn/look_and_learn.tscn" const BOSS_BUTTON_SCENE: PackedScene = preload("res://sources/gardens/boss_button.tscn") const BOSS_MINIGAME_SCENE_PATH: String = "res://sources/minigames/boss/boss_minigame.tscn" -const FLOWER_VFX: PackedScene = preload("res://sources/gardens/flower_particle.tscn") const GARDEN_SIZE: int = 2400 -const GARDEN_TEXTURES_NB: int = 20 -const FLOWER_TYPES_NB: int = 5 -const FLOWER_OFFSET_FROM_LESSON: float = 200.0 -const LESSON_VERTICAL_BASE: float = 920.0 -const LESSON_VERTICAL_RANGE: float = 300.0 +const GARDENS_COUNT: int = 12 +const MIN_LESSONS: int = 12 +const MAX_LESSONS: int = 60 +const GARDEN_CENTER_Y: float = 900.0 +const GARDEN_CIRCLE_RADIUS: float = 850.0 const FINAL_BOSS_PADDING: float = 120.0 -const TRANSPARENCY_THRESHOLD: float = 0.05 -const POSITION_SEARCH_STEP: int = 40 -const MAX_POSITION_SEARCH_RADIUS: int = 300 const BACK_BUTTON_HOLD_DURATION_SECONDS: float = 1.0 +const LAYOUT_VERSION: int = 14 +# Centers of the 5 fixed button slots (must match garden_XX.tscn positions) +const SLOT_CENTERS: Array[Vector2i] = [ + Vector2i(704, 1186), Vector2i(987, 1000), Vector2i(1290, 920), + Vector2i(1565, 748), Vector2i(1864, 598) +] -static var lesson_button_half_size: Vector2 = Vector2.ZERO -static var garden_alpha_cache: Dictionary = {} static var transition_data: Dictionary = {} static var cached_gardens_layout: GardensLayout static var cached_layout_session_id: int = -1 @@ -35,14 +68,13 @@ static var cached_layout_lessons: int = 0 get: return _gardens_layout @export var starting_garden: int = -1 -@export_category("Colors") -@export var unlocked_color: Color = Color("1c2662") -@export var locked_color: Color = Color("1d2229") -@export_group("Minigames") +@export_category("Minigames") @export var minigame_scene_paths: PackedStringArray = PackedStringArray() -@export var minigames_icons: Array[Texture] = [] +## Animal body (colored by the garden) and face (kept as-is for eyes/mouth details). +## Both arrays must be the same length and aligned with `minigame_scene_paths`. +@export var minigames_body_icons: Array[Texture] = [] +@export var minigames_face_icons: Array[Texture] = [] -var _minigame_scene_cache: Dictionary = {} var lessons: Dictionary = {} var _gardens_layout: GardensLayout var points: Array[Array] = [] @@ -55,33 +87,32 @@ var current_lesson_number: int = -1 var current_garden: Garden var current_button_global_position: Vector2 = Vector2.ZERO var current_button: LessonButton -var lesson_to_flower_index: Dictionary = {} var scroll_end_base_width: float = 0.0 var back_button_hold_progress_seconds: float = 0.0 var is_back_button_hold_active: bool = false @onready var garden_parent: HBoxContainer = %GardenParent -@onready var locked_line: Line2D = $ScrollContainer/LockedLine -@onready var unlocked_line: Line2D = $ScrollContainer/UnlockedLine +@onready var locked_line: Line2D = $LockedLine +@onready var unlocked_line: Line2D = $UnlockedLine @onready var line_particles: GPUParticles2D = %LineParticles @onready var line_audio_stream_player: AudioStreamPlayer2D = %LineAudioStreamPlayer @onready var scroll_container: ScrollContainer = $ScrollContainer @onready var parallax_background: ParallaxBackground = %ParallaxBackground +@onready var clouds: CloudManager = %Clouds @onready var scroll_end_spacer: Control = $"ScrollContainer/HBoxContainer/Control2" @onready var boss_buttons_container: Control = %BossButtons @onready var minigame_selection: Control = %MinigameSelection @onready var lesson_button: LessonButton = %LessonButton +@onready var lesson_button_outline: Line2D = %LessonButtonOutline +@onready var lesson_button_movie_icon: TextureRect = %MovieIcon @onready var lesson_button_particles: GPUParticles2D = %LessonButtonParticles @onready var back_button: BackButton = %BackButton @onready var right_audio_stream_player: AudioStreamPlayer = $RightAudioStreamPlayer @onready var left_audio_stream_player: AudioStreamPlayer = $LeftAudioStreamPlayer @onready var feedback_audio_stream_player: AudioStreamPlayer = $FeedBackAudioStreamPlayer @onready var feedback_audio_stream_player2: AudioStreamPlayer = $FeedBackAudioStreamPlayer2 -@onready var minigame_layout_1: MinigameLayout = %MinigameBackground1 -@onready var minigame_layout_2: MinigameLayout = %MinigameBackground2 -@onready var minigame_layout_3: MinigameLayout = %MinigameBackground3 -@onready var minigame_background: TextureRect = %MinigameBackground -@onready var minigame_background_center: TextureRect = %MinigameBackgroundCenter +@onready var wedges_container: Control = %WedgesContainer +@onready var background_rect: ColorRect = %BackgroundRect @onready var lock: Control = %Lock @onready var kalulu: KALULU = %Kalulu @onready var kalulu_button: CanvasItem = %KaluluButton @@ -155,52 +186,77 @@ func _build_transition_context() -> Dictionary: func _apply_progression_to_gardens(transition_context: Dictionary) -> void: var lesson_index: int = 1 for garden_control: Garden in garden_parent.get_children(): - garden_control.current_progression = 0.0 - garden_control.max_progression = 0.0 + var total_minigames: int = 0 + var completed_minigames_total: int = 0 var lesson_buttons: Array[LessonButton] = garden_control.get_lesson_buttons() for button_index: int in range(lesson_buttons.size()): var button: LessonButton = lesson_buttons[button_index] if not lesson_index in lessons: - button.set_disabled(true) - if button_index < garden_control.flowers_visible.size(): - garden_control.flowers_visible[button_index] = false + button.set_button_disabled(true) continue - lesson_to_flower_index[lesson_index] = {"garden": garden_control, "index": button_index} var lesson_unlocks: Dictionary = UserDataManager.student_progression.unlocks[lesson_index] var is_blocked_by_boss: bool = UserDataManager.student_progression.is_lesson_blocked_by_boss(lesson_index) - var is_lesson_unlocked: bool = lesson_unlocks["look_and_learn"] != StudentProgression.Status.Locked and not is_blocked_by_boss - var is_look_and_learn_completed: bool = lesson_unlocks["look_and_learn"] == StudentProgression.Status.Completed and not is_blocked_by_boss - button.set_disabled(not is_lesson_unlocked) - if button_index < garden_control.flowers_visible.size(): - garden_control.flowers_visible[button_index] = is_look_and_learn_completed + var is_lesson_unlocked: bool = lesson_unlocks["look_and_learn"] != StudentProgression.Status.LOCKED and not is_blocked_by_boss + button.set_button_disabled(not is_lesson_unlocked) if transition_context.new_lesson_unlocked and lesson_index == transition_context.newly_unlocked_lesson_number: - button.set_disabled(true) + button.set_button_disabled(true) if not(transition_context.new_lesson_unlocked and lesson_index == transition_context.newly_unlocked_lesson_number - 1): button.completed = UserDataManager.student_progression.is_lesson_completed(lesson_index) and not is_blocked_by_boss var completed_minigames: int = 0 if is_blocked_by_boss else _count_completed_minigames(lesson_index) - if transition_context.is_current_lesson and transition_context.is_first_clear and transition_context.is_minigame_completed and transition_context.last_played_minigame_number >= 0 and transition_context.last_played_minigame_number < (lesson_unlocks["games"] as Array).size(): - if lesson_unlocks["games"][transition_context.last_played_minigame_number] == StudentProgression.Status.Completed: - completed_minigames = max(0, completed_minigames - 1) - - if button_index < garden_control.flowers_sizes.size(): - garden_control.flowers_sizes[button_index] = _get_flower_size_for_completion(completed_minigames) if not is_blocked_by_boss: - garden_control.current_progression += float(completed_minigames) - garden_control.max_progression += float((lesson_unlocks["games"] as Array).size()) + completed_minigames_total += completed_minigames + total_minigames += (lesson_unlocks["games"] as Array).size() + garden_control.current_progression = float(completed_minigames_total) + garden_control.max_progression = float(total_minigames) lesson_index += 1 - garden_control.update_flowers() + garden_control.update_victory_assets_visibility(completed_minigames_total, total_minigames) _set_up_boss_buttons() #endregion #region Scene setup and ready sequence +func _compute_cloud_world_bounds() -> Vector2: + if not garden_parent: + return Vector2.ZERO + var garden_count: int = garden_parent.get_child_count() + if garden_count <= 0: + return Vector2.ZERO + var trailing_spacer_width: float = 0.0 + if scroll_end_spacer: + trailing_spacer_width = scroll_end_spacer.custom_minimum_size.x + var content_world_width: float = float(garden_count * GARDEN_SIZE) + trailing_spacer_width + var viewport_w: float = scroll_container.size.x + if viewport_w <= 0.0: + viewport_w = float(get_viewport_rect().size.x) + var max_scroll: float = maxf(0.0, content_world_width - viewport_w) + return Vector2(content_world_width, max_scroll) + + +func _configure_clouds_for_gardens() -> void: + if not clouds: + return + var bounds: Vector2 = _compute_cloud_world_bounds() + if bounds == Vector2.ZERO: + return + clouds.configure_world(bounds.x, bounds.y) + + +func _refresh_cloud_world_bounds() -> void: + if not clouds: + return + var bounds: Vector2 = _compute_cloud_world_bounds() + if bounds == Vector2.ZERO: + return + clouds.set_world_bounds(bounds.x, bounds.y) + + func _scroll_to_starting_garden(_transition_context: Dictionary) -> void: if transition_data: if transition_data.has("current_garden_index"): @@ -252,7 +308,6 @@ func _center_scroll_on_x(target_x: float) -> void: #region Transitions and animations func _handle_transition_sequences(transition_context: Dictionary) -> void: - await _apply_transition_flowers(transition_context) await get_tree().create_timer(1).timeout if transition_data.has("current_lesson_number") and not transition_data.get("skip_minigame_layout", false): await _open_minigames_layout(_get_current_lesson_button(transition_data.current_lesson_number as int), transition_data.current_lesson_number as int) @@ -262,61 +317,6 @@ func _handle_transition_sequences(transition_context: Dictionary) -> void: await _play_boss_unlock_sequence(transition_context.pending_boss_gate_lesson as int) -func _apply_transition_flowers(transition_context: Dictionary) -> void: - _reveal_completed_look_and_learn_flower() - - # Play the flowers animation if needed - if transition_context.is_current_lesson and transition_context.is_first_clear and transition_context.is_minigame_completed and transition_data.has("current_lesson_number"): - await get_tree().create_timer(1).timeout - var lesson_number: int = transition_data.current_lesson_number as int - var flower_info: Dictionary = _get_flower_info(lesson_number) - if flower_info.is_empty(): - return - var target_garden: Garden = flower_info.garden - var target_index: int = flower_info.index - var new_completed_count: int = _count_completed_minigames(lesson_number) - var target_size: Garden.FlowerSizes = _get_flower_size_for_completion(new_completed_count) - var current_size: Garden.FlowerSizes = target_garden.flowers_sizes[target_index] - target_garden.flowers_visible[target_index] = true - if target_size != current_size: - var flower_vfx: FlowerVFX = FLOWER_VFX.instantiate() - target_garden.flower_controls[target_index].add_child(flower_vfx) - flower_vfx.anchor_bottom = 0.5 - flower_vfx.anchor_top = 0.5 - flower_vfx.anchor_left = 0.5 - flower_vfx.anchor_right = 0.5 - flower_vfx.play() - await get_tree().create_timer(0.5).timeout - target_garden.flowers_sizes[target_index] = target_size - target_garden.update_flowers() - - -func _reveal_completed_look_and_learn_flower() -> void: - if not transition_data.get("look_and_learn_completed", false): - return - var lesson_number_variant: Variant = transition_data.get("current_lesson_number", null) - if lesson_number_variant == null: - return - var lesson_number: int = lesson_number_variant as int - var flower_info: Dictionary = _get_flower_info(lesson_number) - if flower_info.is_empty(): - return - var target_garden: Garden = flower_info.garden - var target_index: int = flower_info.index - if target_index < target_garden.flowers_visible.size(): - target_garden.flowers_visible[target_index] = true - if target_index < target_garden.flowers_sizes.size(): - target_garden.flowers_sizes[target_index] = _get_flower_size_for_completion(_count_completed_minigames(lesson_number)) - target_garden.update_flowers() - - -func _get_flower_info(lesson_number: int) -> Dictionary: - var flower_info: Dictionary = lesson_to_flower_index.get(lesson_number, {}) - if flower_info and flower_info.has("garden") and flower_info.has("index"): - return flower_info - return {} - - func _play_new_lesson_unlock_sequence() -> void: var max_lesson: int = UserDataManager.student_progression.get_max_unlocked_lesson_index() await get_tree().create_timer(2).timeout @@ -373,7 +373,7 @@ func _play_new_lesson_unlock_sequence() -> void: # Enable the next lesson button if new_lesson_button: - new_lesson_button.set_disabled(false) + new_lesson_button.set_button_disabled(false) #endregion @@ -382,11 +382,16 @@ func _play_new_lesson_unlock_sequence() -> void: func _ready() -> void: UserDataManager.start_synchronization_timer() _load_lessons_from_database() + var lesson_count: int = lessons.size() + if lesson_count < MIN_LESSONS or lesson_count > MAX_LESSONS: + Log.alert("Gardens: Lesson count must be between %d and %d, got %d" % [MIN_LESSONS, MAX_LESSONS, lesson_count]) + return if scroll_end_spacer: scroll_end_base_width = scroll_end_spacer.custom_minimum_size.x - gardens_layout = get_session_layout(lessons.size()) + gardens_layout = get_session_layout(lesson_count) _set_up_lessons() - + _configure_clouds_for_gardens() + # If there is no data, skips the rest if not UserDataManager.student_progression: Log.error("Gardens: Ready: No data for student progression") @@ -396,14 +401,13 @@ func _ready() -> void: _lock() - lesson_to_flower_index.clear() var transition_context: Dictionary = _build_transition_context() _set_unlocked_path(transition_context.most_advanced_unlocked_lesson_index as int, (transition_context.pending_boss_gate_lesson <= 0) as bool) _apply_progression_to_gardens(transition_context) _scroll_to_starting_garden(transition_context) await (OpeningCurtain as OpeningCurtainClass).open() - (MusicManager as MusicManagerClass).play((MusicManager as MusicManagerClass).Track.Garden) + (MusicManager as MusicManagerClass).play((MusicManager as MusicManagerClass).Track.GARDEN) # Handles all the animation played when entering the gardens if transition_data: @@ -442,45 +446,8 @@ func _play_brain_tutorial() -> void: #region Garden layout helpers -static func _get_garden_background_image(garden_color_index: int) -> Image: - if garden_alpha_cache.has(garden_color_index): - return garden_alpha_cache[garden_color_index] - - var path: String = Garden.BACKGROUND_PATH_MODEL % [garden_color_index + 1] - var garden_texture: Texture2D = load(path) - if not garden_texture: - Log.warn("Gardens: Unable to load garden texture %s, skipping transparency validation" % path) - return null - var garden_image: Image = garden_texture.get_image() - if not garden_image: - Log.warn("Gardens: Unable to retrieve image data for garden texture %s, skipping transparency validation" % path) - return null - garden_alpha_cache[garden_color_index] = garden_image - return garden_image - - -static func _get_garden_dimensions(garden_color_index: int, garden_image: Image = null) -> Vector2: - if not garden_image: - garden_image = _get_garden_background_image(garden_color_index) - if not garden_image: - return Vector2(GARDEN_SIZE, LESSON_VERTICAL_BASE + LESSON_VERTICAL_RANGE) - var width_scale: float = float(GARDEN_SIZE) / float(maxf(1, garden_image.get_width())) - return Vector2(GARDEN_SIZE, float(garden_image.get_height()) * width_scale) - - static func _get_lesson_button_half_size() -> Vector2: - if lesson_button_half_size != Vector2.ZERO: - return lesson_button_half_size - var button: LessonButton = Garden.LESSON_BUTTON_SCENE.instantiate() - var measured_size: Vector2 = button.get_combined_minimum_size() - if measured_size == Vector2.ZERO: - measured_size = button.get_rect().size - if measured_size == Vector2.ZERO and button.texture_normal: - measured_size = button.texture_normal.get_size() - if measured_size == Vector2.ZERO: - measured_size = Vector2(300, 300) - lesson_button_half_size = measured_size * 0.5 - return lesson_button_half_size + return Vector2(120, 120) static func _get_layout_cache_base_dir() -> String: @@ -492,7 +459,7 @@ static func _get_layout_cache_base_dir() -> String: static func _get_layout_cache_path(session_id: int, total_lessons: int) -> String: - return _get_layout_cache_base_dir().path_join("layout_%s_%s.tres" % [str(session_id), str(total_lessons)]) + return _get_layout_cache_base_dir().path_join("layout_v%s_%s_%s.tres" % [str(LAYOUT_VERSION), str(session_id), str(total_lessons)]) static func _load_layout_from_cache(session_id: int, total_lessons: int) -> GardensLayout: @@ -520,67 +487,14 @@ static func _save_layout_to_cache(layout: GardensLayout, session_id: int, total_ Log.warn("Gardens: Failed to save layout cache at %s: %s" % [cache_path, error_string(error)]) -static func _is_position_on_garden_texture(garden_color_index: int, tested_position: Vector2, garden_dimensions: Vector2, probe_half_size: Vector2 = Vector2.ZERO, garden_image: Image = null) -> bool: - if not garden_image: - garden_image = _get_garden_background_image(garden_color_index) - if not garden_image: - return true - var safe_dim: Vector2 = Utils.safe_dimensions(garden_dimensions) - var base_position: Vector2 = tested_position if probe_half_size == Vector2.ZERO else tested_position + probe_half_size - var offsets: Array[Vector2] = Utils.build_probe_offsets(probe_half_size) - for offset: Vector2 in offsets: - var sample: Vector2 = base_position + offset - if sample.x < 0.0 or sample.x > safe_dim.x or sample.y < 0.0 or sample.y > safe_dim.y: - return false - var pixel: Vector2i = Utils.position_to_pixel(sample, safe_dim, garden_image) - if garden_image.get_pixelv(pixel).a < TRANSPARENCY_THRESHOLD: - return false - return true - - -static func _find_valid_position_on_garden(garden_color_index: int, tested_position: Vector2, garden_dimensions: Vector2, probe_half_size: Vector2 = Vector2.ZERO) -> Vector2: - var garden_image: Image = _get_garden_background_image(garden_color_index) - if not garden_image: - return Utils.clamp_position_to_area(tested_position, garden_dimensions, probe_half_size) - var clamped: Vector2 = Utils.clamp_position_to_area(tested_position, garden_dimensions, probe_half_size) - if _is_position_on_garden_texture(garden_color_index, clamped, garden_dimensions, probe_half_size, garden_image): - return clamped - # Try moving toward the center first (helps for very irregular shapes). - var center: Vector2 = garden_dimensions * 0.5 - var toward_center: Vector2 = (center - clamped).normalized() - if toward_center.length() > 0.0: - for radius: int in range(POSITION_SEARCH_STEP, MAX_POSITION_SEARCH_RADIUS + POSITION_SEARCH_STEP, POSITION_SEARCH_STEP): - var candidate: Vector2 = Utils.clamp_position_to_area(clamped + toward_center * float(radius), garden_dimensions, probe_half_size) - if _is_position_on_garden_texture(garden_color_index, candidate, garden_dimensions, probe_half_size, garden_image): - return candidate - # Radial scan around the point. - var angles: Array[float] = [] - for angle_deg: int in range(0, 360, 30): - angles.append(deg_to_rad(angle_deg)) - for radius: int in range(POSITION_SEARCH_STEP, MAX_POSITION_SEARCH_RADIUS + POSITION_SEARCH_STEP, POSITION_SEARCH_STEP): - for angle: float in angles: - var offset: Vector2 = Vector2.RIGHT.rotated(angle) * float(radius) - var candidate2: Vector2 = Utils.clamp_position_to_area(clamped + offset, garden_dimensions, probe_half_size) - if _is_position_on_garden_texture(garden_color_index, candidate2, garden_dimensions, probe_half_size, garden_image): - return candidate2 - # Fallback for very irregular gardens: search the whole texture to find the closest valid spot. - # This is slower than the radial scan, so we only run it as a last resort. - Log.trace("Gardens: Falling back to full texture scan for garden %s from position %s" % [str(garden_color_index), str(clamped)]) - var closest_valid_position: Vector2 = clamped - var closest_distance: float = INF - for height: int in range(0, int(garden_dimensions.y) + POSITION_SEARCH_STEP, POSITION_SEARCH_STEP): - for width: int in range(0, int(garden_dimensions.x) + POSITION_SEARCH_STEP, POSITION_SEARCH_STEP): - var candidate3: Vector2 = Utils.clamp_position_to_area(Vector2(float(width), float(height)), garden_dimensions, probe_half_size) - if not _is_position_on_garden_texture(garden_color_index, candidate3, garden_dimensions, probe_half_size, garden_image): - continue - var distance: float = candidate3.distance_squared_to(clamped) - if distance < closest_distance: - closest_distance = distance - closest_valid_position = candidate3 - if closest_distance < INF: - Log.trace("Gardens: Full texture scan selected %s for garden %s" % [str(closest_valid_position), str(garden_color_index)]) - return closest_valid_position - return clamped +static func _find_valid_position_on_garden(_garden_color_index: int, tested_position: Vector2, _garden_dimensions: Vector2, _probe_half_size: Vector2 = Vector2.ZERO) -> Vector2: + var center: Vector2 = Vector2(float(GARDEN_SIZE) / 2.0, GARDEN_CENTER_Y) + var distance: float = tested_position.distance_to(center) + if distance <= GARDEN_CIRCLE_RADIUS: + return tested_position + # Clamp to circle boundary + var direction: Vector2 = (tested_position - center).normalized() + return center + direction * GARDEN_CIRCLE_RADIUS static func _find_overlapping_position_index(tested_position: Vector2, placed_positions: Array[Vector2], min_distance: float, ignore_index: int = -1) -> int: @@ -697,16 +611,13 @@ static func generate_gardens_layout(total_lessons: int) -> GardensLayout: return layout Log.info("Gardens: Generating dynamic gardens layout") Log.trace("Gardens: Total lessons to layout: %s" % str(total_lessons)) - var rng: RandomNumberGenerator = RandomNumberGenerator.new() - rng.seed = 13985 - Log.trace("Gardens: RNG seeded with %s" % str(rng.seed)) var lessons_left: int = total_lessons var garden_index: int = 0 - while lessons_left > 0 and garden_index < GARDEN_TEXTURES_NB: - var gardens_left: int = GARDEN_TEXTURES_NB - garden_index + while lessons_left > 0 and garden_index < GARDENS_COUNT: + var gardens_left: int = GARDENS_COUNT - garden_index var lessons_for_garden: int = int(ceili(float(lessons_left) / float(gardens_left))) Log.trace("Gardens: Generating layout for garden %s with %s lessons left" % [str(garden_index), str(lessons_left)]) - layout.gardens.append(_generate_single_garden_layout(garden_index, lessons_for_garden, rng)) + layout.gardens.append(_generate_single_garden_layout(garden_index, lessons_for_garden)) lessons_left -= lessons_for_garden Log.trace("Gardens: Lessons left after garden %s generation: %s" % [str(garden_index), str(lessons_left)]) garden_index += 1 @@ -714,18 +625,17 @@ static func generate_gardens_layout(total_lessons: int) -> GardensLayout: return layout -static func _generate_single_garden_layout(garden_index: int, lessons_for_garden: int, rng: RandomNumberGenerator) -> GardenLayout: +static func _generate_single_garden_layout(garden_index: int, lessons_for_garden: int) -> GardenLayout: Log.info("Gardens: Generating single garden layout for garden %s" % str(garden_index)) Log.trace("Gardens: Garden %s will include %s lessons" % [str(garden_index), str(lessons_for_garden)]) var garden_layout: GardenLayout = GardenLayout.new() - garden_layout.color = garden_index % GARDEN_TEXTURES_NB + garden_layout.color = garden_index % GARDENS_COUNT Log.trace("Gardens: Garden %s color index set to %s" % [str(garden_index), str(garden_layout.color)]) - var garden_image: Image = _get_garden_background_image(garden_layout.color) - var garden_dimensions: Vector2 = _get_garden_dimensions(garden_layout.color, garden_image) + var garden_dimensions: Vector2 = Vector2(GARDEN_SIZE, GARDEN_CENTER_Y * 2.0) var half_size: Vector2 = _get_lesson_button_half_size() # Initial path positions - var raw_positions: Array[Vector2i] = _generate_lesson_positions(lessons_for_garden, garden_index) + var raw_positions: Array[Vector2i] = _get_slot_positions_for_count(lessons_for_garden) # Clamp to texture + avoid overlaps var resolved_positions: Array[Vector2] = [] @@ -758,41 +668,15 @@ static func _generate_single_garden_layout(garden_index: int, lessons_for_garden lesson_buttons.append(GardenLayout.GardenLayoutLessonButton.new(lesson_position, path_out)) garden_layout.lesson_buttons = lesson_buttons - # Build flowers (keep RNG call order identical) - var flowers: Array[GardenLayout.Flower] = [] - for lesson_index: int in range(resolved_positions.size()): - var flower_position: Vector2i = Utils.round_vec2(resolved_positions[lesson_index]) - flower_position.y = max(0, flower_position.y - int(FLOWER_OFFSET_FROM_LESSON)) - var flower_color: int = garden_layout.color - var flower_type: int = (lesson_index + garden_index + rng.randi_range(0, FLOWER_TYPES_NB - 1)) % FLOWER_TYPES_NB - var adjusted: Vector2 = _find_valid_position_on_garden(garden_layout.color, Vector2(flower_position), garden_dimensions) - if not adjusted.is_equal_approx(Vector2(flower_position)): - Log.trace("Gardens: Adjusted flower %s position from %s to %s to stay on background" % [str(lesson_index), str(flower_position), str(adjusted)]) - flower_position = Utils.round_vec2(adjusted) - Log.trace("Gardens: Garden %s flower %s position (%s,%s), color %s, type %s" % [str(garden_index), str(lesson_index), str(flower_position.x), str(flower_position.y), str(flower_color), str(flower_type)]) - flowers.append(GardenLayout.Flower.new(flower_color, flower_type, flower_position)) - garden_layout.flowers = flowers Log.info("Gardens: Finished generating garden layout for garden %s" % str(garden_index)) return garden_layout -static func _generate_lesson_positions(lessons_for_garden: int, garden_index: int) -> Array[Vector2i]: - Log.info("Gardens: Generating lesson positions for garden %s" % str(garden_index)) +static func _get_slot_positions_for_count(lesson_count: int) -> Array[Vector2i]: + var indices: Array = Garden.SLOT_SELECTION.get(lesson_count, []) var positions: Array[Vector2i] = [] - if lessons_for_garden <= 0: - Log.trace("Gardens: No lessons for garden %s, returning empty positions" % str(garden_index)) - return positions - var spacing: float = float(GARDEN_SIZE) / float(lessons_for_garden + 1) - Log.trace("Gardens: Garden %s lesson spacing calculated as %s" % [str(garden_index), str(spacing)]) - var vertical_phase: float = float(garden_index % 3) * 0.65 - Log.trace("Gardens: Garden %s vertical phase set to %s" % [str(garden_index), str(vertical_phase)]) - for lesson_index: int in range(lessons_for_garden): - var x_pos: int = int(spacing * float(lesson_index + 1)) - var wave_position: float = float(lesson_index) / maxf(1.0, lessons_for_garden - 1) - var y_pos: int = int(LESSON_VERTICAL_BASE + sin(vertical_phase + wave_position * PI) * LESSON_VERTICAL_RANGE) - Log.trace("Gardens: Garden %s lesson %s position -> x: %s, wave position: %s, y: %s" % [str(garden_index), str(lesson_index), str(x_pos), str(wave_position), str(y_pos)]) - positions.append(Vector2i(x_pos, y_pos)) - Log.info("Gardens: Completed lesson positions for garden %s" % str(garden_index)) + for index: int in indices: + positions.append(SLOT_CENTERS[index]) return positions #endregion @@ -804,6 +688,7 @@ func _process(_delta: float) -> void: locked_line.position.x = - scroll_container.scroll_horizontal unlocked_line.position.x = - scroll_container.scroll_horizontal parallax_background.scroll_offset.x = - scroll_container.scroll_horizontal + clouds.scroll_offset = scroll_container.scroll_horizontal func _process_back_button_hold(delta: float) -> void: @@ -820,113 +705,299 @@ func _process_back_button_hold(delta: float) -> void: _confirm_back_button_pressed() -func _get_minigame_layouts() -> Array[MinigameLayout]: - return [minigame_layout_1, minigame_layout_2, minigame_layout_3] +# Single source of truth for wedge geometry. Returns the pie-slice's start/end +# angles and the bisector angle along which the icon sits, for wedge `wedge_index` +# of a wheel showing `minigame_count` wedges (1..3). +# N=1: full disc, icon to the left of the L&L button. +# N=2: game 0 left half, game 1 right half. +# N=3: game 0 top-right, game 1 bottom, game 2 top-left. +static func _get_wedge_angles(minigame_count: int, wedge_index: int) -> Dictionary: + if minigame_count == 1: + return {start = 0.0, end = TAU, icon = PI} + if minigame_count == 2: + if wedge_index == 0: + return {start = PI / 2.0, end = 3.0 * PI / 2.0, icon = PI} + return {start = -PI / 2.0, end = PI / 2.0, icon = 0.0} + if wedge_index == 0: + return {start = -PI / 2.0, end = PI / 6.0, icon = -PI / 6.0} + if wedge_index == 1: + return {start = PI / 6.0, end = 5.0 * PI / 6.0, icon = PI / 2.0} + return {start = 5.0 * PI / 6.0, end = 3.0 * PI / 2.0, icon = 7.0 * PI / 6.0} + + +static func _get_wedge_layout(minigame_count: int, wedge_index: int) -> Dictionary: + var angles: Dictionary = _get_wedge_angles(minigame_count, wedge_index) + var polygon: PackedVector2Array = _generate_full_disc_polygon() if minigame_count == 1 \ + else _generate_pie_slice_polygon(angles.start as float, angles.end as float) + return {polygon = polygon, icon_center = _wedge_icon_position(angles.icon as float)} + + +static func _generate_pie_slice_polygon(start_angle: float, end_angle: float, radius: float = WHEEL_RADIUS) -> PackedVector2Array: + var wheel_points: PackedVector2Array = PackedVector2Array() + wheel_points.append(WHEEL_CENTER) + var span: float = end_angle - start_angle + for index: int in range(WHEEL_ARC_SEGMENTS + 1): + var angle: float = start_angle + span * (float(index) / float(WHEEL_ARC_SEGMENTS)) + wheel_points.append(WHEEL_CENTER + Vector2(cos(angle), sin(angle)) * radius) + return wheel_points + + +static func _generate_full_disc_polygon(radius: float = WHEEL_RADIUS) -> PackedVector2Array: + var wheel_points: PackedVector2Array = PackedVector2Array() + for index: int in range(WHEEL_ARC_SEGMENTS): + var angle: float = TAU * float(index) / float(WHEEL_ARC_SEGMENTS) + wheel_points.append(WHEEL_CENTER + Vector2(cos(angle), sin(angle)) * radius) + return wheel_points + + +# Wedge polygon with outer arc inset by half the stroke width so the gold line +# stays inside the wedge. Radial edges keep their angles (fall on the dividers). +static func _generate_wedge_highlight_polygon(minigame_count: int, wedge_index: int) -> PackedVector2Array: + var inset_radius: float = WHEEL_RADIUS - WHEEL_HIGHLIGHT_WIDTH * 0.5 + if minigame_count == 1: + return _generate_full_disc_polygon(inset_radius) + var angles: Dictionary = _get_wedge_angles(minigame_count, wedge_index) + return _generate_pie_slice_polygon(angles.start as float, angles.end as float, inset_radius) + + +static func _wedge_icon_position(angle_rad: float) -> Vector2: + return WHEEL_CENTER + Vector2(cos(angle_rad), sin(angle_rad)) * (WHEEL_RADIUS * WHEEL_ICON_DISTANCE_RATIO) + + +static func _get_divider_segments(minigame_count: int) -> Array[PackedVector2Array]: + var segments: Array[PackedVector2Array] = [] + if minigame_count < 2: + return segments + for wedge_index: int in range(minigame_count): + var start_angle: float = _get_wedge_angles(minigame_count, wedge_index).start as float + var edge: Vector2 = WHEEL_CENTER + Vector2(cos(start_angle), sin(start_angle)) * WHEEL_RADIUS + segments.append(PackedVector2Array([WHEEL_CENTER, edge])) + return segments + + +func _clear_wheel() -> void: + for child: Node in wedges_container.get_children(): + child.queue_free() + + +func _build_wheel(exercises: Array[int], lesson_unlocks: Dictionary) -> void: + _clear_wheel() + var minigame_count: int = exercises.size() + for wedge_index: int in range(minigame_count): + var layout: Dictionary = _get_wedge_layout(minigame_count, wedge_index) + var exercise_type: int = exercises[wedge_index] + var icon_index: int = exercise_type - 1 + # Guard against exercise types with no matching wheel icon (e.g. the + # removed fish minigame, type 10): fall back to the highest available one + # so we never index past the icon arrays. + var max_icon_index: int = minigames_body_icons.size() - 1 + if icon_index < 0 or icon_index > max_icon_index: + Log.error("Gardens: Exercise type %d has no wheel icon (%d available); using the highest available minigame instead." % [exercise_type, minigames_body_icons.size()]) + icon_index = clampi(icon_index, 0, max_icon_index) + var status: StudentProgression.Status = lesson_unlocks["games"][wedge_index] as StudentProgression.Status + var wedge: MinigameWedge = MINIGAME_WEDGE_SCENE.instantiate() + wedges_container.add_child(wedge) + var is_wedge_locked: bool = status == StudentProgression.Status.LOCKED + wedge.configure( + layout.polygon as PackedVector2Array, + layout.icon_center as Vector2, + minigames_body_icons[icon_index], + minigames_face_icons[icon_index], + _wedge_color_for_status(status), + _body_color_for_status(status), + is_wedge_locked, + ) + wedge.is_disabled = is_wedge_locked + wedge.pressed.connect(_on_minigame_button_pressed.bind(icon_index, wedge_index)) + _apply_wedge_status_effects(wedge, status, wedge_index) + + for line_points: PackedVector2Array in _get_divider_segments(minigame_count): + var divider: Line2D = Line2D.new() + divider.width = WHEEL_DIVIDER_WIDTH + divider.default_color = current_garden.wheel_background + divider.points = line_points + wedges_container.add_child(divider) + + _draw_next_to_play_highlight(lesson_unlocks, minigame_count) + + +func _next_to_play_wedge_index(lesson_unlocks: Dictionary) -> int: + if lesson_unlocks["look_and_learn"] != StudentProgression.Status.COMPLETED: + return -1 + var games: Array = lesson_unlocks["games"] + for index: int in range(games.size()): + if games[index] == StudentProgression.Status.UNLOCKED: + return index + return -1 + + +func _draw_next_to_play_highlight(lesson_unlocks: Dictionary, minigame_count: int) -> void: + # L&L's "next to play" cue is the lesson-button outline color swap, handled + # in _configure_lesson_button_outline(). Wedges get a separate gold ring here. + var wedge_index: int = _next_to_play_wedge_index(lesson_unlocks) + if wedge_index < 0: + return + _draw_wedge_highlight(minigame_count, wedge_index) + + +func _draw_wedge_highlight(minigame_count: int, wedge_index: int) -> void: + _add_highlight_line(_generate_wedge_highlight_polygon(minigame_count, wedge_index)) + + +# Adds a gold outline tracing the given polygon to the wheel. The polyline is +# closed automatically. z_index lifts the line above Branches; LessonButton's +# higher z_index keeps it on top in turn. +func _add_highlight_line(polygon_points: PackedVector2Array) -> void: + if polygon_points.is_empty(): + return + var outline: PackedVector2Array = PackedVector2Array(polygon_points) + outline.append(polygon_points[0]) + var line: Line2D = Line2D.new() + line.width = WHEEL_HIGHLIGHT_WIDTH + line.default_color = Garden.WHEEL_HIGHLIGHT + line.joint_mode = Line2D.LINE_JOINT_ROUND + line.begin_cap_mode = Line2D.LINE_CAP_ROUND + line.end_cap_mode = Line2D.LINE_CAP_ROUND + line.points = outline + line.z_index = 5 + wedges_container.add_child(line) + + +func _wedge_color_for_status(status: StudentProgression.Status) -> Color: + match status: + StudentProgression.Status.LOCKED: + return Garden.WHEEL_WEDGE_LOCKED + _: + return current_garden.wheel_wedge_unlocked + + +# Animal body tint: gray when locked, garden's signature color otherwise. +func _body_color_for_status(status: StudentProgression.Status) -> Color: + if status == StudentProgression.Status.LOCKED: + return Garden.ANIMAL_LOCKED_COLOR + return current_garden.animal_unlocked_color + + +func _apply_wedge_status_effects(wedge: MinigameWedge, status: StudentProgression.Status, wedge_index: int) -> void: + if status != StudentProgression.Status.COMPLETED: + return + if not transition_data \ + or not transition_data.get("minigame_completed", false) \ + or transition_data.get("minigame_number", -1) != wedge_index \ + or not transition_data.get("first_clear", false): + return + await minigame_layout_opened + wedge.right() func _open_minigames_layout(button: LessonButton, lesson_number: int) -> void: if in_minigame_selection or not UserDataManager.student_progression: return + var exercises: Array[int] = Database.get_exercise_for_lesson(lesson_number) + if exercises.is_empty(): + Log.error("Gardens: Cannot open minigame layout for lesson %d: no minigames defined" % lesson_number) + return feedback_audio_stream_player2.pitch_scale = 1.1 feedback_audio_stream_player2.play() in_minigame_selection = true - # Gets the correct exercises for the lesson - var exercises: Array[int] = Database.get_exercise_for_lesson(lesson_number) - if not exercises or exercises.size() < 3: - return # Sets the variables for the current garden and lesson current_lesson_number = lesson_number - var flower_info: Dictionary = _get_flower_info(current_lesson_number) - if flower_info and flower_info.has("garden"): - current_garden = flower_info.garden - else: - Log.warn("Gardens: Flower info corrupted for lesson %d" % lesson_number) + var garden_index_for_lesson: int = _get_garden_index_for_lesson(lesson_number) + if garden_index_for_lesson >= 0 and garden_index_for_lesson < garden_parent.get_child_count(): + current_garden = garden_parent.get_child(garden_index_for_lesson) if button: current_button = button current_button.show_placeholder(true) current_button_global_position = button.global_position # Gets the current lesson unlocks var lesson_unlocks: Dictionary = UserDataManager.student_progression.unlocks[current_lesson_number] - var are_minigames_locked: bool = lesson_unlocks["games"][0] == StudentProgression.Status.Locked and lesson_unlocks["games"][1] == StudentProgression.Status.Locked and lesson_unlocks["games"][2] == StudentProgression.Status.Locked # Deactivate the mouse filters on the buttons behind the layout for lesson_button_item: LessonButton in current_garden.get_lesson_buttons(): lesson_button_item.mouse_filter = Control.MOUSE_FILTER_IGNORE - # Background - if are_minigames_locked: - minigame_background_center.modulate = locked_color - else: - minigame_background_center.modulate = current_garden.color - # Lesson button - _handle_lesson_button(current_lesson_number, lesson_unlocks["look_and_learn"] as StudentProgression.Status, current_garden.color) - # Minigames - var minigame_layouts: Array[MinigameLayout] = _get_minigame_layouts() - for layout_index: int in minigame_layouts.size(): - _fill_minigame_choice(minigame_layouts[layout_index], exercises[layout_index], lesson_unlocks["games"][layout_index] as StudentProgression.Status, layout_index) + var ll_status: StudentProgression.Status = lesson_unlocks["look_and_learn"] as StudentProgression.Status + background_rect.color = current_garden.wheel_background + _configure_lesson_button_outline(ll_status) + _center_lesson_button_label() + _handle_lesson_button(current_lesson_number, ll_status) + _build_wheel(exercises, lesson_unlocks) # Animations minigame_selection.show() back_button.hide() kalulu_button.hide() line_particles.hide() - minigame_background.size = 300.0 * Vector2.ONE - minigame_background.global_position = current_button_global_position - minigame_background.show() - minigame_background_center.size = 300.0 * Vector2.ONE - minigame_background_center.global_position = current_button_global_position - minigame_background_center.show() - var tween: Tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) - tween.tween_property(minigame_background_center, "scale", (1800.0 / 300.0) * Vector2.ONE, 0.25) - tween.tween_property(minigame_background_center, "global_position", Vector2(380.0, 0), 0.25) - tween.tween_property(minigame_background, "scale", (1800.0 / 300.0) * Vector2.ONE, 0.25) - tween.tween_property(minigame_background, "global_position", Vector2(380.0, 0), 0.25) - tween.chain().tween_property(minigame_selection, "modulate:a", 1.0, 0.25) + var tween: Tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + tween.tween_property(minigame_selection, "modulate:a", 1.0, 0.25) await tween.finished minigame_layout_opened.emit() -func _handle_lesson_button(lesson_number: int, status: StudentProgression.Status, color: Color) -> void: +# Perfectly centers the grapheme label horizontally and drops it just below the +# button center, so it pairs with the movie icon sitting just above. Done in code +# because instanced-scene property overrides on the inherited Label don't survive +# Godot re-saves. This LessonButton is a dedicated wheel instance, so it doesn't +# affect the garden lesson buttons. +func _center_lesson_button_label() -> void: + var label: Label = lesson_button.label + label.anchor_left = 0.0 + label.anchor_top = 0.0 + label.anchor_right = 1.0 + label.anchor_bottom = 1.0 + label.offset_left = 0.0 + label.offset_right = 0.0 + label.offset_top = LESSON_BUTTON_LABEL_TOP_OFFSET + label.offset_bottom = 0.0 + + +func _configure_lesson_button_outline(ll_status: StudentProgression.Status) -> void: + # Gold when L&L is the next-to-play step (UNLOCKED but not yet COMPLETED), + # divider color otherwise. Replaces the separate gold ring we used to draw. + var color: Color = Garden.WHEEL_HIGHLIGHT if ll_status == StudentProgression.Status.UNLOCKED else current_garden.wheel_background + lesson_button_outline.default_color = color + var circle_points: PackedVector2Array = _generate_full_disc_polygon(LESSON_BUTTON_OUTLINE_RADIUS) + if circle_points.size() > 0: + circle_points.append(circle_points[0]) + lesson_button_outline.points = circle_points + + +func _handle_lesson_button(lesson_number: int, status: StudentProgression.Status) -> void: lesson_button.text = lessons[lesson_number][0].grapheme - lesson_button.completed_color = color - lesson_button.set_disabled(status == StudentProgression.Status.Locked) - lesson_button.completed = status == StudentProgression.Status.Completed - lesson_button_particles.emitting = status == StudentProgression.Status.Unlocked - if status == StudentProgression.Status.Completed: + # Center stays the unlocked-wedge color across all states; pair it with the + # garden's dark color so the label and icon stay readable on it. + lesson_button.set_garden_colors( + current_garden.wheel_wedge_unlocked, + current_garden.unlocked_lesson, + current_garden.wheel_wedge_unlocked, + current_garden.unlocked_lesson, + ) + lesson_button.set_button_disabled(status == StudentProgression.Status.LOCKED) + lesson_button.completed = status == StudentProgression.Status.COMPLETED + # Override the hardcoded gray LessonButton uses when disabled, so the L&L + # center button keeps a uniform background regardless of progression state. + lesson_button.center.modulate = current_garden.wheel_wedge_unlocked + lesson_button_particles.emitting = status == StudentProgression.Status.UNLOCKED + lesson_button_movie_icon.modulate = _lesson_button_label_color(status) + if status == StudentProgression.Status.COMPLETED: if transition_data and transition_data.has("look_and_learn_completed") and transition_data.look_and_learn_completed: await minigame_layout_opened lesson_button.right() -func _fill_minigame_choice(minigame_layout: MinigameLayout, exercise_type: int, status: StudentProgression.Status, minigame_number: int) -> void: - minigame_layout.icon.texture = minigames_icons[exercise_type-1] - minigame_layout.is_disabled = status == StudentProgression.Status.Locked - if status == StudentProgression.Status.Completed: - if transition_data and transition_data.has("minigame_completed") and transition_data.minigame_completed and transition_data.has("minigame_number") and transition_data.minigame_number == minigame_number and transition_data.has("first_clear") and transition_data.first_clear: - minigame_layout.self_modulate = unlocked_color - await minigame_layout_opened - create_tween().tween_property(minigame_layout, "self_modulate:a", 0, 0.5) - minigame_layout.right() - else: - minigame_layout.self_modulate.a = 0 - elif status == StudentProgression.Status.Locked: - minigame_layout.self_modulate = locked_color - else: - minigame_layout.self_modulate = unlocked_color - minigame_layout.pressed.connect(_on_minigame_button_pressed.bind(exercise_type - 1, minigame_number)) +# Mirrors LessonButton._update_visual_state() so the movie icon tracks the label. +func _lesson_button_label_color(status: StudentProgression.Status) -> Color: + if status == StudentProgression.Status.LOCKED: + return LessonButton.LOCKED_LABEL_COLOR + if status == StudentProgression.Status.COMPLETED: + return lesson_button.completed_label_color + return lesson_button.unlocked_label_color -func _get_minigame_scene(scene_index: int) -> PackedScene: +func _get_minigame_scene_path(scene_index: int) -> String: if scene_index < 0 or scene_index >= minigame_scene_paths.size(): - return null - if _minigame_scene_cache.has(scene_index): - return _minigame_scene_cache[scene_index] as PackedScene + return "" var scene_path: String = minigame_scene_paths[scene_index] - if scene_path.is_empty(): - return null - var scene_resource: Resource = load(scene_path) - if scene_resource is PackedScene: - var packed_scene: PackedScene = scene_resource as PackedScene - _minigame_scene_cache[scene_index] = packed_scene - return packed_scene - return null + if scene_path.is_empty() or not ResourceLoader.exists(scene_path): + return "" + return scene_path func _count_completed_minigames(lesson_number: int) -> int: @@ -934,49 +1005,29 @@ func _count_completed_minigames(lesson_number: int) -> int: return 0 var completed: int = 0 for game_status: int in UserDataManager.student_progression.unlocks[lesson_number]["games"]: - if game_status == StudentProgression.Status.Completed: + if game_status == StudentProgression.Status.COMPLETED: completed += 1 return completed -func _get_flower_size_for_completion(completed_minigames: int) -> Garden.FlowerSizes: - match completed_minigames: - 1: - return Garden.FlowerSizes.SMALL - 2: - return Garden.FlowerSizes.MEDIUM - 3: - return Garden.FlowerSizes.LARGE - _: - return Garden.FlowerSizes.NOT_STARTED - - func _close_minigames_layout() -> void: if not in_minigame_selection: return in_minigame_selection = false feedback_audio_stream_player2.pitch_scale = 0.75 feedback_audio_stream_player2.play() - var tween: Tween = create_tween().set_parallel(true).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + var tween: Tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) tween.tween_property(minigame_selection, "modulate:a", 0.0, 0.25) - var other_tween: Tween = tween.chain() - other_tween.tween_property(minigame_background_center, "scale", Vector2.ONE, 0.25) - other_tween.tween_property(minigame_background_center, "global_position", current_button_global_position, 0.25) - other_tween.tween_property(minigame_background, "scale", Vector2.ONE, 0.25) - other_tween.tween_property(minigame_background, "global_position", current_button_global_position, 0.25) await tween.finished if current_button: current_button.show_placeholder(false) minigame_selection.hide() - minigame_background.hide() - minigame_background_center.hide() back_button.show() kalulu_button.show() line_particles.show() for button: LessonButton in current_garden.get_lesson_buttons(): button.mouse_filter = Control.MOUSE_FILTER_STOP - for layout: MinigameLayout in _get_minigame_layouts(): - layout.pressed.disconnect(_on_minigame_button_pressed) + _clear_wheel() #region Lesson setup and path @@ -1018,7 +1069,8 @@ func add_gardens() -> void: for layout_index: int in range(gardens_layout.gardens.size()): Log.trace("Gardens: Preparing garden %s with layout index %s" % [str(garden_index), str(layout_index)]) var garden_layout: GardenLayout = gardens_layout.gardens[layout_index] - var garden: Garden = GARDEN_SCENE.instantiate() + var garden_scene: PackedScene = load(GARDEN_SCENE_PATHS[layout_index]) as PackedScene + var garden: Garden = garden_scene.instantiate() garden_parent.add_child(garden) garden.garden_index = garden_index garden_index += 1 @@ -1035,20 +1087,26 @@ func set_up_path() -> void: return points = [] var curve: Curve2D = Curve2D.new() - for index: int in range(gardens_layout.gardens.size()): - if index >= garden_parent.get_child_count(): - break - var garden_layout: GardenLayout = gardens_layout.gardens[index] + for index: int in range(garden_parent.get_child_count()): var garden_control: Garden = garden_parent.get_child(index) - for button: GardenLayout.GardenLayoutLessonButton in garden_layout.lesson_buttons: - var point_position: Vector2 = garden_parent.position + garden_control.position + Vector2(button.position) - point_position += garden_control.get_button_size() / 2 - var point_in_position: Vector2 = Vector2.ZERO + var lesson_buttons: Array[LessonButton] = garden_control.get_lesson_buttons() + for button_index: int in range(lesson_buttons.size()): + var button: LessonButton = lesson_buttons[button_index] + var button_center: Vector2 = button.position + button.size / 2.0 + var point_position: Vector2 = garden_parent.position + garden_control.position + button_center + var path_out: Vector2 = Vector2.ZERO + if button_index + 1 < lesson_buttons.size(): + var next_button: LessonButton = lesson_buttons[button_index + 1] + var next_center: Vector2 = next_button.position + next_button.size / 2.0 + path_out = (next_center - button_center) * 0.5 + else: + path_out = Vector2(GARDEN_SIZE * 0.15, (-1.0 if (index % 2) == 0 else 1.0) * 60) + var point_in: Vector2 = Vector2.ZERO if curve.point_count > 0: - point_in_position = curve.get_point_position(curve.point_count - 1) + curve.get_point_out(curve.point_count - 1) - point_position - curve.add_point(point_position, point_in_position, button.path_out_position) - points.append([point_position, point_in_position, button.path_out_position]) - locked_line.points = curve.get_baked_points() + point_in = curve.get_point_position(curve.point_count - 1) + curve.get_point_out(curve.point_count - 1) - point_position + curve.add_point(point_position, point_in, path_out) + points.append([point_position, point_in, path_out]) + locked_line.points = curve.get_baked_points() func _set_unlocked_path(max_unlocked_lesson_index: int, include_boss_segment: bool = true) -> void: @@ -1107,8 +1165,6 @@ func _sync_boss_buttons_container() -> void: if not boss_buttons_container or not garden_parent: return boss_buttons_container.mouse_filter = Control.MOUSE_FILTER_IGNORE - boss_buttons_container.position = Vector2.ZERO - boss_buttons_container.size = scroll_container.size func _clear_boss_buttons() -> void: @@ -1148,10 +1204,10 @@ func _set_up_boss_buttons() -> void: var is_completed: bool = UserDataManager.student_progression.is_boss_completed(gate_lesson) var is_blocked_by_boss: bool = UserDataManager.student_progression.is_lesson_blocked_by_boss(gate_lesson) var is_unlocked: bool = UserDataManager.student_progression.is_lesson_completed(gate_lesson) and not is_blocked_by_boss - boss_button.set_disabled(not is_unlocked and not is_completed) + boss_button.set_button_disabled(not is_unlocked and not is_completed) boss_button.completed = is_completed else: - boss_button.set_disabled(true) + boss_button.set_button_disabled(true) var garden_index: int = _get_garden_index_for_lesson(gate_lesson) boss_button.pressed.connect(_on_boss_button_pressed.bind(gate_lesson, garden_index)) _set_up_final_boss_button() @@ -1178,7 +1234,7 @@ func _set_up_final_boss_button() -> void: boss_button.size = final_boss_size boss_button.pivot_offset = final_boss_size * 0.5 boss_button.position = final_boss_center - final_boss_size * 0.5 - boss_button.set_disabled(false) + boss_button.set_button_disabled(false) boss_button.pressed.connect(_on_final_boss_button_pressed.bind(final_lesson_number, last_garden_index)) _update_final_boss_scroll_space(final_boss_center, final_boss_size) @@ -1186,6 +1242,7 @@ func _set_up_final_boss_button() -> void: func _reset_final_boss_scroll_space() -> void: if scroll_end_spacer: scroll_end_spacer.custom_minimum_size.x = scroll_end_base_width + _refresh_cloud_world_bounds() func _update_final_boss_scroll_space(final_boss_center: Vector2, final_boss_size: Vector2) -> void: @@ -1199,6 +1256,7 @@ func _update_final_boss_scroll_space(final_boss_center: Vector2, final_boss_size var final_boss_right_edge: float = final_boss_center.x + final_boss_size.x * 0.5 var extra_width: float = max(0.0, final_boss_right_edge - last_garden_right_edge) scroll_end_spacer.custom_minimum_size.x = scroll_end_base_width + extra_width + _refresh_cloud_world_bounds() func _extend_unlocked_path_to_final_boss() -> void: @@ -1361,7 +1419,7 @@ func _on_lesson_button_pressed() -> void: current_garden_index = current_garden.garden_index, look_and_learn_completed = false } - get_tree().change_scene_to_packed(LOOK_AND_LEARN_SCENE) + SceneLoader.change_scene(LOOK_AND_LEARN_SCENE_PATH) func _on_boss_button_pressed(lesson_number: int, garden_index: int) -> void: @@ -1377,7 +1435,7 @@ func _on_boss_button_pressed(lesson_number: int, garden_index: int) -> void: skip_minigame_layout = true, boss_gate_lesson = lesson_number } - get_tree().change_scene_to_file(BOSS_MINIGAME_SCENE_PATH) + SceneLoader.change_scene(BOSS_MINIGAME_SCENE_PATH) func _on_final_boss_button_pressed(lesson_number: int, garden_index: int) -> void: @@ -1394,16 +1452,18 @@ func _on_final_boss_button_pressed(lesson_number: int, garden_index: int) -> voi boss_gate_lesson = lesson_number, is_final_boss = true } - get_tree().change_scene_to_file(BOSS_MINIGAME_SCENE_PATH) + SceneLoader.change_scene(BOSS_MINIGAME_SCENE_PATH) func _on_minigame_button_pressed(scene_index: int, minigame_number: int) -> void: if is_locked: return - var minigame_scene: PackedScene = _get_minigame_scene(scene_index) - if not minigame_scene: + var scene_path: String = _get_minigame_scene_path(scene_index) + if scene_path.is_empty(): Log.error("Gardens: Missing minigame scene for index %d" % scene_index) return + # Block a second wedge click during the curtain-close await below. + _lock() feedback_audio_stream_player.play() await (OpeningCurtain as OpeningCurtainClass).close() Minigame.transition_data = { @@ -1413,7 +1473,7 @@ func _on_minigame_button_pressed(scene_index: int, minigame_number: int) -> void minigame_number = minigame_number, minigame_completed = false } - get_tree().change_scene_to_packed(minigame_scene) + SceneLoader.change_scene(scene_path) func _on_scroll_container_gui_input(event: InputEvent) -> void: @@ -1452,7 +1512,7 @@ func _scroll_by_garden(p_direction: int) -> void: func _confirm_back_button_pressed() -> void: UserDataManager.logout_student() await (OpeningCurtain as OpeningCurtainClass).close() - get_tree().change_scene_to_file("res://sources/menus/login/login.tscn") + SceneLoader.change_scene("res://sources/menus/login/login.tscn") func _on_back_button_button_down() -> void: @@ -1480,6 +1540,31 @@ func _on_area_2d_input_event(_viewport: Node, event: InputEvent, _shape_idx: int _close_minigames_layout() +# BackgroundRect spans the wheel screen with mouse_filter=STOP so it absorbs +# every click that doesn't hit the L&L button (which is on top of it). We +# dispatch the click to the matching wedge via point-in-polygon, or close the +# wheel if the click falls outside every wedge. +func _on_background_rect_gui_input(event: InputEvent) -> void: + if is_locked or not in_minigame_selection: + return + if not event.is_action_pressed("left_click"): + return + var click_pos: Vector2 = (event as InputEventMouseButton).position + for child: Node in wedges_container.get_children(): + if child is MinigameWedge: + var wedge: MinigameWedge = child + if Geometry2D.is_point_in_polygon(click_pos, wedge.polygon.polygon): + # Hit on a wedge — enabled ones launch the minigame; disabled + # ones play the wrong-click feedback. Either way the click is + # consumed so the wheel stays open. + if wedge.is_disabled: + wedge.wrong() + else: + wedge.pressed.emit() + return + _close_minigames_layout() + + func _on_kalulu_button_pressed() -> void: kalulu_button.hide() if current_garden.get_progress_ratio() > 0.75: diff --git a/sources/gardens/gardens.tscn b/sources/gardens/gardens.tscn index 5080c475..a86f0721 100644 --- a/sources/gardens/gardens.tscn +++ b/sources/gardens/gardens.tscn @@ -2,40 +2,44 @@ [ext_resource type="Script" uid="uid://djolw68efn6r5" path="res://sources/gardens/gardens.gd" id="1_qlsw4"] [ext_resource type="Texture2D" uid="uid://jlwblk7lj7vi" path="res://assets/vfx/fx_10.png" id="3_xbvhu"] -[ext_resource type="Texture2D" uid="uid://cq5wwf7y1msh7" path="res://assets/minigames/crabs/graphic/gauge_icon_crab_full.png" id="5_h8c5w"] -[ext_resource type="Texture2D" uid="uid://di2qcv6jw8wh0" path="res://assets/minigames/parakeets/graphic/gauge_icon_parakeet_full.png" id="6_hekq6"] -[ext_resource type="Texture2D" uid="uid://cq87j1xw4c31r" path="res://assets/minigames/jellyfish/graphic/gauge_icon_jellyfish_full.png" id="6_p30hm"] -[ext_resource type="Texture2D" uid="uid://cffuqacgb1jra" path="res://assets/lesson_screen/branches.png" id="7_axgdc"] -[ext_resource type="Texture2D" uid="uid://c3okdxpi317x5" path="res://assets/minigames/monkeys/graphic/gauge_icon_monkey_full.png" id="9_68su4"] -[ext_resource type="Texture2D" uid="uid://re7qgivb3n5w" path="res://assets/minigames/frog/graphics/gauge_icon_frog_full.png" id="10_5wvwc"] -[ext_resource type="Texture2D" uid="uid://nwbekpbuu472" path="res://assets/minigames/ants/graphics/gauge_icon_ant_full.png" id="12_ohgqx"] -[ext_resource type="Texture2D" uid="uid://bc3e0qths2cvt" path="res://assets/minigames/boss/boss_icon_full.png" id="16_5rwfp"] -[ext_resource type="Texture2D" uid="uid://bmdhpgxmur1vo" path="res://assets/minigames/caterpillar/graphics/gauge_icon_caterpillar_full.png" id="16_prl1o"] [ext_resource type="AudioStream" uid="uid://4bv1hr6r68op" path="res://assets/gardens/ui_transition_right.mp3" id="17_37f6y"] -[ext_resource type="Texture2D" uid="uid://rnqme2j272qf" path="res://assets/minigames/turtles/graphic/gauge_icon_turtle_full.png" id="18_12pcf"] [ext_resource type="AudioStream" uid="uid://bwgrj3quwtbvm" path="res://assets/gardens/ui_transition_left.mp3" id="18_bdar8"] -[ext_resource type="Texture2D" uid="uid://bb00fhnenbml5" path="res://assets/lesson_screen/big_button.png" id="20_elp7t"] -[ext_resource type="Texture2D" uid="uid://dq23np4euf6da" path="res://assets/minigames/penguin/graphic/gauge_icon_penguin_full.png" id="20_ouafq"] -[ext_resource type="Texture2D" uid="uid://dlnklpyefn0m2" path="res://assets/lesson_screen/big_button_center.png" id="21_r0a4h"] -[ext_resource type="Material" path="res://resources/gardens/minigame_icon_material.tres" id="22_cgp31"] -[ext_resource type="Texture2D" uid="uid://dkomjpclxvmqf" path="res://assets/lesson_screen/top_left.png" id="23_p1d10"] -[ext_resource type="Texture2D" uid="uid://rux5delnabp5" path="res://assets/lesson_screen/top_right.png" id="24_30f83"] [ext_resource type="AudioStream" uid="uid://bgof22p2ofunc" path="res://assets/sfx/ui_yes_button.mp3" id="24_ljadf"] [ext_resource type="PackedScene" uid="uid://delcgui3v0eek" path="res://sources/lesson_screen/lesson_button.tscn" id="25_0ruwb"] [ext_resource type="Texture2D" uid="uid://dx7w01wdyq0b5" path="res://assets/particles/bigstar_x36_15fps.png" id="25_00sy7"] [ext_resource type="AudioStream" uid="uid://vyj4leik80w2" path="res://assets/sfx/swoosh.mp3" id="25_npbuv"] -[ext_resource type="Texture2D" uid="uid://cqhbpt3lk6f15" path="res://assets/lesson_screen/bottom.png" id="25_tyvq6"] [ext_resource type="AudioStream" uid="uid://dlxvbjp63w6wm" path="res://assets/look_and_learn/effect.wav" id="26_5g3l0"] -[ext_resource type="Script" uid="uid://ddew42fnpmsx1" path="res://sources/gardens/minigame_layout.gd" id="28_kvgph"] [ext_resource type="PackedScene" uid="uid://cyoioissvrkj8" path="res://sources/ui/back_button.tscn" id="29_back_button"] [ext_resource type="Texture2D" uid="uid://dj0ygi5q6kbdw" path="res://assets/minigames/minigame_ui/graphic/button_back_normal.png" id="29_cgp31"] [ext_resource type="Texture2D" uid="uid://gmoc5mxxfqin" path="res://assets/minigames/minigame_ui/graphic/button_back_pressed.png" id="30_wnxkf"] [ext_resource type="Texture2D" uid="uid://bnvx1mujmy3vf" path="res://assets/minigames/minigame_ui/graphic/button_back_disabled.png" id="31_b65yw"] -[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="33_5y3ye"] [ext_resource type="Texture2D" uid="uid://iw84x6mx8h2g" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_normal.png" id="41_xcos2"] [ext_resource type="Texture2D" uid="uid://ub1dnysbojn8" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_pressed.png" id="42_l35j3"] [ext_resource type="Texture2D" uid="uid://crnxawhf68po3" path="res://assets/minigames/minigame_ui/graphic/button_kalulu_disabled.png" id="43_jfyfk"] [ext_resource type="PackedScene" uid="uid://blos4rn53qkwg" path="res://sources/minigames/base/kalulu_ingame.tscn" id="44_okr34"] +[ext_resource type="Script" uid="uid://cgtd34f7vi2tj" path="res://sources/utils/clouds_manager.gd" id="45_clouds"] +[ext_resource type="Texture2D" uid="uid://rx270y4n7tul" path="res://assets/minigames/parakeets/graphic/cloud_1.png" id="46_cloud1"] +[ext_resource type="Texture2D" uid="uid://dphj3hqfnnw4p" path="res://assets/minigames/parakeets/graphic/cloud_2.png" id="47_cloud2"] +[ext_resource type="Texture2D" uid="uid://1btgagsporxa" path="res://assets/minigames/parakeets/graphic/cloud_3.png" id="48_cloud3"] +[ext_resource type="Texture2D" uid="uid://d1j23o6nq476v" path="res://assets/gardens/animals/ant_body.png" id="ant_body"] +[ext_resource type="Texture2D" uid="uid://by3xfdin7jrsn" path="res://assets/gardens/animals/ant_face.png" id="ant_face"] +[ext_resource type="Texture2D" uid="uid://b6nrx0dn0h3f2" path="res://assets/gardens/animals/caterpillar_body.png" id="caterpillar_body"] +[ext_resource type="Texture2D" uid="uid://cnihbmks0piwi" path="res://assets/gardens/animals/caterpillar_face.png" id="caterpillar_face"] +[ext_resource type="Texture2D" uid="uid://b2e61oot7ht35" path="res://assets/gardens/animals/crab_body.png" id="crab_body"] +[ext_resource type="Texture2D" uid="uid://ruclqu4dc13u" path="res://assets/gardens/animals/crab_face.png" id="crab_face"] +[ext_resource type="Texture2D" uid="uid://oagcnmxs0xx1" path="res://assets/gardens/animals/frog_body.png" id="frog_body"] +[ext_resource type="Texture2D" uid="uid://b4243242f34g0" path="res://assets/gardens/animals/frog_face.png" id="frog_face"] +[ext_resource type="Texture2D" uid="uid://bb3we2it550v6" path="res://assets/gardens/animals/jellyfish_body.png" id="jellyfish_body"] +[ext_resource type="Texture2D" uid="uid://dppmdv8u3cwl1" path="res://assets/gardens/animals/jellyfish_face.png" id="jellyfish_face"] +[ext_resource type="Texture2D" uid="uid://dr12efhuotfgt" path="res://assets/gardens/animals/monkey_body.png" id="monkey_body"] +[ext_resource type="Texture2D" uid="uid://dc52xvm4y6rir" path="res://assets/gardens/animals/monkey_face.png" id="monkey_face"] +[ext_resource type="Texture2D" uid="uid://c1ml42sp1vqga" path="res://assets/gardens/buttons/movie_icon.png" id="movie_icon"] +[ext_resource type="Texture2D" uid="uid://c2yalimkyunxi" path="res://assets/gardens/animals/parakeet_body.png" id="parakeet_body"] +[ext_resource type="Texture2D" uid="uid://l52tfb7fdrpt" path="res://assets/gardens/animals/parakeet_face.png" id="parakeet_face"] +[ext_resource type="Texture2D" uid="uid://noekve4gjudr" path="res://assets/gardens/animals/penguin_body.png" id="penguin_body"] +[ext_resource type="Texture2D" uid="uid://dbg7mxg3x7vd4" path="res://assets/gardens/animals/penguin_face.png" id="penguin_face"] +[ext_resource type="Texture2D" uid="uid://b7rqldqdft30a" path="res://assets/gardens/animals/turtle_body.png" id="turtle_body"] +[ext_resource type="Texture2D" uid="uid://nu4kpbywwpgn" path="res://assets/gardens/animals/turtle_face.png" id="turtle_face"] [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ey6av"] blend_mode = 1 @@ -48,6 +52,14 @@ point_count = 3 width = 32 curve = SubResource("Curve_wa85y") +[sub_resource type="Gradient" id="Gradient_stars"] +interpolation_mode = 1 +offsets = PackedFloat32Array(0, 0.166667, 0.333333, 0.5, 0.666667, 0.833333) +colors = PackedColorArray(1, 0.827451, 0.4, 1, 1, 0.74902, 0.580392, 1, 0.960784, 0.658824, 0.784314, 1, 0.498039, 0.784314, 1, 1, 0.658824, 0.941176, 0.815686, 1, 0.737255, 0.643137, 1, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_stars"] +gradient = SubResource("Gradient_stars") + [sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_m12rm"] particle_flag_disable_z = true emission_shape = 3 @@ -58,9 +70,8 @@ angular_velocity_max = 90.0 gravity = Vector3(0, 0, 0) scale_min = 0.1 scale_max = 0.25 +color_initial_ramp = SubResource("GradientTexture1D_stars") alpha_curve = SubResource("CurveTexture_upllx") -hue_variation_min = -1.0 -hue_variation_max = 1.0 [sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_13bcn"] particles_animation = true @@ -112,7 +123,8 @@ grow_vertical = 2 mouse_filter = 2 script = ExtResource("1_qlsw4") minigame_scene_paths = PackedStringArray("res://sources/minigames/jellyfish/jellyfish_minigame.tscn", "res://sources/minigames/crabs/crabs_minigame.tscn", "res://sources/minigames/parakeets/parakeets_minigame.tscn", "res://sources/minigames/monkeys/monkeys_minigame.tscn", "res://sources/minigames/caterpillar/caterpillar_minigame.tscn", "res://sources/minigames/frog/frog_minigame.tscn", "res://sources/minigames/turtles/turtles_minigame.tscn", "res://sources/minigames/ants/ants_minigame.tscn", "res://sources/minigames/penguin/penguin_minigame.tscn", "res://sources/minigames/boss/boss_minigame.tscn") -minigames_icons = Array[Texture]([ExtResource("6_p30hm"), ExtResource("5_h8c5w"), ExtResource("6_hekq6"), ExtResource("9_68su4"), ExtResource("16_prl1o"), ExtResource("10_5wvwc"), ExtResource("18_12pcf"), ExtResource("12_ohgqx"), ExtResource("20_ouafq"), ExtResource("16_5rwfp")]) +minigames_body_icons = Array[Texture]([ExtResource("jellyfish_body"), ExtResource("crab_body"), ExtResource("parakeet_body"), ExtResource("monkey_body"), ExtResource("caterpillar_body"), ExtResource("frog_body"), ExtResource("turtle_body"), ExtResource("ant_body"), ExtResource("penguin_body")]) +minigames_face_icons = Array[Texture]([ExtResource("jellyfish_face"), ExtResource("crab_face"), ExtResource("parakeet_face"), ExtResource("monkey_face"), ExtResource("caterpillar_face"), ExtResource("frog_face"), ExtResource("turtle_face"), ExtResource("ant_face"), ExtResource("penguin_face")]) [node name="RightAudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=941811110] stream = ExtResource("17_37f6y") @@ -199,17 +211,18 @@ layout_mode = 2 [node name="BossButtons" type="Control" parent="ScrollContainer" unique_id=1176317047] unique_name_in_owner = true layout_mode = 2 +mouse_filter = 2 -[node name="LockedLine" type="Line2D" parent="ScrollContainer" unique_id=1229207154] +[node name="LockedLine" type="Line2D" parent="." unique_id=1229207154] unique_name_in_owner = true width = 20.0 default_color = Color(0.356863, 0.356863, 0.356863, 1) -[node name="UnlockedLine" type="Line2D" parent="ScrollContainer" unique_id=931930346] +[node name="UnlockedLine" type="Line2D" parent="." unique_id=931930346] unique_name_in_owner = true width = 50.0 -[node name="LineParticles" type="GPUParticles2D" parent="ScrollContainer/UnlockedLine" unique_id=213294011] +[node name="LineParticles" type="GPUParticles2D" parent="UnlockedLine" unique_id=213294011] unique_name_in_owner = true z_index = 1 material = SubResource("CanvasItemMaterial_13bcn") @@ -218,27 +231,13 @@ scale = Vector2(0.4, 0.4) texture = ExtResource("25_00sy7") process_material = SubResource("ParticleProcessMaterial_3eofo") -[node name="LineAudioStreamPlayer" type="AudioStreamPlayer2D" parent="ScrollContainer/UnlockedLine/LineParticles" unique_id=1534832715] +[node name="LineAudioStreamPlayer" type="AudioStreamPlayer2D" parent="UnlockedLine/LineParticles" unique_id=1534832715] unique_name_in_owner = true stream = ExtResource("26_5g3l0") volume_db = -5.0 [node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1456876816] -[node name="MinigameBackgroundCenter" type="TextureRect" parent="CanvasLayer" unique_id=380724732] -unique_name_in_owner = true -visible = false -modulate = Color(0.109804, 0.14902, 0.384314, 1) -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -texture = ExtResource("21_r0a4h") -expand_mode = 1 -stretch_mode = 5 - [node name="MinigameSelection" type="Control" parent="CanvasLayer" unique_id=613163331] unique_name_in_owner = true visible = false @@ -253,121 +252,17 @@ grow_vertical = 2 pivot_offset = Vector2(1280, 900) mouse_filter = 2 -[node name="MinigameBackground1" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=405469610] +[node name="BackgroundRect" type="ColorRect" parent="CanvasLayer/MinigameSelection" unique_id=380724732] unique_name_in_owner = true -layout_mode = 0 -offset_right = 40.0 -offset_bottom = 40.0 -mouse_filter = 2 -texture = ExtResource("23_p1d10") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground1" unique_id=1383000761] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 704.0 -offset_top = 576.0 -offset_right = 960.0 -offset_bottom = 832.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground1/TextureRect" unique_id=1031123340 instance=ExtResource("33_5y3ye")] layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground1" unique_id=802836280] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground1/Area2D" unique_id=1785915721] -polygon = PackedVector2Array(1279, 61.6, 1284, 63.6, 1284, 901.8, 1280.8, 905, 1278.5, 905, 556, 1324.3, 554, 1323.2, 554, 1321.5, 513, 1244.5, 513, 1241.3, 489, 1185.4, 489, 1184.3, 467, 1114.3, 467, 1109, 459, 1080.3, 459, 1079, 458.1, 1066, 455, 1061.6, 455, 1060, 446, 1005.2, 446, 1004, 440, 930.1, 440, 865, 441.1, 865, 445.1, 801, 446.3, 801, 460.3, 713, 461.5, 713, 481.5, 638, 482.6, 638, 500.6, 586, 501.7, 586, 513, 562.5, 513, 561.5, 510.8, 557, 513.7, 557, 540.7, 501, 541.9, 501, 570.8, 450, 572.2, 450, 576, 446.2, 574.6, 444.5, 575.7, 442, 577, 442, 587, 429.3, 587, 425.5, 588.8, 422, 590, 422, 639, 357, 640.1, 357, 691.1, 301, 693.1, 301, 745.2, 252, 747.3, 252, 809.3, 204, 811.4, 204, 865.4, 169, 867.5, 169, 957.5, 124, 960.6, 124, 996, 111.6, 996, 111, 1001.3, 107, 1002.9, 107, 1022, 102.5, 1025.2, 99, 1026.8, 99, 1075.7, 85, 1077.2, 85, 1080, 85.5, 1110.7, 77, 1113.2, 77, 1115.6, 77.6, 1118.2, 75, 1119.7, 75, 1182.8, 65, 1184.8, 65, 1185.8, 66, 1204.8, 63, 1207.6, 63, 1209.2, 64.1, 1212.4, 62, 1214.5, 62, 1216.6, 63.1, 1252, 61.1, 1252, 60, 1279, 60) - -[node name="MinigameBackground2" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=1529070021] +[node name="WedgesContainer" type="Control" parent="CanvasLayer/MinigameSelection" unique_id=1010111213] unique_name_in_owner = true -layout_mode = 0 -offset_right = 2560.0 -offset_bottom = 1800.0 -mouse_filter = 2 -texture = ExtResource("24_30f83") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground2" unique_id=373021186] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 1600.0 -offset_top = 576.0 -offset_right = 1856.0 -offset_bottom = 832.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground2/TextureRect" unique_id=1160342672 instance=ExtResource("33_5y3ye")] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground2" unique_id=204471632] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground2/Area2D" unique_id=1948283316] -polygon = PackedVector2Array(1378, 65.1, 1378, 66.3, 1457, 78.3, 1457, 79.5, 1537, 99.4, 1537, 100.6, 1608, 125.6, 1608, 126.7, 1663, 151.7, 1663, 153, 1671.5, 159, 1673.3, 159, 1682, 161.5, 1682, 162.9, 1750, 202.9, 1750, 204, 1801, 240, 1801, 241.1, 1839, 272.1, 1839, 273.1, 1879, 310.1, 1879, 312.4, 1880.1, 314, 1885, 315.6, 1885, 318.2, 1936, 374.2, 1936, 376.3, 1983, 438.3, 1983, 439.5, 2026, 511.4, 2026, 515.5, 2044, 547.5, 2044, 548.6, 2045.7, 557, 2046.3, 557, 2061, 587.5, 2061, 590.6, 2082, 646.6, 2082, 651, 2082.7, 655, 2087, 661.4, 2087, 663, 2107, 744.8, 2107, 748, 2119, 835.9, 2119, 837, 2121, 923, 2120, 923, 2120, 955, 2118.8, 955, 2111.8, 1029, 2110.7, 1029, 2104.7, 1068, 2103.7, 1068, 2098.7, 1096, 2097.5, 1096, 2088, 1127.3, 2088, 1128.7, 2089.8, 1134, 2087.4, 1134, 2052.4, 1235, 2051.3, 1235, 2017.3, 1306, 2016.3, 1306, 2010.2, 1317, 2008.5, 1317, 2003, 1320.3, 2001, 1319.2, 2001, 1318.1, 1276, 902.2, 1276, 63.9, 1279, 61.9, 1279, 59.9) - -[node name="MinigameBackground3" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=433963142] -unique_name_in_owner = true -layout_mode = 0 -offset_right = 2560.0 -offset_bottom = 1800.0 -mouse_filter = 2 -texture = ExtResource("25_tyvq6") -script = ExtResource("28_kvgph") - -[node name="TextureRect" type="TextureRect" parent="CanvasLayer/MinigameSelection/MinigameBackground3" unique_id=1532680395] -material = ExtResource("22_cgp31") -custom_minimum_size = Vector2(256, 256) -layout_mode = 0 -offset_left = 1152.0 -offset_top = 1248.0 -offset_right = 1408.0 -offset_bottom = 1504.0 -size_flags_horizontal = 4 -size_flags_vertical = 4 -texture = ExtResource("10_5wvwc") -expand_mode = 1 -stretch_mode = 5 - -[node name="RightFX" parent="CanvasLayer/MinigameSelection/MinigameBackground3/TextureRect" unique_id=151107649 instance=ExtResource("33_5y3ye")] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 - -[node name="Area2D" type="Area2D" parent="CanvasLayer/MinigameSelection/MinigameBackground3" unique_id=1208926048] - -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="CanvasLayer/MinigameSelection/MinigameBackground3/Area2D" unique_id=890040811] -polygon = PackedVector2Array(1902, 1250.8, 1902, 1251.9, 2010.3, 1316.1, 2009.5, 1319, 2008.1, 1319, 1986.2, 1358, 1985, 1358, 1974, 1371.7, 1974, 1372.4, 1970.4, 1382, 1969, 1382, 1916, 1451, 1914.9, 1451, 1865.9, 1504, 1863.8, 1504, 1827.8, 1539, 1825.7, 1539, 1791.7, 1568, 1789.6, 1568, 1720.6, 1617, 1717.7, 1617, 1702.7, 1628, 1700.5, 1628, 1633.5, 1664, 1632.6, 1664, 1556.4, 1695, 1555.1, 1695, 1509, 1707.5, 1509, 1708.3, 1498.4, 1713, 1497.4, 1713, 1407.2, 1732, 1406.2, 1732, 1330.1, 1740, 1328, 1740, 1254, 1741, 1254, 1739.9, 1184, 1735.9, 1184, 1734.8, 1112, 1724.7, 1112, 1723.5, 1094.7, 1718, 1085, 1719.3, 1085, 1717.4, 1072.6, 1713, 1065, 1714.4, 1065, 1712.4, 1030.7, 1701, 1030.1, 1701, 1024, 1702.6, 1024, 1700.5, 1009, 1696.5, 1009, 1695, 1006.3, 1693, 994, 1691.8, 994, 1690.4, 969, 1681.4, 969, 1680.1, 964.3, 1677, 962.8, 1677, 961.5, 1678.4, 959, 1677.3, 959, 1676.4, 924, 1662.4, 924, 1661.3, 875, 1637.2, 875, 1636.1, 826, 1608.2, 826, 1607.1, 781, 1577.1, 781, 1576, 738, 1543, 738, 1541.9, 695, 1503.9, 695, 1502.8, 661, 1468.8, 661, 1466.7, 615, 1414.8, 615, 1412.7, 582, 1368.7, 582, 1365.6, 553.7, 1321.1, 554.8, 1319, 556, 1319, 560, 1314, 562.5, 1314, 619.4, 1279, 621.5, 1279, 1276, 897.9, 1276, 894.6) - -[node name="Branches" type="TextureRect" parent="CanvasLayer/MinigameSelection" unique_id=301987876] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -375,10 +270,16 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -texture = ExtResource("7_axgdc") + +[node name="LessonButtonOutline" type="Line2D" parent="CanvasLayer/MinigameSelection" unique_id=1010111290] +unique_name_in_owner = true +z_index = 11 +width = 12.0 +joint_mode = 2 [node name="LessonButton" parent="CanvasLayer/MinigameSelection" unique_id=843010913 instance=ExtResource("25_0ruwb")] unique_name_in_owner = true +z_index = 10 layout_mode = 1 anchors_preset = 8 anchor_left = 0.5 @@ -392,6 +293,25 @@ offset_bottom = 192.0 grow_horizontal = 2 grow_vertical = 2 +[node name="MovieIcon" type="TextureRect" parent="CanvasLayer/MinigameSelection/LessonButton" unique_id=1010111291] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -42.0 +offset_top = -94.0 +offset_right = 42.0 +offset_bottom = -10.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +texture = ExtResource("movie_icon") +expand_mode = 1 +stretch_mode = 6 + [node name="LessonButtonParticles" type="GPUParticles2D" parent="CanvasLayer/MinigameSelection/LessonButton" unique_id=1605639976] unique_name_in_owner = true z_index = 1 @@ -402,21 +322,6 @@ emitting = false texture = ExtResource("25_00sy7") process_material = SubResource("ParticleProcessMaterial_4gqpn") -[node name="MinigameBackground" type="TextureRect" parent="CanvasLayer" unique_id=2050203805] -unique_name_in_owner = true -visible = false -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 -mouse_filter = 2 -texture = ExtResource("20_elp7t") -expand_mode = 1 -stretch_mode = 5 - [node name="BackButton" parent="CanvasLayer" unique_id=1838227918 instance=ExtResource("29_back_button")] custom_minimum_size = Vector2(275, 275) offset_left = 50.0 @@ -474,7 +379,34 @@ grow_vertical = 2 unique_name_in_owner = true visible = false +[node name="CloudsLayer" type="CanvasLayer" parent="." unique_id=100000001] +layer = 0 + +[node name="Clouds" type="Node2D" parent="CloudsLayer" unique_id=100000002] +unique_name_in_owner = true +modulate = Color(1, 1, 1, 0.65) +script = ExtResource("45_clouds") +min_speed = 15.0 +max_speed = 45.0 +min_y = 60.0 +max_y = 300.0 +min_scale = 0.5 +max_scale = 1.2 +min_parallax_factor = 1.2 +max_parallax_factor = 1.7 +clouds_per_screen = 3 + +[node name="cloud_1" type="Sprite2D" parent="CloudsLayer/Clouds" unique_id=100000003] +texture = ExtResource("46_cloud1") + +[node name="cloud_2" type="Sprite2D" parent="CloudsLayer/Clouds" unique_id=100000004] +texture = ExtResource("47_cloud2") + +[node name="cloud_3" type="Sprite2D" parent="CloudsLayer/Clouds" unique_id=100000005] +texture = ExtResource("48_cloud3") + [connection signal="gui_input" from="ScrollContainer" to="." method="_on_scroll_container_gui_input"] +[connection signal="gui_input" from="CanvasLayer/MinigameSelection/BackgroundRect" to="." method="_on_background_rect_gui_input"] [connection signal="pressed" from="CanvasLayer/MinigameSelection/LessonButton" to="." method="_on_lesson_button_pressed"] [connection signal="button_down" from="CanvasLayer/BackButton" to="." method="_on_back_button_button_down"] [connection signal="button_up" from="CanvasLayer/BackButton" to="." method="_on_back_button_button_up"] diff --git a/sources/gardens/minigame_layout.gd b/sources/gardens/minigame_layout.gd deleted file mode 100644 index b5ee2bcb..00000000 --- a/sources/gardens/minigame_layout.gd +++ /dev/null @@ -1,23 +0,0 @@ -class_name MinigameLayout -extends TextureRect - -signal pressed() - -var is_disabled: bool = false - -@onready var icon: TextureRect = $TextureRect -@onready var area: Area2D = $Area2D -@onready var right_fx: RightFX = $TextureRect/RightFX - - -func _ready() -> void: - area.connect("input_event", _on_click) - - -func _on_click(_viewport: Node, event: InputEvent, _shape_idx: int) -> void: - if event.is_action_pressed("left_click") and not is_disabled: - pressed.emit() - - -func right() -> void: - right_fx.play() diff --git a/sources/gardens/minigame_layout.gd.uid b/sources/gardens/minigame_layout.gd.uid deleted file mode 100644 index 029ed474..00000000 --- a/sources/gardens/minigame_layout.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ddew42fnpmsx1 diff --git a/sources/gardens/minigame_wedge.gd b/sources/gardens/minigame_wedge.gd new file mode 100644 index 00000000..6ac03ff9 --- /dev/null +++ b/sources/gardens/minigame_wedge.gd @@ -0,0 +1,61 @@ +class_name MinigameWedge +extends Control + +signal pressed() + +const ICON_SIZE: Vector2 = Vector2(256, 256) +const GRAYSCALE_SHADER: Shader = preload("res://resources/shaders/grayscale.gdshader") + +var is_disabled: bool = false + +@onready var polygon: Polygon2D = $Polygon2D +@onready var area: Area2D = $Area2D +@onready var collision: CollisionPolygon2D = $Area2D/CollisionPolygon2D +@onready var icon_body_rect: TextureRect = $IconBodyRect +@onready var icon_face_rect: TextureRect = $IconFaceRect +@onready var right_fx: RightFX = $IconFaceRect/RightFX +@onready var wrong_fx: WrongFX = $IconFaceRect/WrongFX + + +func _ready() -> void: + area.input_event.connect(_on_click) + + +func configure( + wedge_polygon: PackedVector2Array, + icon_center: Vector2, + body_texture: Texture, + face_texture: Texture, + wedge_color: Color, + body_color: Color, + is_locked: bool, +) -> void: + polygon.polygon = wedge_polygon + polygon.color = wedge_color + collision.polygon = wedge_polygon + var icon_origin: Vector2 = icon_center - ICON_SIZE * 0.5 + icon_body_rect.position = icon_origin + icon_body_rect.texture = body_texture + icon_body_rect.modulate = body_color + icon_face_rect.position = icon_origin + icon_face_rect.texture = face_texture + # Desaturate the face when locked. + if is_locked: + var grayscale: ShaderMaterial = ShaderMaterial.new() + grayscale.shader = GRAYSCALE_SHADER + icon_face_rect.material = grayscale + else: + icon_face_rect.material = null + + +func right() -> void: + right_fx.play() + + +func wrong() -> void: + wrong_fx.play() + + +func _on_click(_viewport: Node, event: InputEvent, _shape_idx: int) -> void: + if event.is_action_pressed("left_click") and not is_disabled: + pressed.emit() diff --git a/sources/gardens/minigame_wedge.gd.uid b/sources/gardens/minigame_wedge.gd.uid new file mode 100644 index 00000000..8d05e1ef --- /dev/null +++ b/sources/gardens/minigame_wedge.gd.uid @@ -0,0 +1 @@ +uid://dh555xp8ebnb8 diff --git a/sources/gardens/minigame_wedge.tscn b/sources/gardens/minigame_wedge.tscn new file mode 100644 index 00000000..ffc06c07 --- /dev/null +++ b/sources/gardens/minigame_wedge.tscn @@ -0,0 +1,63 @@ +[gd_scene format=3 uid="uid://b1u0xkalulu01"] + +[ext_resource type="Script" uid="uid://dh555xp8ebnb8" path="res://sources/gardens/minigame_wedge.gd" id="1_wedge"] +[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="3_rightfx"] +[ext_resource type="PackedScene" uid="uid://dlmbxcgiv8tpr" path="res://sources/utils/fx/wrong.tscn" id="4_wrongfx"] + +[node name="MinigameWedge" type="Control" unique_id=1762693146] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +script = ExtResource("1_wedge") + +[node name="Polygon2D" type="Polygon2D" parent="." unique_id=1912619179] + +[node name="Area2D" type="Area2D" parent="." unique_id=870297940] + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Area2D" unique_id=1114106226] + +[node name="IconBodyRect" type="TextureRect" parent="." unique_id=2053672816] +custom_minimum_size = Vector2(256, 256) +layout_mode = 0 +offset_right = 256.0 +offset_bottom = 256.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="IconFaceRect" type="TextureRect" parent="." unique_id=2053672817] +custom_minimum_size = Vector2(256, 256) +layout_mode = 0 +offset_right = 256.0 +offset_bottom = 256.0 +size_flags_horizontal = 4 +size_flags_vertical = 4 +mouse_filter = 2 +expand_mode = 1 +stretch_mode = 5 + +[node name="RightFX" parent="IconFaceRect" unique_id=333957231 instance=ExtResource("3_rightfx")] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="WrongFX" parent="IconFaceRect" unique_id=333957232 instance=ExtResource("4_wrongfx")] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +grow_horizontal = 2 +grow_vertical = 2 diff --git a/sources/language_tool/gp_list.gd b/sources/language_tool/gp_list.gd index ad8c3f39..bde25539 100644 --- a/sources/language_tool/gp_list.gd +++ b/sources/language_tool/gp_list.gd @@ -38,7 +38,7 @@ func _on_plus_button_pressed() -> void: var element: GPListElement = element_scene.instantiate() element.grapheme = "" element.phoneme = "" - element.type = GPListElement.Type.Silent + element.type = GPListElement.Type.SILENT element.exception = false element.undo_redo = undo_redo element.delete_pressed.connect(_on_element_delete_pressed.bind(element)) diff --git a/sources/language_tool/gp_list_element.gd b/sources/language_tool/gp_list_element.gd index 45e65402..5ca45779 100644 --- a/sources/language_tool/gp_list_element.gd +++ b/sources/language_tool/gp_list_element.gd @@ -5,16 +5,18 @@ signal delete_pressed() signal validated() enum Type { - Silent, - Vowel, - Consonant, + SILENT, + VOWEL, + CONSONANT, } +const TYPE_LABELS: Array[String] = ["Silent", "Vowel", "Consonant"] + var grapheme: String = "": set = set_grapheme var phoneme: String = "": set = set_phoneme -var type: GPListElement.Type = Type.Silent: +var type: GPListElement.Type = Type.SILENT: set = set_type var exception: bool = false: set = set_exception @@ -55,7 +57,7 @@ func set_phoneme(p_phoneme: String) -> void: func set_type(p_type: Type) -> void: type = p_type if type_label: - type_label.text = Type.keys()[type] + type_label.text = TYPE_LABELS[type] if type_edit: type_edit.selected = type diff --git a/sources/language_tool/lesson_exercises.gd b/sources/language_tool/lesson_exercises.gd index d452d0e2..7fa3659b 100644 --- a/sources/language_tool/lesson_exercises.gd +++ b/sources/language_tool/lesson_exercises.gd @@ -15,7 +15,7 @@ func _ready() -> void: Database.db.query(query) if Database.db.query_result.is_empty(): Database.db.query("CREATE TABLE ExerciseTypes (ID INTEGER PRIMARY KEY ASC AUTOINCREMENT UNIQUE NOT NULL, Type TEXT NOT NULL)") - for exercise_name: String in Minigame.Type.keys(): + for exercise_name: String in Minigame.TYPE_NAMES: Database.db.query("SELECT * FROM ExerciseTypes WHERE Type = '%s'" % exercise_name) if Database.db.query_result.is_empty(): Database.db.insert_row("ExerciseTypes", diff --git a/sources/language_tool/word_list_element.gd b/sources/language_tool/word_list_element.gd index 28018967..0f9f95f9 100644 --- a/sources/language_tool/word_list_element.gd +++ b/sources/language_tool/word_list_element.gd @@ -246,11 +246,11 @@ func insert_in_database() -> void: if word != element[table_graph_column] or exception != element.Exception or reading != element.Reading or writing != element.Writing: Database.db.update_rows(table, "ID=%s" % id, {table_graph_column: word, "Exception": exception, "Reading": reading, "Writing": writing}) if " ".join(gp_ids) != element[sub_table + "IDs"]: - var gps_in_words_ids: Array[String] = Array((element[relational_table + "IDs"] as String).split(" ")) + var gps_in_words_ids: Array = Array((element[relational_table + "IDs"] as String).split(" ")) while gps_in_words_ids.size() > gp_ids.size(): Database.db.delete_rows(relational_table, "ID=%s" % int(gps_in_words_ids.pop_back() as String)) for index: int in range(gps_in_words_ids.size()): - var gps_in_words_id: int = int(gps_in_words_ids[index]) + var gps_in_words_id: int = int(gps_in_words_ids[index] as String) Database.db.update_rows(relational_table, "ID=%s" % gps_in_words_id, { table_graph_column + "ID": id, sub_table_id: gp_ids[index], diff --git a/sources/lesson_screen/lesson_button.gd b/sources/lesson_screen/lesson_button.gd index 9576b038..9593533b 100644 --- a/sources/lesson_screen/lesson_button.gd +++ b/sources/lesson_screen/lesson_button.gd @@ -1,25 +1,34 @@ class_name LessonButton extends TextureButton -@export_color_no_alpha var base_color: Color: - set = _set_base_color -@export_color_no_alpha var completed_color: Color: - set = _set_completed_color +const LOCKED_COLOR: Color = Color("cccccc") +const LOCKED_LABEL_COLOR: Color = Color("999999") +const DEFAULT_UNLOCKED_FILL_COLOR: Color = Color("176d78") +const DEFAULT_UNLOCKED_LABEL_COLOR: Color = Color("9be3ea") +const UNLOCKED_BORDER_COLOR: Color = Color("fbb03b") +const DEFAULT_COMPLETED_FILL_COLOR: Color = Color("9be3ea") +const DEFAULT_COMPLETED_LABEL_COLOR: Color = Color("0a555b") + @export var text: String: set = _set_text @export var completed: bool = false: set = _set_completed +var unlocked_fill_color: Color = DEFAULT_UNLOCKED_FILL_COLOR +var unlocked_label_color: Color = DEFAULT_UNLOCKED_LABEL_COLOR +var completed_fill_color: Color = DEFAULT_COMPLETED_FILL_COLOR +var completed_label_color: Color = DEFAULT_COMPLETED_LABEL_COLOR + @onready var center: TextureRect = %Center +@onready var border: TextureRect = %Border @onready var label: Label = %Label @onready var placeholder: TextureRect = %Placeholder @onready var right_fx: RightFX = %RightFX func _ready() -> void: - _set_base_color(base_color) - _set_completed_color(completed_color) _set_text(text) + _update_visual_state() func show_placeholder(is_shown: bool) -> void: @@ -32,16 +41,35 @@ func right() -> void: await right_fx.finished -func _set_base_color(color: Color) -> void: - base_color = color - if center and not completed: - center.modulate = color +func set_button_disabled(value: bool) -> void: + disabled = value + _update_visual_state() -func _set_completed_color(color: Color) -> void: - completed_color = color - if center and completed: - center.modulate = color +func set_garden_colors(p_unlocked: Color, p_unlocked_text: Color, p_completed: Color, p_completed_text: Color) -> void: + unlocked_fill_color = p_unlocked + unlocked_label_color = p_unlocked_text + completed_fill_color = p_completed + completed_label_color = p_completed_text + _update_visual_state() + + +func _update_visual_state() -> void: + if not center or not border or not label: + return + if disabled: + center.modulate = LOCKED_COLOR + border.visible = false + label.add_theme_color_override("font_color", LOCKED_LABEL_COLOR) + elif completed: + center.modulate = completed_fill_color + border.visible = false + label.add_theme_color_override("font_color", completed_label_color) + else: + center.modulate = unlocked_fill_color + border.visible = true + border.modulate = UNLOCKED_BORDER_COLOR + label.add_theme_color_override("font_color", unlocked_label_color) func _set_text(value: String) -> void: @@ -52,7 +80,4 @@ func _set_text(value: String) -> void: func _set_completed(value: bool) -> void: completed = value - if completed: - center.modulate = completed_color - else: - center.modulate = base_color + _update_visual_state() diff --git a/sources/lesson_screen/lesson_button.tscn b/sources/lesson_screen/lesson_button.tscn index c84cff58..396fe4f8 100644 --- a/sources/lesson_screen/lesson_button.tscn +++ b/sources/lesson_screen/lesson_button.tscn @@ -1,29 +1,25 @@ [gd_scene format=3 uid="uid://delcgui3v0eek"] -[ext_resource type="Texture2D" uid="uid://3iuuq06ovbos" path="res://assets/theme/button_normal_empty.svg" id="1_pdrhc"] -[ext_resource type="Texture2D" uid="uid://j7sffldhbunj" path="res://assets/theme/button_pressed_empty.svg" id="2_2g676"] -[ext_resource type="Texture2D" uid="uid://be30a3cmy0w46" path="res://assets/theme/button_focused_empty.svg" id="3_fksie"] -[ext_resource type="Texture2D" uid="uid://c0rumwiaimvxy" path="res://assets/theme/button_disabled.svg" id="4_4vg60"] [ext_resource type="Script" uid="uid://d1gj4en3e7b8b" path="res://sources/lesson_screen/lesson_button.gd" id="4_mbltp"] -[ext_resource type="Texture2D" uid="uid://dwk8xgv3xsmm0" path="res://assets/theme/button_center.svg" id="6_o0qkw"] +[ext_resource type="FontFile" uid="uid://bj2rpti6g24kk" path="res://assets/fonts/kalulu_mulish_bold.otf" id="4_t6rjb"] [ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="7_rtwam"] +[ext_resource type="Texture2D" uid="uid://cxjy5f7oyl8mq" path="res://assets/gardens/buttons/lesson_circle.png" id="lesson_circle"] [node name="LessonButton" type="TextureButton" unique_id=530361935] +self_modulate = Color(1, 1, 1, 0) z_index = 1 offset_right = 300.0 offset_bottom = 300.0 pivot_offset = Vector2(150, 150) size_flags_horizontal = 4 size_flags_vertical = 4 -texture_normal = ExtResource("1_pdrhc") -texture_pressed = ExtResource("2_2g676") -texture_hover = ExtResource("3_fksie") -texture_disabled = ExtResource("4_4vg60") -texture_focused = ExtResource("1_pdrhc") +texture_normal = ExtResource("lesson_circle") +texture_pressed = ExtResource("lesson_circle") +texture_hover = ExtResource("lesson_circle") +texture_disabled = ExtResource("lesson_circle") +texture_focused = ExtResource("lesson_circle") stretch_mode = 0 script = ExtResource("4_mbltp") -base_color = Color(0.109804, 0.14902, 0.384314, 1) -completed_color = Color(0.109804, 0.14902, 0.384314, 1) [node name="RightFX" parent="." unique_id=1485482935 instance=ExtResource("7_rtwam")] unique_name_in_owner = true @@ -37,6 +33,23 @@ anchor_bottom = 0.5 grow_horizontal = 2 grow_vertical = 2 +[node name="Border" type="TextureRect" parent="." unique_id=1026350138] +unique_name_in_owner = true +visible = false +show_behind_parent = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -15.0 +offset_top = -15.0 +offset_right = 15.0 +offset_bottom = 15.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("lesson_circle") +expand_mode = 1 + [node name="Center" type="TextureRect" parent="." unique_id=1026350137] unique_name_in_owner = true show_behind_parent = true @@ -46,7 +59,8 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("6_o0qkw") +texture = ExtResource("lesson_circle") +expand_mode = 1 [node name="Label" type="Label" parent="." unique_id=540958749] unique_name_in_owner = true @@ -60,9 +74,8 @@ offset_top = 8.0 grow_horizontal = 2 grow_vertical = 2 mouse_filter = 1 -theme_override_colors/font_outline_color = Color(0, 0, 0, 1) -theme_override_constants/outline_size = 10 -theme_override_font_sizes/font_size = 110 +theme_override_fonts/font = ExtResource("4_t6rjb") +theme_override_font_sizes/font_size = 88 horizontal_alignment = 1 vertical_alignment = 1 uppercase = true @@ -78,4 +91,5 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -texture = ExtResource("6_o0qkw") +texture = ExtResource("lesson_circle") +expand_mode = 1 diff --git a/sources/look_and_learn/look_and_learn.gd b/sources/look_and_learn/look_and_learn.gd index 5d521ac1..a84a0996 100644 --- a/sources/look_and_learn/look_and_learn.gd +++ b/sources/look_and_learn/look_and_learn.gd @@ -33,6 +33,7 @@ func _ready() -> void: Log.trace("LookAndLearn: Starting lesson %d" % lesson_nb) setup() await (OpeningCurtain as OpeningCurtainClass).open() + grapheme_particles.emitting = true func setup() -> void: @@ -159,7 +160,7 @@ func _back_to_gardens() -> void: Log.info("LookAndLearn: Returning to gardens for lesson %d" % lesson_nb) await (OpeningCurtain as OpeningCurtainClass).close() Gardens.transition_data = gardens_data - get_tree().change_scene_to_file("res://sources/gardens/gardens.tscn") + SceneLoader.change_scene("res://sources/gardens/gardens.tscn") func _on_back_button_pressed() -> void: diff --git a/sources/menus/device_selection/device_selection.gd b/sources/menus/device_selection/device_selection.gd index a8f23ddf..d2ed845c 100644 --- a/sources/menus/device_selection/device_selection.gd +++ b/sources/menus/device_selection/device_selection.gd @@ -20,7 +20,7 @@ func _refresh() -> void: for device: int in UserDataManager.teacher_settings.students.keys(): var button: DeviceButton = DEVICE_BUTTON_SCENE.instantiate() button.number = device - button.background_color = Globals.device_colors[device-1 % Globals.device_colors.size()] + button.background_color = Globals.device_colors[(device - 1) % Globals.device_colors.size()] container.add_child(button) button.pressed.connect(_device_button_pressed.bind(device)) OpeningCurtain.open() diff --git a/sources/menus/device_selection/device_selection.tscn b/sources/menus/device_selection/device_selection.tscn index 0ecac0c2..1b9bdfd3 100644 --- a/sources/menus/device_selection/device_selection.tscn +++ b/sources/menus/device_selection/device_selection.tscn @@ -17,15 +17,14 @@ layout_mode = 1 [node name="PanelContainer" type="PanelContainer" parent="." unique_id=268912689] layout_mode = 1 -anchors_preset = 8 +anchors_preset = 14 anchor_left = 0.5 -anchor_top = 0.5 anchor_right = 0.5 -anchor_bottom = 0.5 +anchor_bottom = 1.0 offset_left = -332.5 -offset_top = -1.0 +offset_top = 50.0 offset_right = 332.5 -offset_bottom = 1.0 +offset_bottom = -50.0 grow_horizontal = 2 grow_vertical = 2 theme_type_variation = &"PanelKaluluBig" @@ -48,7 +47,13 @@ text = "PICK_YOUR_DEVICE" horizontal_alignment = 1 vertical_alignment = 1 -[node name="GridContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer" unique_id=505066062] +[node name="ScrollContainer" type="ScrollContainer" parent="PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +horizontal_scroll_mode = 0 + +[node name="GridContainer" type="GridContainer" parent="PanelContainer/MarginContainer/VBoxContainer/ScrollContainer" unique_id=505066062] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 4 diff --git a/sources/menus/language_selection/language_check.gd b/sources/menus/language_selection/language_check.gd index 5f167350..a7b599f4 100644 --- a/sources/menus/language_selection/language_check.gd +++ b/sources/menus/language_selection/language_check.gd @@ -24,42 +24,38 @@ func _ready() -> void: UserDataManager.logout() _show_error(ERROR_MESSAGES[0]) return - if not teacher_settings.language or not teacher_settings.server_language_validated: - Log.trace("LanguageCheck: TeacherSettings needs to be updated") - if not await ServerManager.check_internet_access(): - Log.trace("LanguageCheck: No internet access") - try_with_local_data() - return - else: - Log.trace("LanguageCheck: Internet access confirmed. Asking server for user language") - var res: Dictionary = await ServerManager.get_user_language() - if not res.has("code") or res.code != 200 or not res.has("body") or not (res.body as Dictionary).has("language"): - Log.trace("LanguageCheck: Server answer is not usable") - try_with_local_data() + Log.trace("LanguageCheck: Re-validating language with server on every login") + if not await ServerManager.check_internet_access(): + Log.trace("LanguageCheck: No internet access") + try_with_local_data() + return + Log.trace("LanguageCheck: Internet access confirmed. Asking server for user language") + var res: Dictionary = await ServerManager.get_user_language() + if not res.has("code") or res.code != 200 or not res.has("body") or not (res.body as Dictionary).has("language"): + Log.trace("LanguageCheck: Server answer is not usable") + try_with_local_data() + return + var server_language: Variant = (res.body as Dictionary).language + if server_language is String and server_language in Utils.SUPPORTED_LOCALES.keys(): + Log.trace("LanguageCheck: Language validated by server") + teacher_settings.language = server_language + teacher_settings.server_language_validated = true + UserDataManager.set_language(server_language as String, true) + else: + Log.warn("LanguageCheck: Language received from server is invalid or not defined") + var local_language: String = teacher_settings.language + if not local_language in Utils.SUPPORTED_LOCALES.keys(): + if not device_language in Utils.SUPPORTED_LOCALES.keys(): + UserDataManager.logout() + _show_error(ERROR_MESSAGES[2]) return - else: - var server_language: Variant = (res.body as Dictionary).language - if server_language is String and server_language in Utils.SUPPORTED_LOCALES.keys(): - teacher_settings.language = server_language - Log.trace("LanguageCheck: Language validated by server") - teacher_settings.server_language_validated = true - UserDataManager.set_language(server_language as String, true) - else: - Log.trace("LanguageCheck: Language received from server is invalid or not defined") - var local_language: String = teacher_settings.language - if not local_language in Utils.SUPPORTED_LOCALES.keys(): - if not device_language in Utils.SUPPORTED_LOCALES.keys(): - UserDataManager.logout() - _show_error(ERROR_MESSAGES[2]) - return - else: - local_language = device_language - res = await ServerManager.set_user_language(local_language) - if res.has("code") and res.code == 200: - UserDataManager.set_language(local_language, true) - else: - UserDataManager.set_language(local_language, false) - + local_language = device_language + res = await ServerManager.set_user_language(local_language) + if res.has("code") and res.code == 200: + UserDataManager.set_language(local_language, true) + else: + UserDataManager.set_language(local_language, false) + UserDataManager.save_all() go_to_package_download() diff --git a/sources/menus/language_selection/package_downloader.gd b/sources/menus/language_selection/package_downloader.gd index 7bf6a20a..c2c5dabf 100644 --- a/sources/menus/language_selection/package_downloader.gd +++ b/sources/menus/language_selection/package_downloader.gd @@ -1,15 +1,29 @@ class_name PackageDownloader extends Control +enum DownloadError { + DISCONNECTED, + NO_INTERNET, + DOWNLOAD_FAILED, + INVALID_LOCAL_PACK, + EXTRACTION_FAILED, + INVALID_PACKAGE, + REPLACE_FAILED, +} + const MAIN_MENU_SCENE_PATH: String = "res://sources/menus/main/main_menu.tscn" const DEVICE_SELECTION_SCENE_PATH: String = "res://sources/menus/device_selection/device_selection.tscn" const LOGIN_SCENE_PATH: String = "res://sources/menus/login/login.tscn" const USER_LANGUAGE_RESOURCES_PATH: String = "user://language_resources" +# Translation key shown in the error popup for each DownloadError value const ERROR_MESSAGES: Array[String] = [ "DISCONNECTED_ERROR", "NO_INTERNET_ACCESS", "ERROR_DOWNLOADING", "INVALID_LANGUAGE_DIRECTORY", + "ERROR_EXTRACTING_PACKAGE", + "ERROR_INVALID_PACKAGE", + "ERROR_REPLACING_PACKAGE", ] var language: String @@ -41,7 +55,7 @@ func _ready() -> void: var teacher_settings: TeacherSettings = UserDataManager.teacher_settings if not teacher_settings: UserDataManager.logout() - _show_error(0) + _show_error(DownloadError.DISCONNECTED) return if teacher_settings.server_language_validated: @@ -59,10 +73,10 @@ func _ready() -> void: _go_to_next_scene() else: Log.warn("PackageDownloader: Offline and language directory %s is invalid" % current_language_path) - _show_error(3) # Error downloading + _show_error(DownloadError.INVALID_LOCAL_PACK) else: Log.warn("PackageDownloader: Offline with no language directory available") - _show_error(1) # No internet access + _show_error(DownloadError.NO_INTERNET) return # Gets the info of the language pack on the server @@ -75,12 +89,12 @@ func _ready() -> void: elif res.code == 401: UserDataManager.logout() Log.warn("PackageDownloader: Authentication failed while fetching language pack URL") - _show_error(0) # Disconnected error + _show_error(DownloadError.DISCONNECTED) return else: UserDataManager.logout() Log.warn("PackageDownloader: Unexpected response %d while fetching language pack URL" % res.code) - _show_error(2) # Error downloading + _show_error(DownloadError.DOWNLOAD_FAILED) return # If the language pack is not already downloaded or an update is needed @@ -97,16 +111,16 @@ func _ready() -> void: # Create the language_resources folder if not DirAccess.dir_exists_absolute(USER_LANGUAGE_RESOURCES_PATH): DirAccess.make_dir_recursive_absolute(USER_LANGUAGE_RESOURCES_PATH) - - # Delete the files from old language pack - if DirAccess.dir_exists_absolute(current_language_path): - Log.trace("PackageDownloader: Cleaning existing language directory at %s" % current_language_path) - Utils.clean_dir(current_language_path) - - # Download the pack + + # Download the pack. The previous pack is kept on disk so the app can + # still run offline if the download fails; it is only removed during + # extraction, once the new pack has been fully downloaded. http_request.set_download_file(USER_LANGUAGE_RESOURCES_PATH.path_join(language + ".zip")) Log.trace("PackageDownloader: Downloading pack from %s" % res.body.url) - http_request.request(res.body.url as String) + var request_error: Error = http_request.request(res.body.url as String) + if request_error != OK: + Log.error("PackageDownloader: Cannot start language pack download: %s" % error_string(request_error)) + _show_error(DownloadError.DOWNLOAD_FAILED) else: download_bar.value = 1 extract_bar.value = 1 @@ -152,6 +166,7 @@ func _copy_data(this: PackageDownloader) -> void: # Check if a zip exists for the complete locale if not FileAccess.file_exists(USER_LANGUAGE_RESOURCES_PATH.path_join(language + ".zip")): Log.warn("PackageDownloader: No downloaded archive found for %s" % language) + this.call_thread_safe("_show_error", DownloadError.EXTRACTION_FAILED) return Log.trace("PackageDownloader: Extracting downloaded package") @@ -175,33 +190,56 @@ func _copy_data(this: PackageDownloader) -> void: mutex.unlock() ) - # Cleanup previous files - if DirAccess.dir_exists_absolute(current_language_path): - Log.trace("PackageDownloader: Removing existing language directory before extraction") - Utils.delete_directory_recursive(ProjectSettings.globalize_path(current_language_path)) - - # Extract the archive - var subfolder: String = unzipper.extract(language_zip_path, USER_LANGUAGE_RESOURCES_PATH, false) + # Extract to a temporary directory so the current pack stays usable if + # the extraction fails or is interrupted + var temp_extract_path: String = USER_LANGUAGE_RESOURCES_PATH.path_join(language + "_tmp") + if DirAccess.dir_exists_absolute(temp_extract_path): + Utils.delete_directory_recursive(ProjectSettings.globalize_path(temp_extract_path)) + + var subfolder: String = unzipper.extract(language_zip_path, temp_extract_path, false) if subfolder == "": Log.error("PackageDownloader: Extraction failed for %s" % language_zip_path) + this.call_thread_safe("_show_error", DownloadError.EXTRACTION_FAILED) return - - # Move the data to the locale folder of the user - var error: Error = DirAccess.rename_absolute(USER_LANGUAGE_RESOURCES_PATH.path_join(subfolder), current_language_path) + + # Check the new pack before replacing the current one + var new_pack_path: String = temp_extract_path.path_join(subfolder) + if not is_language_directory_valid(new_pack_path): + Log.error("PackageDownloader: Extracted package at %s is invalid, keeping the current language pack" % new_pack_path) + Utils.delete_directory_recursive(ProjectSettings.globalize_path(temp_extract_path)) + DirAccess.remove_absolute(language_zip_path) + this.call_thread_safe("_show_error", DownloadError.INVALID_PACKAGE) + return + + # Replace the previous pack, now that the new one is fully extracted + if DirAccess.dir_exists_absolute(current_language_path): + Log.trace("PackageDownloader: Removing previous language directory") + Utils.delete_directory_recursive(ProjectSettings.globalize_path(current_language_path)) + if DirAccess.dir_exists_absolute(current_language_path): + # Keep the temporary directory so the new pack is not lost + Log.error("PackageDownloader: Cannot remove the previous language directory, aborting swap") + this.call_thread_safe("_show_error", DownloadError.REPLACE_FAILED) + return + + var error: Error = DirAccess.rename_absolute(new_pack_path, current_language_path) if error != OK: - Log.error("PackageDownloader: Error " + error_string(error) + " while renaming folder from %s to %s" % [USER_LANGUAGE_RESOURCES_PATH.path_join(subfolder), current_language_path]) - else: - Log.trace("PackageDownloader: Package extracted to %s" % current_language_path) - + # Keep the temporary directory so the data is not lost; the next + # launch will detect the missing pack and download it again + Log.error("PackageDownloader: Error " + error_string(error) + " while renaming folder from %s to %s" % [new_pack_path, current_language_path]) + this.call_thread_safe("_show_error", DownloadError.REPLACE_FAILED) + return + Log.trace("PackageDownloader: Package extracted to %s" % current_language_path) + # Cleanup unnecessary files + Utils.delete_directory_recursive(ProjectSettings.globalize_path(temp_extract_path)) DirAccess.remove_absolute(language_zip_path) Log.trace("PackageDownloader: Removed temporary archive %s" % language_zip_path) - + # Go to main menu this.call_thread_safe("_go_to_next_scene") -func _show_error(error: int) -> void: +func _show_error(error: DownloadError) -> void: Log.warn("PackageDownloader: Displaying error %d (%s)" % [error, ERROR_MESSAGES[error]]) error_popup.content_text = ERROR_MESSAGES[error] error_popup.show() diff --git a/sources/menus/login/login.gd b/sources/menus/login/login.gd index 40cf922a..29f41354 100644 --- a/sources/menus/login/login.gd +++ b/sources/menus/login/login.gd @@ -2,7 +2,7 @@ extends Control const TEACHER_PASSWORD: String = "42" const BACK_SCENE_PATH: String = "res://sources/menus/main/main_menu.tscn" -const NEXT_SCENE: PackedScene = preload("res://sources/gardens/gardens.tscn") +const NEXT_SCENE_PATH: String = "res://sources/gardens/gardens.tscn" const TEACHER_SCENE_PATH: String = "res://sources/menus/settings/teacher_settings.tscn" const DEVELOPER_SCENE_PATH: String = "res://sources/menus/settings/developer_settings.tscn" const PACKAGE_LOADER_SCENE_PATH: String = "res://sources/menus/language_selection/package_downloader.tscn" @@ -63,11 +63,17 @@ func _on_code_keyboard_password_entered(password: String) -> void: var login_success: bool = UserDataManager.login_student(password) Log.info("LoginScreen: Login attempt for student code %s returned %s" % [password, str(login_success)]) kalulu_button.hide() + if not login_success: + # The synchronization above may have deleted or moved the student + Log.warn("LoginScreen: Login failed for student code %s after synchronization" % password) + await kalulu.play_kalulu_speech(wrong_password_speech) + keyboard.reset_password() + kalulu_button.show() + return await kalulu.play_kalulu_speech(right_password_speech) await OpeningCurtain.close() Log.trace("LoginScreen: Start loading next scene") - get_tree().change_scene_to_packed(NEXT_SCENE) - Log.trace("LoginScreen: End loading next scene") + SceneLoader.change_scene(NEXT_SCENE_PATH) else: Log.warn("LoginScreen: Unknown student code entered (length=%d)" % password.length()) kalulu_button.hide() diff --git a/sources/menus/login/login.tscn b/sources/menus/login/login.tscn index b3669b8d..c1167a30 100644 --- a/sources/menus/login/login.tscn +++ b/sources/menus/login/login.tscn @@ -92,6 +92,7 @@ mouse_filter = 2 [node name="BuildVersionValue" type="Label" parent="InterfaceLeft/Container" unique_id=758975831] unique_name_in_owner = true +custom_minimum_size = Vector2(0, 120) layout_mode = 2 mouse_filter = 0 theme_override_font_sizes/font_size = 30 diff --git a/sources/menus/main/login.gd b/sources/menus/main/login.gd index 4b5e559f..de65f087 100644 --- a/sources/menus/main/login.gd +++ b/sources/menus/main/login.gd @@ -40,7 +40,7 @@ func _on_validate_button_pressed() -> void: if not validator.validate(): Log.info("Login: Validation failed for email %s" % email_field.text) return - + # Request server for login Log.info("Login: Sending login request for email %s" % email_field.text) var res: Dictionary = await ServerManager.login(email_field.text, password_field.text) @@ -52,12 +52,46 @@ func _on_validate_button_pressed() -> void: logged_in.emit() else: Log.info("Login: UserDataManager rejected server response during login") - login_message.show() - reset_password_button.show() + _show_login_error("LOGIN_SERVER_ERROR") else: Log.info("Login: Server responded with code %d for login attempt with email %s" % [res.code, email_field.text]) - login_message.show() + _show_login_error(_translation_key_for_error(res)) + + +func _show_login_error(translation_key: String) -> void: + login_message.text = translation_key + login_message.show() + # Offer password reset only when the email exists and the password is wrong — + # resetting is useless for any other failure (unknown account, network, server…). + if translation_key == "LOGIN_WRONG_PASSWORD": + reset_password_button.disabled = false reset_password_button.show() + else: + reset_password_button.hide() + + +func _translation_key_for_error(res: Dictionary) -> String: + # Network failure: no HTTP response received (code stays 0 in ServerManager). + if res.code == 0: + return "LOGIN_NETWORK_ERROR" + + var body: Dictionary = (res.body as Dictionary) if res.body is Dictionary else {} + var error_code: String = str(body.get("error_code", "")) + match error_code: + "USER_NOT_FOUND": + return "LOGIN_USER_NOT_FOUND" + "INVALID_PASSWORD": + return "LOGIN_WRONG_PASSWORD" + "MISSING_CREDENTIALS": + return "LOGIN_MISSING_CREDENTIALS" + "SERVER_ERROR": + return "LOGIN_SERVER_ERROR" + "BAD_REQUEST": + return "LOGIN_SERVER_ERROR" + + if res.code >= 500: + return "LOGIN_SERVER_ERROR" + return "INVALID_EMAIL_OR_PASSWORD" func _on_reset_password_button_pressed() -> void: diff --git a/sources/menus/main/main_menu.gd b/sources/menus/main/main_menu.gd index 22edead1..b340118e 100644 --- a/sources/menus/main/main_menu.gd +++ b/sources/menus/main/main_menu.gd @@ -11,6 +11,7 @@ var dev_click_count: int = 0 var dev_last_click_time: float = 0.0 @onready var version_label: Label = $Informations/BuildVersionValue +@onready var version_click_area: Control = $Informations/VersionClickArea @onready var teacher_label: Label = $Informations/TeacherValue @onready var device_id_label: Label = $Informations/DeviceIDValue @onready var kalulu: KALULU = $Kalulu @@ -25,7 +26,7 @@ func _ready() -> void: version_label.text = Utils.get_application_version_with_code() teacher_label.text = UserDataManager.get_device_settings().teacher device_id_label.text = str(UserDataManager.get_device_settings().device_id) - version_label.gui_input.connect(_on_version_label_gui_input) + version_click_area.gui_input.connect(_on_version_label_gui_input) OpeningCurtain.open() diff --git a/sources/menus/main/main_menu.tscn b/sources/menus/main/main_menu.tscn index 99b1006b..a086b475 100644 --- a/sources/menus/main/main_menu.tscn +++ b/sources/menus/main/main_menu.tscn @@ -395,11 +395,19 @@ layout_mode = 1 offset_left = 410.0 offset_right = 560.0 offset_bottom = 56.0 -mouse_filter = 0 theme_override_font_sizes/font_size = 30 text = "?" vertical_alignment = 1 +[node name="VersionClickArea" type="Control" parent="Informations" unique_id=1005725962] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 0 +offset_left = 270.0 +offset_top = -80.0 +offset_right = 620.0 +offset_bottom = 56.0 + [node name="TeacherTitle" type="Label" parent="Informations" unique_id=102169017] custom_minimum_size = Vector2(400, 0) layout_mode = 0 diff --git a/sources/menus/register/register.gd b/sources/menus/register/register.gd index 19a5a5b1..370306e8 100644 --- a/sources/menus/register/register.gd +++ b/sources/menus/register/register.gd @@ -74,10 +74,10 @@ func _on_step_completed(step: Step) -> void: "type": # Adds teacher or parent steps _remove_future_steps() - if register_data.account_type == TeacherSettings.AccountType.Teacher: + if register_data.account_type == TeacherSettings.AccountType.TEACHER: for scene: PackedScene in teacher_steps: current_steps.append(scene.instantiate()) - elif register_data.account_type == TeacherSettings.AccountType.Parent: + elif register_data.account_type == TeacherSettings.AccountType.PARENT: for scene: PackedScene in parent_steps: current_steps.append(scene.instantiate()) progress_bar.max_value = current_steps.size() + 3 diff --git a/sources/menus/register/steps/account_type_step.gd b/sources/menus/register/steps/account_type_step.gd index 41fc30da..b28f8b4f 100644 --- a/sources/menus/register/steps/account_type_step.gd +++ b/sources/menus/register/steps/account_type_step.gd @@ -14,8 +14,8 @@ func _ready() -> void: func _on_next() -> bool: var register_data: TeacherSettings = data as TeacherSettings if register_data: - if register_data.account_type == TeacherSettings.AccountType.Parent: - register_data.education_method = TeacherSettings.EducationMethod.AppOnly + if register_data.account_type == TeacherSettings.AccountType.PARENT: + register_data.education_method = TeacherSettings.EducationMethod.APP_ONLY Log.info("Register/AccountTypeStep: selected account type = %s" % TeacherSettings.AccountType.keys()[register_data.account_type]) else: Log.warn("Register/AccountTypeStep: cannot continue because TeacherSettings data is missing") diff --git a/sources/menus/register/steps/base_step.tscn b/sources/menus/register/steps/base_step.tscn index d37bf32e..e95d24a8 100644 --- a/sources/menus/register/steps/base_step.tscn +++ b/sources/menus/register/steps/base_step.tscn @@ -2,7 +2,7 @@ [ext_resource type="Script" uid="uid://ddg138yuagx4i" path="res://sources/menus/register/steps/base_step.gd" id="1_02ocl"] [ext_resource type="Texture2D" uid="uid://d1tsqdom1rra1" path="res://assets/theme/arrow_back.svg" id="2_41tvo"] -[ext_resource type="Script" uid="uid://ddmyah1o42hwp" path="res://addons/godot-form-validator/form_validator.gd" id="2_nw61e"] +[ext_resource type="Script" uid="uid://bu80rel3g62k2" path="res://addons/godot-form-validator/form_validator.gd" id="2_nw61e"] [ext_resource type="Texture2D" uid="uid://doql1x228r1bv" path="res://assets/look_and_learn/arrow.svg" id="3_17uns"] [ext_resource type="Script" uid="uid://b11owjubqe3iw" path="res://sources/utils/binder/form_binder.gd" id="3_mk32l"] [ext_resource type="Texture2D" uid="uid://d3rhl050u0ahl" path="res://assets/menus/login/password_background.png" id="4_h32tf"] @@ -120,7 +120,6 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 script = ExtResource("2_nw61e") -validation_method = 0 [node name="FormBinder" type="Control" parent="FormValidator" unique_id=207335793] unique_name_in_owner = true diff --git a/sources/menus/register/steps/recap_step.gd b/sources/menus/register/steps/recap_step.gd index 551a8ab4..d8ae2c88 100644 --- a/sources/menus/register/steps/recap_step.gd +++ b/sources/menus/register/steps/recap_step.gd @@ -22,7 +22,7 @@ func on_enter() -> void: email.text = tr("SUMMARY_EMAIL").format({"mail": teacher_settings.email}) account_type.text = tr("SUMMARY_TYPE").format({"type": tr((TeacherSettings.AccountType.keys()[teacher_settings.account_type] as String).to_upper())}) - if teacher_settings.account_type == TeacherSettings.AccountType.Teacher: + if teacher_settings.account_type == TeacherSettings.AccountType.TEACHER: education_method.text = tr("SUMMARY_METHOD").format({"method": tr((TeacherSettings.EducationMethod.keys()[teacher_settings.education_method] as String).to_upper())}) education_method.show() @@ -41,7 +41,7 @@ func on_enter() -> void: for device: int in teacher_settings.students.keys(): var device_recap: DeviceRecap = DEVICE_RECAP_SCENE.instantiate() - if teacher_settings.account_type == TeacherSettings.AccountType.Teacher: + if teacher_settings.account_type == TeacherSettings.AccountType.TEACHER: device_recap.title = tr("DEVICE_NUMBER").format({"number": device}) else: device_recap.title = tr("PLAYERS") diff --git a/sources/menus/register/steps/teacher/method_step.gd b/sources/menus/register/steps/teacher/method_step.gd index abbb8cd2..789dfa11 100644 --- a/sources/menus/register/steps/teacher/method_step.gd +++ b/sources/menus/register/steps/teacher/method_step.gd @@ -13,8 +13,8 @@ func _ready() -> void: func _on_next() -> bool: var register_data: TeacherSettings = data as TeacherSettings if register_data: - if register_data.account_type == TeacherSettings.AccountType.Parent: - register_data.education_method = TeacherSettings.EducationMethod.AppOnly + if register_data.account_type == TeacherSettings.AccountType.PARENT: + register_data.education_method = TeacherSettings.EducationMethod.APP_ONLY else: return false return true diff --git a/sources/menus/register/steps/teacher/method_step.tscn b/sources/menus/register/steps/teacher/method_step.tscn index 8300ca7d..1d5054c8 100644 --- a/sources/menus/register/steps/teacher/method_step.tscn +++ b/sources/menus/register/steps/teacher/method_step.tscn @@ -1,13 +1,13 @@ [gd_scene format=3 uid="uid://buhnx0oblueuq"] [ext_resource type="PackedScene" uid="uid://bxd3i06rqpxf0" path="res://sources/menus/register/steps/base_step.tscn" id="1_ksrhk"] -[ext_resource type="Script" uid="uid://dg4qit8mffvjh" path="res://addons/godot-form-validator/control_validator.gd" id="2_03dua"] +[ext_resource type="Script" uid="uid://ctfu2lhk6xaad" path="res://addons/godot-form-validator/control_validator.gd" id="2_03dua"] [ext_resource type="Script" uid="uid://ugsjyxqh1s5h" path="res://sources/menus/register/steps/teacher/method_step.gd" id="2_onyn6"] [ext_resource type="Script" uid="uid://dv82313fptjgb" path="res://sources/ui/tr_item_list.gd" id="2_qrbn1"] -[ext_resource type="Script" uid="uid://dw5aercmfe4" path="res://addons/godot-form-validator/rules/required_rule.gd" id="3_qewnl"] +[ext_resource type="Script" uid="uid://btw6a2qw2xnje" path="res://addons/godot-form-validator/rules/required_rule.gd" id="3_qewnl"] [ext_resource type="Script" uid="uid://7uwoocpe7ieu" path="res://sources/utils/binder/control_binder.gd" id="4_1k1yt"] [ext_resource type="Script" uid="uid://83q48kwp3p6p" path="res://sources/menus/register/steps/validation/item_list_validator.gd" id="4_rimto"] -[ext_resource type="Script" uid="uid://dg17cfvs2w257" path="res://addons/godot-form-validator/rules/validator_rule.gd" id="4_wmpac"] +[ext_resource type="Script" uid="uid://dlg1muqj8qwau" path="res://addons/godot-form-validator/rules/validator_rule.gd" id="4_wmpac"] [ext_resource type="LabelSettings" uid="uid://ohvlqccl2oog" path="res://resources/themes/error_label_settings.tres" id="6_sf33v"] [sub_resource type="Resource" id="Resource_kw8sn"] @@ -16,7 +16,9 @@ fail_message = "A value is required." [sub_resource type="Resource" id="Resource_ar6ux"] script = ExtResource("4_rimto") +validation_order = 1 validation_method = 1 +skip_validation = false rules = Array[ExtResource("4_wmpac")]([SubResource("Resource_kw8sn")]) [node name="MethodStep" unique_id=304348596 instance=ExtResource("1_ksrhk")] diff --git a/sources/menus/settings/developer_settings.gd b/sources/menus/settings/developer_settings.gd index 7e04af94..138adead 100644 --- a/sources/menus/settings/developer_settings.gd +++ b/sources/menus/settings/developer_settings.gd @@ -3,6 +3,9 @@ extends Control const LOG_LEVEL_ELEMENT: PackedScene = preload("res://sources/menus/settings/log_level_element.tscn") const CLEAR_LOCAL_DATA_CONFIRMATIONS: int = 5 +const ZOOM_MIN: float = 1.0 +const ZOOM_MAX: float = 3.0 +const ZOOM_STEP_WHEEL: float = 0.1 static var return_path: String = "res://sources/menus/main/main_menu.tscn" @@ -12,6 +15,8 @@ var loglevel_regex: RegEx var clear_local_data_confirmations: int = 0 var showing_previous_session_logs: bool = false var previous_session_logs: PackedStringArray = [] +var zoom_level: float = 1.0 + @onready var slider: HSlider = $VBoxContainer/Controls/LineCountSlider @onready var slider_label: Label = $VBoxContainer/Controls/SliderLabel @@ -127,6 +132,37 @@ func _on_filters_changed(checked: bool, index: int) -> void: _update_log_text() +func _input(event: InputEvent) -> void: + # Pinch to zoom on mobile + if event is InputEventMagnifyGesture: + var magnify_event: InputEventMagnifyGesture = event as InputEventMagnifyGesture + var new_zoom: float = clampf(zoom_level * magnify_event.factor, ZOOM_MIN, ZOOM_MAX) + _apply_zoom(new_zoom, magnify_event.position) + get_viewport().set_input_as_handled() + # Mouse wheel zoom on desktop + elif event is InputEventMouseButton: + var mouse_event: InputEventMouseButton = event as InputEventMouseButton + if mouse_event.pressed: + var new_zoom: float = zoom_level + if mouse_event.button_index == MOUSE_BUTTON_WHEEL_UP: + new_zoom = clampf(zoom_level + ZOOM_STEP_WHEEL, ZOOM_MIN, ZOOM_MAX) + elif mouse_event.button_index == MOUSE_BUTTON_WHEEL_DOWN: + new_zoom = clampf(zoom_level - ZOOM_STEP_WHEEL, ZOOM_MIN, ZOOM_MAX) + if new_zoom != zoom_level: + _apply_zoom(new_zoom, mouse_event.position) + get_viewport().set_input_as_handled() + + +func _apply_zoom(new_zoom: float, screen_pos: Vector2) -> void: + # Convert screen position to local (pre-scale) coordinates + var local_pos: Vector2 = (screen_pos - pivot_offset) / zoom_level + pivot_offset + # Shift the pivot so the point under the gesture/cursor stays fixed on screen + if not is_equal_approx(new_zoom, 1.0): + pivot_offset = (screen_pos - local_pos * new_zoom) / (1.0 - new_zoom) + zoom_level = new_zoom + scale = Vector2(zoom_level, zoom_level) + + func _on_back_button_pressed() -> void: await OpeningCurtain.close() if return_path == "": diff --git a/sources/menus/settings/developer_settings.tscn b/sources/menus/settings/developer_settings.tscn index a02255c4..ad21cd28 100644 --- a/sources/menus/settings/developer_settings.tscn +++ b/sources/menus/settings/developer_settings.tscn @@ -41,8 +41,8 @@ layout_mode = 2 theme_override_constants/separation = 20 [node name="BackButton" type="TextureButton" parent="InterfaceLeft/Container" unique_id=1761957378] +custom_minimum_size = Vector2(0, 350) layout_mode = 2 -size_flags_vertical = 3 texture_normal = ExtResource("2_utgug") texture_pressed = ExtResource("3_dttok") texture_disabled = ExtResource("4_bsu7d") diff --git a/sources/menus/settings/lesson_unlock.gd b/sources/menus/settings/lesson_unlock.gd index 1e270a93..82d8b02d 100644 --- a/sources/menus/settings/lesson_unlock.gd +++ b/sources/menus/settings/lesson_unlock.gd @@ -23,7 +23,7 @@ func _ready() -> void: exercise_option_button_1.add_item(tr(status)) exercise_option_button_2.add_item(tr(status)) exercise_option_button_3.add_item(tr(status)) - + reload() @@ -45,77 +45,76 @@ func reload() -> void: func _set_lesson_number(value: int) -> void: lesson_number = value - + if not lesson_label: return - + lesson_label.text = str(lesson_number) - + look_and_learn_option_button.select(unlocks[lesson_number]["look_and_learn"] as int) - exercise_option_button_1.select(unlocks[lesson_number]["games"][0] as int) - exercise_option_button_2.select(unlocks[lesson_number]["games"][1] as int) - exercise_option_button_3.select(unlocks[lesson_number]["games"][2] as int) + # A lesson can have 1–3 minigames, so only populate the buttons that map to a + # real game and disable the surplus ones (the grid keeps all three cells). + var games: Array = unlocks[lesson_number]["games"] + var exercise_buttons: Array[OptionButton] = [exercise_option_button_1, exercise_option_button_2, exercise_option_button_3] + for index: int in range(exercise_buttons.size()): + var button: OptionButton = exercise_buttons[index] + if index < games.size(): + button.disabled = false + button.select(games[index] as int) + else: + button.disabled = true + button.select(-1) func _set_lesson_gps(value: String) -> void: lesson_gps = value if not gps_label: return - + gps_label.text = value func _on_look_and_learn_option_button_item_selected(index: int) -> void: unlocks[lesson_number]["look_and_learn"] = index - - if index == StudentProgression.Status.Locked: + + if index == StudentProgression.Status.LOCKED: if lesson_number == 1: - unlocks[lesson_number]["look_and_learn"] = StudentProgression.Status.Unlocked + unlocks[lesson_number]["look_and_learn"] = StudentProgression.Status.UNLOCKED else: - unlocks[lesson_number - 1]["look_and_learn"] = StudentProgression.Status.Unlocked - unlocks[lesson_number - 1]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson_number - 1]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson_number - 1]["games"][2] = StudentProgression.Status.Locked - - unlocks[lesson_number]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson_number]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson_number]["games"][2] = StudentProgression.Status.Locked - + unlocks[lesson_number - 1]["look_and_learn"] = StudentProgression.Status.UNLOCKED + _set_lesson_games(lesson_number - 1, StudentProgression.Status.LOCKED) + + _set_lesson_games(lesson_number, StudentProgression.Status.LOCKED) + for lesson: int in unlocks.keys(): if lesson > lesson_number: - unlocks[lesson]["look_and_learn"] = StudentProgression.Status.Locked - unlocks[lesson]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson]["games"][2] = StudentProgression.Status.Locked - - elif index == StudentProgression.Status.Unlocked: - unlocks[lesson_number]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson_number]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson_number]["games"][2] = StudentProgression.Status.Locked + unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) + + elif index == StudentProgression.Status.UNLOCKED: + _set_lesson_games(lesson_number, StudentProgression.Status.LOCKED) for lesson: int in unlocks.keys(): if lesson < lesson_number: - unlocks[lesson]["look_and_learn"] = StudentProgression.Status.Completed - unlocks[lesson]["games"][0] = StudentProgression.Status.Completed - unlocks[lesson]["games"][1] = StudentProgression.Status.Completed - unlocks[lesson]["games"][2] = StudentProgression.Status.Completed + unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED + _set_lesson_games(lesson, StudentProgression.Status.COMPLETED) elif lesson > lesson_number: - unlocks[lesson]["look_and_learn"] = StudentProgression.Status.Locked - unlocks[lesson]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson]["games"][2] = StudentProgression.Status.Locked - elif index == StudentProgression.Status.Completed: - unlocks[lesson_number]["games"][0] = StudentProgression.Status.Unlocked - unlocks[lesson_number]["games"][1] = StudentProgression.Status.Unlocked - unlocks[lesson_number]["games"][2] = StudentProgression.Status.Unlocked + unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) + elif index == StudentProgression.Status.COMPLETED: + _set_lesson_games(lesson_number, StudentProgression.Status.UNLOCKED) for lesson: int in unlocks.keys(): if lesson < lesson_number: - unlocks[lesson]["look_and_learn"] = StudentProgression.Status.Completed - unlocks[lesson]["games"][0] = StudentProgression.Status.Completed - unlocks[lesson]["games"][1] = StudentProgression.Status.Completed - unlocks[lesson]["games"][2] = StudentProgression.Status.Completed + unlocks[lesson]["look_and_learn"] = StudentProgression.Status.COMPLETED + _set_lesson_games(lesson, StudentProgression.Status.COMPLETED) elif lesson > lesson_number: - unlocks[lesson]["look_and_learn"] = StudentProgression.Status.Locked - unlocks[lesson]["games"][0] = StudentProgression.Status.Locked - unlocks[lesson]["games"][1] = StudentProgression.Status.Locked - unlocks[lesson]["games"][2] = StudentProgression.Status.Locked + unlocks[lesson]["look_and_learn"] = StudentProgression.Status.LOCKED + _set_lesson_games(lesson, StudentProgression.Status.LOCKED) unlocks_changed.emit() + + +# Sets every minigame of a lesson to the same status, respecting the lesson's +# actual minigame count (1–3) rather than assuming a fixed three. +func _set_lesson_games(lesson: int, status: StudentProgression.Status) -> void: + var games: Array = unlocks[lesson]["games"] + for game_index: int in range(games.size()): + games[game_index] = status diff --git a/sources/menus/settings/lesson_unlocks.gd b/sources/menus/settings/lesson_unlocks.gd index e843cbe3..4c549d12 100644 --- a/sources/menus/settings/lesson_unlocks.gd +++ b/sources/menus/settings/lesson_unlocks.gd @@ -90,7 +90,7 @@ func _on_back_button_pressed() -> void: func _get_highest_unlocked_lesson() -> int: var highest_unlocked_lesson: int = 0 for lesson_number: int in progression.unlocks.keys(): - if progression.unlocks[lesson_number]["look_and_learn"] >= StudentProgression.Status.Unlocked: + if progression.unlocks[lesson_number]["look_and_learn"] >= StudentProgression.Status.UNLOCKED: highest_unlocked_lesson = max(highest_unlocked_lesson, lesson_number) return highest_unlocked_lesson diff --git a/sources/menus/settings/teacher_settings.gd b/sources/menus/settings/teacher_settings.gd index 48bf7a3a..64c36afc 100644 --- a/sources/menus/settings/teacher_settings.gd +++ b/sources/menus/settings/teacher_settings.gd @@ -3,6 +3,7 @@ extends Control const MAIN_MENU_PATH: String = "res://sources/menus/main/main_menu.tscn" const LOGIN_MENU_PATH: String = "res://sources/menus/login/login.tscn" +const SPLASH_SCREEN_PATH: String = "res://sources/menus/splash_screen/splash_screen.tscn" const DEVICE_SELECTION_SCENE_PATH: String = "res://sources/menus/device_selection/device_selection.tscn" const DEVICE_TAB_SCENE: PackedScene = preload("res://sources/menus/settings/device_tab.tscn") const PASSWORD_VISUALIZER_SCENE: PackedScene = preload("res://sources/menus/components/password_visualizer.tscn") @@ -18,6 +19,8 @@ var last_device_id: int = -1 @onready var devices_tab_container: TabContainer = %DevicesTabContainer @onready var lesson_unlocks: LessonUnlocks = $LessonUnlocks @onready var delete_popup: ConfirmPopup = %DeletePopup +@onready var change_language_popup: ChangeLanguagePopup = %ChangeLanguagePopup +@onready var change_language_error_popup: ConfirmPopup = %ChangeLanguageErrorPopup @onready var loading_popup: LoadingPopup = %LoadingPopup @onready var account_type_option_button: OptionButton = %AccountTypeOptionButton @onready var education_method_option_button: OptionButton = %EducationMethodOptionButton @@ -59,6 +62,13 @@ func _ready() -> void: Log.info("SettingsTeacherSettings: Export codes dialog configured") +func _exit_tree() -> void: + # The synchronizer outlives this scene: clear the popup reference so a + # later background synchronization does not call into a freed node. + if UserDataManager.user_database_synchronizer.loading_popup == loading_popup: + UserDataManager.user_database_synchronizer.loading_popup = null + + func _on_account_type_option_button_item_selected(index: int) -> void: if TeacherSettings.AccountType.values().has(index): UserDataManager.teacher_settings.account_type = index as TeacherSettings.AccountType @@ -125,6 +135,36 @@ func _on_logout_button_pressed() -> void: get_tree().change_scene_to_file(MAIN_MENU_PATH) +func _on_change_language_button_pressed() -> void: + var current_language: String = UserDataManager.get_language() + change_language_popup.show_for_current_language(current_language) + + +func _on_change_language_popup_accepted(new_language: String) -> void: + if not new_language: + Log.warn("SettingsTeacherSettings: Change language cancelled - no language selected") + return + var current_language: String = UserDataManager.get_language() + if new_language == current_language: + Log.info("SettingsTeacherSettings: Change language skipped - selected language matches current (%s)" % current_language) + return + Log.warn("SettingsTeacherSettings: Change language from %s to %s" % [current_language, new_language]) + + var res: Dictionary = await ServerManager.reset_language(new_language) + if res.code != 200: + Log.error("SettingsTeacherSettings: Reset language request failed. Error code %d" % res.code) + change_language_error_popup.show() + return + + # Server confirmed: wipe all local teacher data, apply new language, and restart from splash. + UserDataManager.delete_teacher_data() + if UserDataManager.teacher_settings: + UserDataManager.teacher_settings.server_language_validated = false + UserDataManager.set_language(new_language, true) + UserDataManager.logout() + get_tree().change_scene_to_file(SPLASH_SCREEN_PATH) + + func _on_devices_tab_container_tab_changed(tab: int) -> void: var device_tab: DeviceTab = devices_tab_container.get_tab_control(tab) as DeviceTab if not device_tab: diff --git a/sources/menus/settings/teacher_settings.tscn b/sources/menus/settings/teacher_settings.tscn index 9cd2278e..660dd97f 100644 --- a/sources/menus/settings/teacher_settings.tscn +++ b/sources/menus/settings/teacher_settings.tscn @@ -10,6 +10,7 @@ [ext_resource type="Theme" uid="uid://dqjvrt5nrtwn1" path="res://resources/themes/kalulu_theme.tres" id="8_7h0sa"] [ext_resource type="PackedScene" uid="uid://qsvbq6ruc44v" path="res://sources/menus/settings/lesson_unlocks.tscn" id="9_mljfd"] [ext_resource type="PackedScene" uid="uid://dhowigt8un22u" path="res://sources/ui/loading_popup.tscn" id="10_i488h"] +[ext_resource type="PackedScene" path="res://sources/ui/change_language_popup.tscn" id="11_chglg"] [node name="TeacherSettings" type="Control" unique_id=149147235] layout_mode = 3 @@ -71,6 +72,30 @@ theme_type_variation = &"FlatButton" theme_override_font_sizes/font_size = 40 text = "SYNCHRONIZE_ACCOUNT" +[node name="LogoutButton" type="Button" parent="InterfaceLeft/Container" unique_id=808130432] +layout_mode = 2 +theme_override_font_sizes/font_size = 40 +text = "LOGOUT" + +[node name="DangerSpacer" type="Control" parent="InterfaceLeft/Container" unique_id=312700845] +custom_minimum_size = Vector2(0, 100) +layout_mode = 2 + +[node name="ChangeLanguageButton" type="Button" parent="InterfaceLeft/Container" unique_id=144215823] +layout_mode = 2 +theme_type_variation = &"DangerButton" +theme_override_font_sizes/font_size = 40 +text = "CHANGE_LANGUAGE" + +[node name="ChangeLanguagePopup" parent="InterfaceLeft/Container/ChangeLanguageButton" unique_id=144215824 instance=ExtResource("11_chglg")] +unique_name_in_owner = true +visible = false + +[node name="ChangeLanguageErrorPopup" parent="InterfaceLeft/Container/ChangeLanguageButton" unique_id=144215825 instance=ExtResource("7_jetb7")] +unique_name_in_owner = true +visible = false +content_text = "CHANGE_LANGUAGE_ERROR" + [node name="DeleteButton" type="Button" parent="InterfaceLeft/Container" unique_id=721919922] layout_mode = 2 theme_type_variation = &"DangerButton" @@ -82,11 +107,6 @@ unique_name_in_owner = true visible = false content_text = "DELETE_ACCOUNT_POPUP" -[node name="LogoutButton" type="Button" parent="InterfaceLeft/Container" unique_id=808130432] -layout_mode = 2 -theme_override_font_sizes/font_size = 40 -text = "LOGOUT" - [node name="VBoxContainer" type="VBoxContainer" parent="." unique_id=2087046145] custom_minimum_size = Vector2(1970, 1800) layout_mode = 1 @@ -243,9 +263,11 @@ access = 2 [connection signal="pressed" from="InterfaceLeft/Container/BackButton" to="." method="_on_back_button_pressed"] [connection signal="pressed" from="InterfaceLeft/Container/Dashboard" to="." method="_on_dashboard_button_pressed"] [connection signal="pressed" from="InterfaceLeft/Container/SynchronizeButton" to="." method="_on_synchronize_button_pressed"] +[connection signal="pressed" from="InterfaceLeft/Container/LogoutButton" to="." method="_on_logout_button_pressed"] +[connection signal="pressed" from="InterfaceLeft/Container/ChangeLanguageButton" to="." method="_on_change_language_button_pressed"] +[connection signal="accepted" from="InterfaceLeft/Container/ChangeLanguageButton/ChangeLanguagePopup" to="." method="_on_change_language_popup_accepted"] [connection signal="pressed" from="InterfaceLeft/Container/DeleteButton" to="." method="_on_delete_button_pressed"] [connection signal="accepted" from="InterfaceLeft/Container/DeleteButton/DeletePopup" to="." method="_on_delete_popup_accepted"] -[connection signal="pressed" from="InterfaceLeft/Container/LogoutButton" to="." method="_on_logout_button_pressed"] [connection signal="item_selected" from="VBoxContainer/HBoxContainer/AccountTypeOptionButton" to="." method="_on_account_type_option_button_item_selected"] [connection signal="item_selected" from="VBoxContainer/HBoxContainer/EducationMethodOptionButton" to="." method="_on_education_method_option_button_item_selected"] [connection signal="tab_changed" from="VBoxContainer/DevicesTabContainer" to="." method="_on_devices_tab_container_tab_changed"] diff --git a/sources/minigames/ants/ants_minigame.gd b/sources/minigames/ants/ants_minigame.gd index b449b3cb..1c41d553 100644 --- a/sources/minigames/ants/ants_minigame.gd +++ b/sources/minigames/ants/ants_minigame.gd @@ -4,6 +4,9 @@ const BLANK_SCENE: PackedScene = preload("res://sources/minigames/ants/blank.tsc const ANT_SCENE: PackedScene = preload("res://sources/minigames/ants/ant.tscn") const WORD_SCENE: PackedScene = preload("res://sources/minigames/ants/word.tscn") const LABEL_SETTINGS: LabelSettings = preload("res://resources/themes/minigames_label_settings_ants.tres") +const LINE_HEIGHT: float = 159.0 # Matches sentence_text_box.png and blank row height +const SPAWN_SPACING: float = 600.0 +const REFERENCE_DURATION: float = 1.3985 # Ants travel duration var current_sentence: Dictionary = {} var answer_input_done: Array[bool] = [] @@ -181,7 +184,7 @@ func _next_sentence() -> void: else: var label: Label = Label.new() sentence_container.add_child(label) - + if current_word == ".": label.text = current_word + " " else: @@ -189,6 +192,7 @@ func _next_sentence() -> void: label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER label.label_settings = LABEL_SETTINGS + label.custom_minimum_size.y = LINE_HEIGHT await setup_sentence_background() @@ -217,31 +221,44 @@ func setup_sentence_background() -> void: func _start_ants() -> void: var total_ants: int = ants.get_child_count() + if total_ants == 0: + return - # Animate each ant, one after another + var spawn_position: Vector2 = ants_spawn.global_position + var start_position: Vector2 = ants_start.global_position + var end_position: Vector2 = ants_end.global_position + var denominator: float = maxf(1.0, float(total_ants - 1)) # Avoid division by zero when there is only one ant + + # Spawn the ants in a line off-screen in the same order as their on-screen targets: + # ant 0 heads to the leftmost target, so it must also be leftmost in the spawn line. + # This keeps their relative order constant while they all move right, preventing crossings. for ant_index: int in range(total_ants): var ant: Ant = ants.get_child(ant_index) + var offset: float = -float(total_ants - 1 - ant_index) * SPAWN_SPACING + ant.global_position = spawn_position + Vector2(offset, 0.0) + # Constant speed derived from ant 0's travel, so the leftmost ant stops first + # and each subsequent ant stops shortly after as it reaches its own target. + var ant0: Ant = ants.get_child(0) + var reference_distance: float = maxf(1.0, ant0.global_position.distance_to(start_position)) + var speed: float = reference_distance / REFERENCE_DURATION + + var tweens: Array[Tween] = [] + for ant_index: int in range(total_ants): + var ant: Ant = ants.get_child(ant_index) ant.walk() - # Create a tween to move the ant from start to end point - var tween: Tween = create_tween() - - # Compute interpolation factor (0.0 to 1.0) based on position in the list - var denominator: float = maxf(1.0, float(total_ants - 1)) # Avoid division by zero when there is only one ant var position_ratio: float = float(ant_index) / denominator - - # Interpolate position from ants_start to ants_end using the ratio - var start_position: Vector2 = ants_start.global_position - var end_position: Vector2 = ants_end.global_position var target_position: Vector2 = lerp(start_position, end_position, position_ratio) + var duration: float = ant.global_position.distance_to(target_position) / speed - # Animate the movement over 1 second - tween.tween_property(ant, "global_position", target_position, 1.0) - await tween.finished + var tween: Tween = create_tween() + tween.tween_property(ant, "global_position", target_position, duration) + tween.tween_callback(ant.idle) + tweens.append(tween) - # Switch to idle state once movement is complete - ant.idle() + # Wait for the last ant (longest travel) to reach its position. + await tweens[tweens.size() - 1].finished # Reactivate all words once ants have reached their positions for word: Word in words.get_children(): diff --git a/sources/minigames/ants/ants_minigame.tscn b/sources/minigames/ants/ants_minigame.tscn index 842d8552..fdbc3ed2 100644 --- a/sources/minigames/ants/ants_minigame.tscn +++ b/sources/minigames/ants/ants_minigame.tscn @@ -40,11 +40,13 @@ mouse_filter = 2 texture = ExtResource("7_ihrng") [node name="MarginContainer" type="MarginContainer" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="1" unique_id=1085551937] -layout_mode = 0 -offset_left = 530.0 -offset_top = 254.0 -offset_right = 530.0 -offset_bottom = 254.0 +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.45 +anchor_bottom = 0.45 +offset_left = 400.0 +offset_right = 470.0 +grow_vertical = 2 theme_override_constants/margin_left = 20 [node name="SentenceBackground" type="HFlowContainer" parent="GameRoot/MarginContainer" index="0" unique_id=306719963] diff --git a/sources/minigames/ants/blank.tscn b/sources/minigames/ants/blank.tscn index 14090ac5..389284af 100644 --- a/sources/minigames/ants/blank.tscn +++ b/sources/minigames/ants/blank.tscn @@ -4,12 +4,12 @@ [ext_resource type="Script" uid="uid://bydhpvtn71v5a" path="res://sources/minigames/ants/blank.gd" id="2_mvcny"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_pwxu7"] -size = Vector2(610, 230) +size = Vector2(610, 160) [node name="Blank" type="TextureRect" unique_id=764966448] modulate = Color(0.5254902, 0.4509804, 0.8980392, 1) offset_right = 594.0 -offset_bottom = 229.0 +offset_bottom = 159.0 size_flags_horizontal = 4 size_flags_vertical = 4 texture = ExtResource("1_iy5b6") @@ -20,5 +20,5 @@ collision_mask = 0 monitoring = false [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D" unique_id=2104163297] -position = Vector2(305, 115) +position = Vector2(297, 80) shape = SubResource("RectangleShape2D_pwxu7") diff --git a/sources/minigames/base/base_minigame.gd b/sources/minigames/base/base_minigame.gd index e3cd2683..75d1b588 100644 --- a/sources/minigames/base/base_minigame.gd +++ b/sources/minigames/base/base_minigame.gd @@ -2,18 +2,32 @@ class_name Minigame extends Control enum Type { - jellyfish, - crabs, - parakeets, - monkey, - caterpillar, - frog, - turtles, - ants, - penguin, - fish + JELLYFISH, + CRABS, + PARAKEETS, + MONKEY, + CATERPILLAR, + FROG, + TURTLES, + ANTS, + PENGUIN, + FISH, } +# String names used for file paths, database keys, and speech lookups. +# Kept separate from enum member names so renaming members doesn't affect runtime behaviour. +const TYPE_NAMES: Array[String] = [ + "jellyfish", + "crabs", + "parakeets", + "monkey", + "caterpillar", + "frog", + "turtles", + "ants", + "penguin", + "fish", +] const WIN_SOUND_FX: AudioStreamMP3 = preload("res://assets/sfx/sfx_game_over_win.mp3") const LOSE_SOUND_FX: AudioStreamMP3 = preload("res://assets/sfx/sfx_game_over_lose.mp3") const LABEL_COLOR_NEUTRAL: Color = Color("#e6f3e0") @@ -53,18 +67,32 @@ var is_final_boss: bool = false # Stimuli var stimuli: Array = [] var distractions: Array = [] -# Lives +# Hidden lives counter — used ONLY to compute the next run's difficulty. +# +# The player never sees this value and can never "lose" a regular minigame because of it: +# every run ends with the win screen once `current_progression` reaches `max_progression`. +# Starts at `max_number_of_lives` and individual minigames decrement it with `current_lives -= 1` +# each time the child makes a mistake. It is allowed to go negative — that's the whole point. +# +# At end of game, `_win()` reads this value: +# - `current_lives >= 0` (fewer mistakes than allowed) → counted as a win, difficulty may go up +# - `current_lives < 0` (more mistakes than allowed) → counted as a loss, difficulty may go down +# +# The counter is also reused (as a convenient proxy for "how many recent mistakes") to drive +# the in-game hint system (Kalulu help speech and highlighting). That side effect IS visible to +# the player, but the raw lives number is not — do not add any UI that exposes it. var current_lives: int = 0: set(value): var previous_lives: int = current_lives current_lives = value if current_lives != previous_lives: - Log.trace("BaseMinigame: Lives changed from %d to %d (max %d) for %s" % [previous_lives, current_lives, max_number_of_lives, Type.keys()[minigame_name]]) + Log.trace("BaseMinigame: Lives changed from %d to %d (max %d) for %s" % [previous_lives, current_lives, max_number_of_lives, TYPE_NAMES[minigame_name]]) if current_lives < previous_lives: consecutive_errors += previous_lives - current_lives - if current_lives <= max_number_of_lives - errors_before_help_speech: + var help_speech_threshold: int = max_number_of_lives - errors_before_help_speech + if previous_lives > help_speech_threshold and current_lives <= help_speech_threshold: _play_kalulu_help_speech() - elif consecutive_errors == errors_before_highlight: + if consecutive_errors == errors_before_highlight: is_highlighting = true # Progression var current_progression: int = 0: set = set_current_progression @@ -104,11 +132,11 @@ func _ready() -> void: # Difficulty if (UserDataManager as UserDataManagerClass)._student_difficulty: - difficulty = UserDataManager.get_difficulty_for_minigame(Type.keys()[minigame_name] as String) + difficulty = UserDataManager.get_difficulty_for_minigame(TYPE_NAMES[minigame_name] as String) - intro_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "intro")) - help_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "help")) - win_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "end")) + intro_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name] as String, "intro")) + help_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name] as String, "help")) + win_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name] as String, "end")) lose_kalulu_speech = Database.load_external_sound(Database.get_kalulu_speech_path("minigame", "lose")) if not Engine.is_editor_hint(): @@ -123,9 +151,12 @@ func _initialize() -> void: if not Engine.is_editor_hint(): _find_stimuli_and_distractions() - _setup_minigame() + # Await so minigames whose setup is a coroutine (e.g. staged instantiation, + # particle shader warmup) finish before the curtain opens and _start() runs. + @warning_ignore("redundant_await") + await _setup_minigame() - Log.info("BaseMinigame: Initialize %s (lesson %d, minigame #%d, difficulty %d)" % [Type.keys()[minigame_name], lesson_nb, minigame_number, difficulty]) + Log.info("BaseMinigame: Initialize %s (lesson %d, minigame #%d, difficulty %d)" % [TYPE_NAMES[minigame_name], lesson_nb, minigame_number, difficulty]) if not Engine.is_editor_hint(): await _curtains_and_kalulu() @@ -151,10 +182,10 @@ func _curtains_and_kalulu() -> void: await (OpeningCurtain as OpeningCurtainClass).open() # Checks if intro needs to be played - if not UserDataManager.is_speech_played(Type.keys()[minigame_name] as String): + if not UserDataManager.is_speech_played(TYPE_NAMES[minigame_name] as String): minigame_ui.play_kalulu_speech(intro_kalulu_speech) await minigame_ui.kalulu_speech_ended - UserDataManager.mark_speech_as_played(Type.keys()[minigame_name] as String) + UserDataManager.mark_speech_as_played(TYPE_NAMES[minigame_name] as String) #endregion #region Timer @@ -166,7 +197,7 @@ var _is_paused: bool = false # Launch the minigame func _start() -> void: - Log.info("BaseMinigame: Start minigame=%s lesson=%d difficulty=%d" % [Type.keys()[minigame_name], lesson_nb, difficulty]) + Log.info("BaseMinigame: Start minigame=%s lesson=%d difficulty=%d" % [TYPE_NAMES[minigame_name], lesson_nb, difficulty]) _start_time = Time.get_ticks_msec() / 1000.0 _elapsed_paused = 0.0 _is_paused = false @@ -181,7 +212,6 @@ func _notification(what: int) -> void: if not _is_paused: _pause_start = Time.get_ticks_msec() / 1000.0 _is_paused = true - NOTIFICATION_APPLICATION_FOCUS_IN: if _is_paused: var resumed: float = Time.get_ticks_msec() / 1000.0 @@ -218,13 +248,14 @@ func _win() -> void: update_scores() - Log.info("BaseMinigame: %s won in %d seconds with progression %d/%d and %d/%d lives" % [Type.keys()[minigame_name], _get_elapsed_time_seconds(), current_progression, max_progression, current_lives, max_number_of_lives]) - - # Difficulty - if current_lives <= 0: - UserDataManager.update_difficulty_for_minigame(Type.keys()[minigame_name] as String, false) - else: - UserDataManager.update_difficulty_for_minigame(Type.keys()[minigame_name] as String, true) + Log.info("BaseMinigame: %s won in %d seconds with progression %d/%d and %d/%d lives" % [TYPE_NAMES[minigame_name], _get_elapsed_time_seconds(), current_progression, max_progression, current_lives, max_number_of_lives]) + + # Hidden difficulty check — see the `current_lives` declaration above. + # The player always reaches this branch (no visible loss), but if they used up more than + # `max_number_of_lives` mistakes (`current_lives` ended strictly negative), this run is + # reported to the difficulty system as a loss so the next session eases up. + var counted_as_win: bool = current_lives >= 0 + UserDataManager.update_difficulty_for_minigame(TYPE_NAMES[minigame_name] as String, counted_as_win) audio_player.stream = WIN_SOUND_FX audio_player.play() @@ -263,10 +294,10 @@ func _lose() -> void: update_scores() - Log.info("BaseMinigame: %s Lose in %d seconds with progression %d/%d and %d/%d lives" % [Type.keys()[minigame_name], _get_elapsed_time_seconds(), current_progression, max_progression, current_lives, max_number_of_lives]) + Log.info("BaseMinigame: %s Lose in %d seconds with progression %d/%d and %d/%d lives" % [TYPE_NAMES[minigame_name], _get_elapsed_time_seconds(), current_progression, max_progression, current_lives, max_number_of_lives]) # Difficulty - UserDataManager.update_difficulty_for_minigame(Type.keys()[minigame_name] as String, false) + UserDataManager.update_difficulty_for_minigame(TYPE_NAMES[minigame_name] as String, false) audio_player.stream = LOSE_SOUND_FX audio_player.play() @@ -280,7 +311,7 @@ func _lose() -> void: if has_method("show_adult_block"): call("show_adult_block") else: - Log.error("BaseMinigame: Adult block requested but no handler exists for %s" % Type.keys()[minigame_name]) + Log.error("BaseMinigame: Adult block requested but no handler exists for %s" % TYPE_NAMES[minigame_name]) return _reset() @@ -303,8 +334,8 @@ func _save_logs() -> void: var logs_size: int = -1 if logs.has("answers") and logs.get("answers", []) is Array: logs_size = (logs.get("answers", []) as Array).size() - Log.info("BaseMinigame: Saving logs for %s with %d answer(s)" % [Type.keys()[minigame_name], logs_size]) - LessonLogger.save_logs(logs, UserDataManager.get_student_folder(), Type.keys()[minigame_name] as String, lesson_nb, Time.get_time_string_from_system()) + Log.info("BaseMinigame: Saving logs for %s with %d answer(s)" % [TYPE_NAMES[minigame_name], logs_size]) + LessonLogger.save_logs(logs, UserDataManager.get_student_folder(), TYPE_NAMES[minigame_name] as String, lesson_nb, Time.get_time_string_from_system()) _reset_logs() @@ -317,7 +348,7 @@ func _log_new_response(response: Dictionary, current_stimulus: Dictionary) -> vo "reponse": response, "awaited_response": current_stimulus, "is_right": response == current_stimulus, - "minigame": Type.keys()[minigame_name], + "minigame": TYPE_NAMES[minigame_name], "number_of_hints": current_number_of_hints, "current_progression": current_progression, "max_progression": max_progression, @@ -325,7 +356,7 @@ func _log_new_response(response: Dictionary, current_stimulus: Dictionary) -> vo "max_number_of_lives": max_number_of_lives, } Log.trace("BaseMinigame: Log new response minigame=%s response=%s expected=%s right=%s progression=%d/%d lives=%d/%d" % [ - Type.keys()[minigame_name], + TYPE_NAMES[minigame_name], str(response), str(current_stimulus), str(response_log.is_right), @@ -404,18 +435,17 @@ func _go_back_to_the_garden() -> void: _save_logs() Gardens.transition_data = gardens_data - get_tree().change_scene_to_file("res://sources/gardens/gardens.tscn") + SceneLoader.change_scene("res://sources/gardens/gardens.tscn") func _play_stimulus() -> void: return -func _pause_game() -> bool: - var pause: bool = not get_tree().paused - get_tree().paused = pause - Log.trace("BaseMinigame: Pause toggled to %s for %s" % [str(pause), Type.keys()[minigame_name]]) - return pause +func _set_root_timers_paused(paused: bool) -> void: + for child: Node in get_children(): + if child is Timer: + (child as Timer).paused = paused func _highlight() -> void: @@ -438,7 +468,7 @@ func _play_kalulu_help_speech() -> void: func set_current_progression(p_current_progression: int) -> void: var previous_progression: int = current_progression current_progression = p_current_progression - Log.trace("BaseMinigame: Progression changed from %d to %d/%d for %s" % [previous_progression, current_progression, max_progression, Type.keys()[minigame_name]]) + Log.trace("BaseMinigame: Progression changed from %d to %d/%d for %s" % [previous_progression, current_progression, max_progression, TYPE_NAMES[minigame_name]]) consecutive_errors = 0 is_highlighting = false @@ -460,14 +490,20 @@ func _on_minigame_ui_back_button_pressed() -> void: func _on_minigame_ui_stimulus_button_pressed() -> void: - _pause_game() + game_root.process_mode = Node.PROCESS_MODE_DISABLED + set_process(false) + set_physics_process(false) + _set_root_timers_paused(true) minigame_ui.lock() - + @warning_ignore("redundant_await") await _play_stimulus() - + minigame_ui.unlock() - _pause_game() + _set_root_timers_paused(false) + set_process(true) + set_physics_process(true) + game_root.process_mode = Node.PROCESS_MODE_PAUSABLE func _on_minigame_ui_kalulu_button_pressed() -> void: diff --git a/sources/minigames/base/base_minigame.tscn b/sources/minigames/base/base_minigame.tscn index ceda0a04..5fb3e75e 100644 --- a/sources/minigames/base/base_minigame.tscn +++ b/sources/minigames/base/base_minigame.tscn @@ -16,7 +16,7 @@ grow_vertical = 2 script = ExtResource("1_jdfsm") [node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="." unique_id=649246549] -process_mode = 3 +process_mode = 1 bus = &"Voice" script = ExtResource("2_dkgx4") diff --git a/sources/minigames/base/minigame_audio_stream_player.gd b/sources/minigames/base/minigame_audio_stream_player.gd index 892b0b11..63cf46b9 100644 --- a/sources/minigames/base/minigame_audio_stream_player.gd +++ b/sources/minigames/base/minigame_audio_stream_player.gd @@ -44,4 +44,4 @@ func play_audio_stream(audio: AudioStreamMP3) -> void: stream = audio play() if not audio.loop: - await get_tree().create_timer(audio.get_length() + 0.25).timeout + await get_tree().create_timer(audio.get_length() + 0.25, false).timeout diff --git a/sources/minigames/base/play_button_mask.png.import b/sources/minigames/base/play_button_mask.png.import index e5455094..9a147bf8 100644 --- a/sources/minigames/base/play_button_mask.png.import +++ b/sources/minigames/base/play_button_mask.png.import @@ -3,19 +3,21 @@ importer="texture" type="CompressedTexture2D" uid="uid://chxj1j246l1sl" -path="res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.ctex" +path.s3tc="res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.s3tc.ctex" +path.etc2="res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.etc2.ctex" metadata={ -"vram_texture": false +"imported_formats": ["s3tc_bptc", "etc2_astc"], +"vram_texture": true } [deps] source_file="res://sources/minigames/base/play_button_mask.png" -dest_files=["res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.ctex"] +dest_files=["res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.s3tc.ctex", "res://.godot/imported/play_button_mask.png-706266ac52ec17e4f022068a416b2a41.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="" diff --git a/sources/minigames/boss/boss_minigame.gd b/sources/minigames/boss/boss_minigame.gd index 12493415..b75078f3 100644 --- a/sources/minigames/boss/boss_minigame.gd +++ b/sources/minigames/boss/boss_minigame.gd @@ -2,6 +2,20 @@ extends Minigame const FINAL_BOSS_GAME_DURATION: int = 20 * 60 const FINAL_BOSS_TOTAL_WORDS: int = 180 +const GAUGE_COLOR_LOW: Color = Color(0.55, 0.95, 0.45) +const GAUGE_COLOR_HIGH: Color = Color(0.996078, 0.776471, 0.2) +const MONKEY_SCENE_PATH: String = "res://sources/minigames/monkeys/monkey.tscn" +const TURTLE_SCENE_PATH: String = "res://sources/minigames/turtles/turtle.tscn" +# turtle.tscn no longer carries a default SpriteFrames (the three color +# spritesheets are ~123 MB of VRAM each and the turtles minigame picks one +# at runtime). For the static boss-friend turtle, pick one here. +const TURTLE_FRIEND_SPRITE_FRAMES_PATH: String = "res://sources/minigames/turtles/purple_turtle_animations.tres" +const PENGUIN_SCENE_PATH: String = "res://sources/minigames/penguin/penguin.tscn" +const FROG_SCENE_PATH: String = "res://sources/minigames/frog/frog.tscn" +const CRAB_SCENE_PATH: String = "res://sources/minigames/crabs/crab/crab.tscn" +const PARAKEET_SCENE_PATH: String = "res://sources/minigames/parakeets/parakeet.tscn" +const ANT_SCENE_PATH: String = "res://sources/minigames/ants/ant.tscn" +const JELLYFISH_SCENE_PATH: String = "res://sources/minigames/jellyfish/jellyfish.tscn" @export var game_duration: int = 4 * 60 @export var minimum_correct_ratio: float = 0.8 @@ -19,6 +33,16 @@ var _boss_answer_start_ms: int = 0 var default_label_settings: LabelSettings var default_label_background_color: Color var _correct_answer_tween: Tween +var _victory_pulse_tween: Tween +var _victory_threshold_reached: bool = false +var turtle: Turtle +var frog: Frog +var crab: Crab +var penguin: Penguin +var monkey: Monkey +var parakeet: Parakeet +var ant: Ant +var jellyfish: Jellyfish @onready var text_start_zone: Control = %ControlText @onready var texture_button_bin: TextureButton = $GameRoot/TextureButtonBin @@ -34,21 +58,14 @@ var _correct_answer_tween: Tween @onready var wrong_fx: WrongFX = %WrongFX @onready var right_stars: RightStarsFX = $GameRoot/Right_Stars @onready var frame_exit: Sprite2D = $GameRoot/Frame/FrameExit -@onready var turtle: Turtle = $GameRoot/Friends/Turtle -@onready var frog: Frog = $GameRoot/Friends/Frog -@onready var crab: Crab = $GameRoot/Friends/Crab -@onready var penguin: Penguin = $GameRoot/Friends/Penguin -@onready var monkey: Monkey = $GameRoot/Friends/Monkey -@onready var parakeet: Parakeet = $GameRoot/Friends/Parakeet -@onready var ant: Ant = $GameRoot/Friends/Ant -@onready var jellyfish: Jellyfish = $GameRoot/Friends_Behind_Frame/Jellyfish +@onready var friends_container: Node2D = $GameRoot/Friends +@onready var friends_behind_frame_container: Node2D = $GameRoot/Friends_Behind_Frame func _ready() -> void: super() if not is_final_boss: frame_exit.show() - setup_animal_friends() fireworks.set_colors([Color("#bca4ff"), Color("#f5a8c8"), Color("#ffbf94")]) if adult_block and adult_block.has_signal("unlocked"): adult_block.unlocked.connect(_on_adult_block_unlocked) @@ -65,9 +82,99 @@ func _ready() -> void: default_label_background_color = texture_rect_text_box.self_modulate # Skips the whole tutorial - if UserDataManager.is_speech_played(Type.keys()[minigame_name] as String): + if UserDataManager.is_speech_played(TYPE_NAMES[minigame_name]): tutorial_count = 2 + _instantiate_animal_friends() + + +func _instantiate_animal_friends() -> void: + await get_tree().process_frame + if not is_inside_tree(): + return + + monkey = (load(MONKEY_SCENE_PATH) as PackedScene).instantiate() + monkey.position = Vector2(125, 62) + monkey.scale = Vector2(0.7, 0.7) + friends_container.add_child(monkey) + + await get_tree().process_frame + if not is_inside_tree(): + return + + turtle = (load(TURTLE_SCENE_PATH) as PackedScene).instantiate() + turtle.position = Vector2(-220, 120) + turtle.rotation = 1.5707964 + turtle.scale = Vector2(0.18, 0.18) + friends_container.add_child(turtle) + turtle.sprite_frames = load(TURTLE_FRIEND_SPRITE_FRAMES_PATH) + + await get_tree().process_frame + if not is_inside_tree(): + return + + penguin = (load(PENGUIN_SCENE_PATH) as PackedScene).instantiate() + penguin.position = Vector2(28, 114) + penguin.scale = Vector2(0.3, 0.3) + friends_container.add_child(penguin) + + await get_tree().process_frame + if not is_inside_tree(): + return + + frog = (load(FROG_SCENE_PATH) as PackedScene).instantiate() + frog.offset_left = -43.999985 + frog.offset_top = 112.0 + frog.offset_right = -43.999985 + frog.offset_bottom = 112.0 + frog.scale = Vector2(0.4, 0.4) + friends_container.add_child(frog) + + await get_tree().process_frame + if not is_inside_tree(): + return + + crab = (load(CRAB_SCENE_PATH) as PackedScene).instantiate() + crab.offset_left = -220.0 + crab.offset_top = 32.0 + crab.offset_right = 148.0 + crab.offset_bottom = 352.0 + crab.scale = Vector2(0.45, 0.45) + friends_container.add_child(crab) + + await get_tree().process_frame + if not is_inside_tree(): + return + + parakeet = (load(PARAKEET_SCENE_PATH) as PackedScene).instantiate() + parakeet.position = Vector2(124, -103) + parakeet.scale = Vector2(0.09, 0.09) + friends_container.add_child(parakeet) + + await get_tree().process_frame + if not is_inside_tree(): + return + + ant = (load(ANT_SCENE_PATH) as PackedScene).instantiate() + ant.position = Vector2(228, 132) + ant.scale = Vector2(0.17, 0.17) + friends_container.add_child(ant) + + await get_tree().process_frame + if not is_inside_tree(): + return + + jellyfish = (load(JELLYFISH_SCENE_PATH) as PackedScene).instantiate() + jellyfish.offset_left = 1449.0001 + jellyfish.offset_top = 1301.0001 + jellyfish.offset_right = 1849.0001 + jellyfish.offset_bottom = 1701.0001 + jellyfish.scale = Vector2(0.45, 0.45) + jellyfish.boss = true + friends_behind_frame_container.add_child(jellyfish) + + setup_animal_friends() + func setup_animal_friends() -> void: turtle.idle_boss() @@ -158,7 +265,7 @@ func _present_next_word() -> void: if _is_boss_session(): _boss_answer_start_ms = Time.get_ticks_msec() if tutorial_count == 0: - var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "intro_test_game_first_word")) + var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name], "intro_test_game_first_word")) minigame_ui.play_kalulu_speech(speech) await minigame_ui.kalulu_speech_ended @@ -224,12 +331,12 @@ func _on_answer_dropped(is_answered_real: bool) -> void: words_to_present.pop_front() await _play_correct_answer_animation(target_button) if tutorial_count == 0: - var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "win_test_game_first_word")) + var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name], "win_test_game_first_word")) minigame_ui.play_kalulu_speech(speech) await minigame_ui.kalulu_speech_ended tutorial_count += 1 elif tutorial_count == 1: - var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "win_test_game_second_word")) + var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name], "win_test_game_second_word")) minigame_ui.play_kalulu_speech(speech) await minigame_ui.kalulu_speech_ended tutorial_count += 1 @@ -245,12 +352,12 @@ func _on_answer_dropped(is_answered_real: bool) -> void: wrong_fx.play() words_to_present_next.append(words_to_present.pop_front()) if tutorial_count == 0: - var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "lose_test_game_first_word")) + var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name], "lose_test_game_first_word")) minigame_ui.play_kalulu_speech(speech) await minigame_ui.kalulu_speech_ended tutorial_count += 1 elif tutorial_count == 1: - var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(Type.keys()[minigame_name] as String, "lose_test_game_second_word")) + var speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path(TYPE_NAMES[minigame_name], "lose_test_game_second_word")) minigame_ui.play_kalulu_speech(speech) await minigame_ui.kalulu_speech_ended tutorial_count += 1 @@ -336,8 +443,29 @@ func _update_progression_gauge() -> void: # Keep at least one pixel unfilled while there are still words to answer. margin_top_ratio = max(margin_top_ratio, 1.0 / progress_gauge.size.y) progress_gauge.margin_top_ratio = margin_top_ratio - if _get_win_ratio() >= minimum_correct_ratio: - progress_gauge_internal.modulate = winning_color + var ratio: float = _get_win_ratio() + if ratio >= minimum_correct_ratio: + if not _victory_threshold_reached: + _victory_threshold_reached = true + _play_victory_threshold_effect() + else: + var weight: float = clamp(ratio / minimum_correct_ratio, 0.0, 1.0) + progress_gauge_internal.modulate = GAUGE_COLOR_LOW.lerp(GAUGE_COLOR_HIGH, weight) + + +func _play_victory_threshold_effect() -> void: + if _victory_pulse_tween and _victory_pulse_tween.is_running(): + _victory_pulse_tween.kill() + right_stars.global_position = progress_gauge_internal.global_position + progress_gauge_internal.size / 2.0 + right_stars.replay() + _victory_pulse_tween = create_tween() + _victory_pulse_tween.tween_method( + func(hue: float) -> void: + progress_gauge_internal.modulate = Color.from_hsv(fmod(hue, 1.0), 0.8, 1.0), + 0.0, 1.0, 1.8 + ).set_trans(Tween.TRANS_LINEAR) + _victory_pulse_tween.tween_property(progress_gauge_internal, "modulate", GAUGE_COLOR_HIGH, 0.4) \ + .set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_OUT) func _get_win_ratio() -> float: diff --git a/sources/minigames/boss/boss_minigame.tscn b/sources/minigames/boss/boss_minigame.tscn index 2c733241..6e77f268 100644 --- a/sources/minigames/boss/boss_minigame.tscn +++ b/sources/minigames/boss/boss_minigame.tscn @@ -12,7 +12,6 @@ [ext_resource type="Texture2D" uid="uid://cax5nncivwq4" path="res://assets/minigames/boss/bin.png" id="7_wij1o"] [ext_resource type="Texture2D" uid="uid://xukdk8dobsqy" path="res://assets/minigames/boss/book.png" id="8_mkvne"] [ext_resource type="Texture2D" uid="uid://1btgagsporxa" path="res://assets/minigames/parakeets/graphic/cloud_3.png" id="8_xrsj0"] -[ext_resource type="PackedScene" uid="uid://djykrpdu58f3v" path="res://sources/minigames/turtles/turtle.tscn" id="11_je4of"] [ext_resource type="Texture2D" uid="uid://dxqnvbr4tffn7" path="res://assets/minigames/minigame_ui/graphic/gauge.png" id="11_p5wnc"] [ext_resource type="Texture2D" uid="uid://7w2e4mo7yssm" path="res://assets/minigames/boss/foreground.png" id="12_2c6ay"] [ext_resource type="Texture2D" uid="uid://4ci6gmg0c15o" path="res://assets/minigames/minigame_ui/graphic/white_gauge.png" id="12_w5m1b"] @@ -22,15 +21,8 @@ [ext_resource type="LabelSettings" uid="uid://bguqnhiblwick" path="res://resources/themes/minigames_label_settings.tres" id="17_47luc"] [ext_resource type="PackedScene" uid="uid://dpfn2ag2xv24s" path="res://sources/minigames/boss/kalulu_boss.tscn" id="17_kvjsk"] [ext_resource type="PackedScene" uid="uid://b7rx6esglyd6c" path="res://sources/menus/adult_block/adult_block.tscn" id="18_4v0wd"] -[ext_resource type="PackedScene" uid="uid://bp0b4xkr7nwed" path="res://sources/minigames/monkeys/monkey.tscn" id="18_y0mix"] [ext_resource type="PackedScene" uid="uid://cs6g7fhc0bjvh" path="res://sources/utils/fx/right_stars.tscn" id="19_b2wqe"] -[ext_resource type="PackedScene" uid="uid://b78362g1yif2n" path="res://sources/minigames/penguin/penguin.tscn" id="19_j0ia3"] [ext_resource type="PackedScene" uid="uid://dlmbxcgiv8tpr" path="res://sources/utils/fx/wrong.tscn" id="19_wi3c5"] -[ext_resource type="PackedScene" uid="uid://bwe3fp0vkpufb" path="res://sources/minigames/crabs/crab/crab.tscn" id="20_j0ia3"] -[ext_resource type="PackedScene" uid="uid://bloyucpsbvpx8" path="res://sources/minigames/frog/frog.tscn" id="20_xrsj0"] -[ext_resource type="PackedScene" uid="uid://cpkwyypyikpfc" path="res://sources/minigames/jellyfish/jellyfish.tscn" id="21_3iy22"] -[ext_resource type="PackedScene" uid="uid://cmoeum0oc0p2" path="res://sources/minigames/parakeets/parakeet.tscn" id="23_h2hey"] -[ext_resource type="PackedScene" uid="uid://c6st16roxwloh" path="res://sources/minigames/ants/ant.tscn" id="24_ejade"] [sub_resource type="Curve2D" id="Curve2D_8d1qx"] _data = { @@ -92,14 +84,6 @@ texture = ExtResource("8_xrsj0") [node name="Friends_Behind_Frame" type="Node2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=889769498] -[node name="Jellyfish" parent="GameRoot/Friends_Behind_Frame" index="0" unique_id=2036427610 instance=ExtResource("21_3iy22")] -offset_left = 1449.0001 -offset_top = 1301.0001 -offset_right = 1849.0001 -offset_bottom = 1701.0001 -scale = Vector2(0.45, 0.45) -boss = true - [node name="Frame" type="Node2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="4" unique_id=1674444498] position = Vector2(1080, 720) scale = Vector2(0.9, 0.9) @@ -236,7 +220,7 @@ margin_top_ratio = 0.95 [node name="ProgressionGaugeInternal" type="NinePatchRect" parent="GameRoot/ProgressionGauge/ProgressionGaugePercentMarginContainer" index="0" unique_id=1534553679] unique_name_in_owner = true -modulate = Color(0.996078, 0.776471, 0.2, 1) +modulate = Color(0.54901963, 0.9490196, 0.4509804, 1) layout_mode = 2 texture = ExtResource("12_w5m1b") patch_margin_top = 33 @@ -251,41 +235,6 @@ texture = ExtResource("12_2c6ay") self_modulate = Color(1, 1, 1, 0.34509805) position = Vector2(1676, 1280) -[node name="Monkey" parent="GameRoot/Friends" index="0" unique_id=1341983060 instance=ExtResource("18_y0mix")] -position = Vector2(125, 62) -scale = Vector2(0.7, 0.7) - -[node name="Turtle" parent="GameRoot/Friends" index="1" unique_id=711306409 instance=ExtResource("11_je4of")] -position = Vector2(-220, 120) -rotation = 1.5707964 -scale = Vector2(0.17999999, 0.17999999) - -[node name="Penguin" parent="GameRoot/Friends" index="2" unique_id=1835464943 instance=ExtResource("19_j0ia3")] -position = Vector2(28, 114) -scale = Vector2(0.3, 0.3) - -[node name="Frog" parent="GameRoot/Friends" index="3" unique_id=2020692812 instance=ExtResource("20_xrsj0")] -offset_left = -43.999985 -offset_top = 112.0 -offset_right = -43.999985 -offset_bottom = 112.0 -scale = Vector2(0.4, 0.4) - -[node name="Crab" parent="GameRoot/Friends" index="4" unique_id=617305983 instance=ExtResource("20_j0ia3")] -offset_left = -220.0 -offset_top = 32.0 -offset_right = 148.0 -offset_bottom = 352.0 -scale = Vector2(0.45, 0.45) - -[node name="Parakeet" parent="GameRoot/Friends" index="5" unique_id=1132826004 instance=ExtResource("23_h2hey")] -position = Vector2(124, -103) -scale = Vector2(0.09, 0.09) - -[node name="Ant" parent="GameRoot/Friends" index="6" unique_id=1721368901 instance=ExtResource("24_ejade")] -position = Vector2(228, 132) -scale = Vector2(0.17, 0.17) - [node name="KaluluBoss" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="11" unique_id=1776395621 instance=ExtResource("17_kvjsk")] unique_name_in_owner = true position = Vector2(800, 1224) diff --git a/sources/minigames/frog/frog_minigame.gd b/sources/minigames/frog/frog_minigame.gd index d51f0ae3..1aa8b037 100644 --- a/sources/minigames/frog/frog_minigame.gd +++ b/sources/minigames/frog/frog_minigame.gd @@ -1,7 +1,9 @@ class_name FrogMinigame extends WordsMinigame -const LILYPAD_TRACK_SCENE: PackedScene = preload("res://sources/minigames/frog/lilypad_track.tscn") +const RIVER_SCENE_PATH: String = "res://sources/minigames/frog/river.tscn" +const FROG_SCENE_PATH: String = "res://sources/minigames/frog/frog.tscn" +const LILYPAD_TRACK_SCENE_PATH: String = "res://sources/minigames/frog/lilypad_track.tscn" var difficulty_settings: Array[DifficultySettings] = [ DifficultySettings.new(0.75, 100., 200.), @@ -10,14 +12,52 @@ var difficulty_settings: Array[DifficultySettings] = [ DifficultySettings.new(0.25, 250., 350.), DifficultySettings.new(0.25, 300., 400.) ] +var river: River +var frog: Frog +var lilypad_track_scene: PackedScene @onready var start: Control = %Start @onready var end: Control = %End @onready var frog_spawn_point: Control = %FrogSpawnPoint @onready var frog_despawn_point: Control = %FrogDespawnPoint -@onready var river: River = $GameRoot/Background/River @onready var lilypad_tracks_container: HBoxContainer = %LilypadTracksContainer -@onready var frog: Frog = %Frog + + +func _setup_minigame() -> void: + super() + await _instantiate_subscenes() + + +func _instantiate_subscenes() -> void: + var background_node: Control = $GameRoot/Background + var game_root_node: Control = $GameRoot + + await get_tree().process_frame + if not is_inside_tree(): + return + + river = (load(RIVER_SCENE_PATH) as PackedScene).instantiate() + river.name = "River" + background_node.add_child(river) + background_node.move_child(river, 0) + + await get_tree().process_frame + if not is_inside_tree(): + return + + frog = (load(FROG_SCENE_PATH) as PackedScene).instantiate() + frog.name = "Frog" + frog.offset_left = 360.0 + frog.offset_top = 900.0 + frog.offset_right = 360.0 + frog.offset_bottom = 900.0 + game_root_node.add_child(frog) + + await get_tree().process_frame + if not is_inside_tree(): + return + + lilypad_track_scene = load(LILYPAD_TRACK_SCENE_PATH) as PackedScene func _setup_word_progression() -> void: @@ -65,7 +105,7 @@ func _create_tracks() -> void: var current_word: Dictionary = _get_current_stimulus() var current_distractors: Array = _get_current_distractors() for index: int in range((current_word.GPs as Array).size()): - var track: LilypadTrack = LILYPAD_TRACK_SCENE.instantiate() + var track: LilypadTrack = lilypad_track_scene.instantiate() lilypad_tracks_container.add_child(track) track.difficulty_settings = difficulty_settings[difficulty] track.gp = current_word.GPs[index] @@ -162,7 +202,7 @@ func _on_current_progression_changed() -> void: func set_current_progression(p_current_progression: int) -> void: var previous_progression: int = current_progression current_progression = p_current_progression - Log.debug("BaseMinigame: Progression changed from %d to %d/%d for %s" % [previous_progression, current_progression, max_progression, Type.keys()[minigame_name]]) + Log.debug("BaseMinigame: Progression changed from %d to %d/%d for %s" % [previous_progression, current_progression, max_progression, TYPE_NAMES[minigame_name]]) consecutive_errors = 0 is_highlighting = false diff --git a/sources/minigames/frog/frog_minigame.tscn b/sources/minigames/frog/frog_minigame.tscn index 524feb9e..74c6229d 100644 --- a/sources/minigames/frog/frog_minigame.tscn +++ b/sources/minigames/frog/frog_minigame.tscn @@ -4,9 +4,7 @@ [ext_resource type="Script" uid="uid://b7q0v031ffg1v" path="res://sources/minigames/frog/frog_minigame.gd" id="2_0xg3r"] [ext_resource type="Texture2D" uid="uid://jvpu77isfi5b" path="res://assets/minigames/frog/graphics/gauge_icon_frog_empty.png" id="2_e38i1"] [ext_resource type="Texture2D" uid="uid://re7qgivb3n5w" path="res://assets/minigames/frog/graphics/gauge_icon_frog_full.png" id="3_vjlmb"] -[ext_resource type="PackedScene" uid="uid://sumrd1i3g6f7" path="res://sources/minigames/frog/river.tscn" id="5_3fy8q"] [ext_resource type="Texture2D" uid="uid://bgi4vveige3qv" path="res://assets/minigames/frog/graphics/background.png" id="6_t6p6q"] -[ext_resource type="PackedScene" uid="uid://bloyucpsbvpx8" path="res://sources/minigames/frog/frog.tscn" id="13_o6mls"] [node name="FrogMinigame" unique_id=37863016 instance=ExtResource("1_ng5er")] script = ExtResource("2_0xg3r") @@ -32,10 +30,7 @@ grow_horizontal = 2 grow_vertical = 2 mouse_filter = 2 -[node name="River" parent="GameRoot/Background" index="0" unique_id=1451318535 instance=ExtResource("5_3fy8q")] -layout_mode = 1 - -[node name="background" type="TextureRect" parent="GameRoot/Background" index="1" unique_id=1762725401] +[node name="background" type="TextureRect" parent="GameRoot/Background" index="0" unique_id=1762725401] layout_mode = 1 anchors_preset = 11 anchor_left = 1.0 @@ -99,11 +94,3 @@ offset_bottom = 250.0 grow_horizontal = 2 grow_vertical = 2 alignment = 1 - -[node name="Frog" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=1044684229 instance=ExtResource("13_o6mls")] -unique_name_in_owner = true -layout_mode = 0 -offset_left = 360.0 -offset_top = 900.0 -offset_right = 360.0 -offset_bottom = 900.0 diff --git a/sources/minigames/frog/lilypad_track.gd b/sources/minigames/frog/lilypad_track.gd index 6077624a..04b24973 100644 --- a/sources/minigames/frog/lilypad_track.gd +++ b/sources/minigames/frog/lilypad_track.gd @@ -3,8 +3,9 @@ extends Control signal lilypad_in_center(lilypad: Lilypad) -const LILYPAD_SCENE: PackedScene = preload("res://sources/minigames/frog/lilypad.tscn") +const LILYPAD_SCENE_PATH: String = "res://sources/minigames/frog/lilypad.tscn" +var _lilypad_scene: PackedScene var top_to_bottom: bool = false var is_stopped: bool = false var is_cleared: bool = false @@ -79,7 +80,9 @@ func pick_distractor() -> Dictionary: #region Lilypads func _spawn_lilypad() -> void: - var lilypad: Lilypad = LILYPAD_SCENE.instantiate() + if not _lilypad_scene: + _lilypad_scene = load(LILYPAD_SCENE_PATH) as PackedScene + var lilypad: Lilypad = _lilypad_scene.instantiate() lilypads.append(lilypad) add_child(lilypad) diff --git a/sources/minigames/jellyfish/jellyfish.gd b/sources/minigames/jellyfish/jellyfish.gd index 5d61e4fc..fbf59f62 100644 --- a/sources/minigames/jellyfish/jellyfish.gd +++ b/sources/minigames/jellyfish/jellyfish.gd @@ -4,8 +4,8 @@ extends Control signal pressed(stimulus: Dictionary) enum Colors { - Blue, - Pink, + BLUE, + PINK, } const ANIMATIONS_BODY: Array[SpriteFrames] = [ @@ -28,7 +28,7 @@ const SCALE_FACTOR: float = 0.2 if is_node_ready(): _apply_visuals() -var _color: int = Colors.Blue +var _color: int = Colors.BLUE var color: int: get: return _color set(value): @@ -62,7 +62,7 @@ func _ready() -> void: return var rand: float = randf() - color = Colors.Blue if rand < 0.7 else Colors.Pink + color = Colors.BLUE if rand < 0.7 else Colors.PINK var rand_frame: int = randi_range(0, animated_sprite_body.sprite_frames.get_frame_count("idle") - 1) animated_sprite_body.frame = rand_frame animated_sprite_arms.frame = rand_frame @@ -71,7 +71,7 @@ func _ready() -> void: func _apply_visuals() -> void: if boss: - animated_sprite_body.sprite_frames = ANIMATIONS_BODY[Colors.Pink] + animated_sprite_body.sprite_frames = ANIMATIONS_BODY[Colors.PINK] animated_sprite_arms.hide() return else: @@ -147,7 +147,7 @@ func delete() -> void: func idle_boss() -> void: text_box_sprite_2d.hide() - color = Colors.Pink + color = Colors.PINK scale = Vector2(0.45, 0.45) animated_sprite_body.stop() animated_sprite_arms.stop() diff --git a/sources/minigames/monkeys/coconut.gd b/sources/minigames/monkeys/coconut.gd index df44f51c..1bb22582 100644 --- a/sources/minigames/monkeys/coconut.gd +++ b/sources/minigames/monkeys/coconut.gd @@ -6,11 +6,12 @@ var text: String: text = value if label: label.text = text +# External, shared across all coconuts in the minigame. Set by the minigame before play. +var broken_fx: BrokenCoconutFX @onready var highlight_fx: HighlightFX = $HighlightFX @onready var sprite: Sprite2D = $Sprite2D @onready var label: Label = $Label -@onready var broken_coconut_fx: BrokenCoconutFX = $BrokenCoconutFX func _ready() -> void: @@ -26,7 +27,7 @@ func explode() -> void: highlight_fx.stop() sprite.hide() label.hide() - - await broken_coconut_fx.play() - + if broken_fx: + broken_fx.global_position = global_position + await broken_fx.play() queue_free() diff --git a/sources/minigames/monkeys/coconut.tscn b/sources/minigames/monkeys/coconut.tscn index 1eabfad6..4f7d52fc 100644 --- a/sources/minigames/monkeys/coconut.tscn +++ b/sources/minigames/monkeys/coconut.tscn @@ -4,7 +4,6 @@ [ext_resource type="Script" uid="uid://q6go00k3f50e" path="res://sources/minigames/monkeys/coconut.gd" id="1_yojn5"] [ext_resource type="PackedScene" uid="uid://cge0uyn30tcpv" path="res://sources/utils/fx/highlight.tscn" id="2_8nuxj"] [ext_resource type="LabelSettings" uid="uid://c4n6n26sxuxbh" path="res://resources/themes/minigames_label_settings_monkey_coconut.tres" id="4_50ros"] -[ext_resource type="PackedScene" uid="uid://cnt2q4hqn1wsq" path="res://sources/minigames/monkeys/broken_coconut_fx.tscn" id="5_ddd0v"] [node name="Coconut" type="Node2D" unique_id=458844620] script = ExtResource("1_yojn5") @@ -18,14 +17,18 @@ texture = ExtResource("1_fvymg") [node name="Label" type="Label" parent="." unique_id=1611286912] custom_minimum_size = Vector2(110, 2.08165e-12) -offset_left = -91.0 -offset_top = -100.0 -offset_right = 94.0 -offset_bottom = 101.0 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -144.0 +offset_top = -100.5 +offset_right = 144.0 +offset_bottom = 100.5 +grow_horizontal = 2 +grow_vertical = 2 theme_override_font_sizes/font_size = 70 -text = "e" label_settings = ExtResource("4_50ros") horizontal_alignment = 1 vertical_alignment = 1 - -[node name="BrokenCoconutFX" parent="." unique_id=745079414 instance=ExtResource("5_ddd0v")] diff --git a/sources/minigames/monkeys/monkey.gd b/sources/minigames/monkeys/monkey.gd index 16c7a937..7dbc88d5 100644 --- a/sources/minigames/monkeys/monkey.gd +++ b/sources/minigames/monkeys/monkey.gd @@ -4,6 +4,8 @@ extends Node2D signal pressed() signal dragged_into_self() +const COCONUT_SCENE: PackedScene = preload("res://sources/minigames/monkeys/coconut.tscn") + var locked: bool = true: set(value): locked = value or stunned @@ -21,11 +23,21 @@ var stimulus: Dictionary = {}: else: coconut.text = "" drag_preview_label.text = "" +# Shared explosion FX owned by the minigame. Propagated to the monkey's coconut on assign. +var broken_fx: BrokenCoconutFX: + set(value): + broken_fx = value + if coconut: + coconut.broken_fx = value var blink_counter: int = 0 var blink_delay: int = 3 var blink_random: int = 3 var grab_animation_name: String = "grab" var grab_time: float = 1.0 +# Captured on _ready so reset_coconut can spawn replacements with the scene-designed transform. +var _coconut_initial_position: Vector2 +var _coconut_initial_rotation: float +var _coconut_initial_scale: Vector2 @onready var stars: AnimatedSprite2D = $Stars @onready var coconut: Coconut = $Coconut @@ -40,6 +52,22 @@ var grab_time: float = 1.0 func _ready() -> void: (button as Control).set_drag_forwarding(_get_drag_data, _can_drop_data, _drop_data) grab_time = Utils.get_animation_duration(animated_sprite_2d, grab_animation_name) + _coconut_initial_position = coconut.position + _coconut_initial_rotation = coconut.rotation + _coconut_initial_scale = coconut.scale + + +# Spawn a fresh coconut child with the scene-designed transform. Called after the +# previous one was reparented/freed during a throw. +func reset_coconut() -> void: + var new_coconut: Coconut = COCONUT_SCENE.instantiate() + new_coconut.position = _coconut_initial_position + new_coconut.rotation = _coconut_initial_rotation + new_coconut.scale = _coconut_initial_scale + new_coconut.broken_fx = broken_fx + new_coconut.hide() + add_child(new_coconut) + coconut = new_coconut func _on_button_pressed() -> void: diff --git a/sources/minigames/monkeys/monkeys_minigame.gd b/sources/minigames/monkeys/monkeys_minigame.gd index 448c7c51..279852a0 100644 --- a/sources/minigames/monkeys/monkeys_minigame.gd +++ b/sources/minigames/monkeys/monkeys_minigame.gd @@ -1,9 +1,9 @@ extends WordsMinigame enum Audio { - SendToKing, - SendToPlank, - SendToMonkey, + SEND_TO_KING, + SEND_TO_PLANK, + SEND_TO_MONKEY, } const MONKEY_SCENE: PackedScene = preload("res://sources/minigames/monkeys/monkey.tscn") @@ -37,6 +37,7 @@ var is_locked: bool = true: @onready var word_label: RichTextLabel = $GameRoot/TextPlank/Label @onready var parabola_summit: Control = $GameRoot/ParabolaSummit @onready var text_plank: Sprite2D = $GameRoot/TextPlank +@onready var broken_coconut_fx: BrokenCoconutFX = $GameRoot/BrokenCoconutFX # Find and set the parameters of the minigame, like the number of lives or the victory conditions. @@ -47,14 +48,16 @@ func _setup_minigame() -> void: var settings: DifficultySettings = difficulty_settings[difficulty] for index: int in range(settings.distractors_count + 1): + await get_tree().process_frame Log.trace("MonkeysMinigame: SetupMinigame: Instantiate new monkey") var monkey: Monkey = MONKEY_SCENE.instantiate() monkeys_node.add_child(monkey) monkeys.append(monkey) - + monkey.broken_fx = broken_coconut_fx + var pos: Node2D = possible_positions_parent.get_child(index) as Node2D monkey.global_position = pos.global_position - + monkey.pressed.connect(_on_monkey_pressed.bind(monkey)) monkey.dragged_into_self.connect(_on_monkey_pressed.bind(monkey)) @@ -72,9 +75,10 @@ func _setup_minigame() -> void: ) _update_label(0) - - # Pre-warm particle shaders to avoid stutter on first coconut explosion - await monkeys[0].coconut.broken_coconut_fx.warm_up() + + # Pre-warm particle shaders on the single shared FX instance to avoid stutter on first explosion. + await get_tree().process_frame + await broken_coconut_fx.warm_up() func _start() -> void: @@ -119,18 +123,19 @@ func _play_monkey_stimulus(monkey: Monkey) -> void: func _get_coconut_from_monkey_to_king(monkey: Monkey) -> Node2D: monkey.stop_highlight() - + await monkey.play("start_throw") monkey.play("finish_throw") - - audio_player.stream = AUDIO_STREAMS[Audio.SendToKing] + + audio_player.stream = AUDIO_STREAMS[Audio.SEND_TO_KING] audio_player.play() - - var coconut: Coconut = monkey.coconut.duplicate() - monkey.coconut.hide() - game_root.add_child(coconut) - coconut.text = monkey.coconut.text - coconut.global_transform = monkey.coconut.global_transform + + # Reparent the monkey's own coconut (keeps global transform) and give the monkey a + # fresh one. Avoids allocating a new Coconut subtree — including particle systems — + # on every throw, which was a likely cause of stutters / crashes on low-end devices. + var coconut: Coconut = monkey.coconut + coconut.reparent(game_root) + monkey.reset_coconut() var tween: Tween = create_tween() tween.set_parallel() tween.tween_property(coconut, "global_position:x", (coconut.global_position.x + king.catch_position.global_position.x) / 2, throw_to_king_duration / 2).set_trans(Tween.TRANS_LINEAR) @@ -167,7 +172,7 @@ func _on_coconut_thrown(monkey: Monkey) -> void: if _is_gp_right(monkey.stimulus): await king.play("start_right") - audio_player.stream = AUDIO_STREAMS[Audio.SendToPlank] + audio_player.stream = AUDIO_STREAMS[Audio.SEND_TO_PLANK] audio_player.play() king.play("finish_right") var tween: Tween = create_tween() @@ -179,7 +184,7 @@ func _on_coconut_thrown(monkey: Monkey) -> void: current_word_progression += 1 else: await king.play("start_wrong") - audio_player.stream = AUDIO_STREAMS[Audio.SendToMonkey] + audio_player.stream = AUDIO_STREAMS[Audio.SEND_TO_MONKEY] audio_player.play() king.play("finish_wrong") var tween: Tween = create_tween() @@ -201,7 +206,6 @@ func _on_current_word_progression_changed() -> void: else: monkey.stimulus = _get_distractor() monkey.stunned = false - monkey.coconut.show() var coroutine: Coroutine = Coroutine.new() if audio_player.playing: diff --git a/sources/minigames/monkeys/monkeys_minigame.tscn b/sources/minigames/monkeys/monkeys_minigame.tscn index b892bdc2..ffb96c93 100644 --- a/sources/minigames/monkeys/monkeys_minigame.tscn +++ b/sources/minigames/monkeys/monkeys_minigame.tscn @@ -11,6 +11,11 @@ [ext_resource type="Texture2D" uid="uid://blejqny5syems" path="res://assets/minigames/monkeys/graphic/billboard.png" id="8_j0b56"] [ext_resource type="FontFile" uid="uid://bj2rpti6g24kk" path="res://assets/fonts/kalulu_mulish_bold.otf" id="10_ebf48"] [ext_resource type="Texture2D" uid="uid://u2x8lg54e1g" path="res://assets/minigames/monkeys/graphic/caterpillar.png" id="11_ebf48"] +[ext_resource type="PackedScene" uid="uid://cnt2q4hqn1wsq" path="res://sources/minigames/monkeys/broken_coconut_fx.tscn" id="12_brkfx"] +[ext_resource type="Script" uid="uid://cgtd34f7vi2tj" path="res://sources/utils/clouds_manager.gd" id="13_xvtxv"] +[ext_resource type="Texture2D" uid="uid://rx270y4n7tul" path="res://assets/minigames/parakeets/graphic/cloud_1.png" id="14_uqlx5"] +[ext_resource type="Texture2D" uid="uid://dphj3hqfnnw4p" path="res://assets/minigames/parakeets/graphic/cloud_2.png" id="15_8kfwv"] +[ext_resource type="Texture2D" uid="uid://1btgagsporxa" path="res://assets/minigames/parakeets/graphic/cloud_3.png" id="16_j4fko"] [node name="MonkeysMinigame" unique_id=2041470235 instance=ExtResource("1_6nhsm")] script = ExtResource("2_12lw5") @@ -44,7 +49,25 @@ offset_right = 2561.0 offset_bottom = 1686.0 texture = ExtResource("4_awer8") -[node name="Ground" type="TextureRect" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="2" unique_id=220986790] +[node name="Clouds" type="Node2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="2" unique_id=2057497713] +script = ExtResource("13_xvtxv") +max_speed = 80.0 +min_y = 100.0 +max_y = 300.0 + +[node name="cloud_1" type="Sprite2D" parent="GameRoot/Clouds" index="0" unique_id=1028368352] +position = Vector2(623, 253.5) +texture = ExtResource("14_uqlx5") + +[node name="cloud_2" type="Sprite2D" parent="GameRoot/Clouds" index="1" unique_id=972157516] +position = Vector2(1088, 256) +texture = ExtResource("15_8kfwv") + +[node name="cloud_3" type="Sprite2D" parent="GameRoot/Clouds" index="2" unique_id=1712138587] +position = Vector2(1904, 248) +texture = ExtResource("16_j4fko") + +[node name="Ground" type="TextureRect" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=220986790] custom_minimum_size = Vector2(2.08165e-12, 250) layout_mode = 0 offset_left = -0.5 @@ -53,7 +76,7 @@ offset_right = 2560.5 offset_bottom = 1925.5 texture = ExtResource("4_m2hoh") -[node name="PalmTreeMonkeys" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=1834595774] +[node name="PalmTreeMonkeys" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="4" unique_id=1834595774] position = Vector2(1914, 870) scale = Vector2(1.4, 1) texture = ExtResource("5_2qxen") @@ -67,14 +90,14 @@ position = Vector2(-36.428574, 39) [node name="Position3" type="Marker2D" parent="GameRoot/PalmTreeMonkeys" index="2" unique_id=624156180] position = Vector2(-36.428574, 528) -[node name="PlamTreeKing" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="4" unique_id=1643389803] +[node name="PlamTreeKing" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="5" unique_id=1643389803] position = Vector2(819, 1039) texture = ExtResource("6_f5ri1") [node name="KingMonkey" parent="GameRoot/PlamTreeKing" index="0" unique_id=450360249 instance=ExtResource("7_43p1x")] position = Vector2(7, -701) -[node name="TextPlank" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="5" unique_id=801038290] +[node name="TextPlank" type="Sprite2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="6" unique_id=801038290] position = Vector2(863, 1574) texture = ExtResource("8_j0b56") @@ -91,7 +114,12 @@ text = "gf[color=green]m[/color]" horizontal_alignment = 1 vertical_alignment = 1 -[node name="Monkeys" type="Control" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="6" unique_id=1039805988] +[node name="Caterpillar" type="Sprite2D" parent="GameRoot/TextPlank" index="1" unique_id=229164884] +position = Vector2(261, -224.99988) +scale = Vector2(0.31, 0.31) +texture = ExtResource("11_ebf48") + +[node name="Monkeys" type="Control" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="7" unique_id=1039805988] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -99,14 +127,12 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="ParabolaSummit" type="Control" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="7" unique_id=321509035] +[node name="ParabolaSummit" type="Control" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="8" unique_id=321509035] anchors_preset = 0 offset_left = 1316.0 offset_top = 36.0 offset_right = 1356.0 offset_bottom = 76.0 -[node name="Caterpillar" type="Sprite2D" parent="." index="4" unique_id=229164884] -position = Vector2(1124, 1349.0001) -scale = Vector2(0.31, 0.31) -texture = ExtResource("11_ebf48") +[node name="BrokenCoconutFX" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="9" unique_id=1488112341 instance=ExtResource("12_brkfx")] +layout_mode = 0 diff --git a/sources/minigames/parakeets/parakeet.gd b/sources/minigames/parakeets/parakeet.gd index b8ee49a8..8b48d077 100644 --- a/sources/minigames/parakeets/parakeet.gd +++ b/sources/minigames/parakeets/parakeet.gd @@ -4,9 +4,9 @@ extends Node2D signal pressed() enum Colors { - Red, - Green, - Yellow, + RED, + GREEN, + YELLOW, } const ANIMATIONS: Array[SpriteFrames] = [ @@ -21,7 +21,7 @@ const FEATHERS_ANIMATIONS: Array[SpriteFrames] = [ ] @export var sad_duration: float = 2.0 -@export var color: Colors = Colors.Red: +@export var color: Colors = Colors.RED: set(value): color = value if animated_sprite: @@ -141,7 +141,7 @@ func wrong() -> void: func idle_boss() -> void: text_box_sprite_2d.hide() - color = Colors.Green + color = Colors.GREEN animated_sprite.play("idle_front") animated_sprite.stop() diff --git a/sources/minigames/parakeets/parakeets_minigame.gd b/sources/minigames/parakeets/parakeets_minigame.gd index 5939c260..4dfa3f1a 100644 --- a/sources/minigames/parakeets/parakeets_minigame.gd +++ b/sources/minigames/parakeets/parakeets_minigame.gd @@ -1,16 +1,16 @@ extends Minigame enum State { - Locked, - Idle, - Selected1, - Selected2, + LOCKED, + IDLE, + SELECTED_1, + SELECTED_2, } enum Audio { - Fly, - Happy, - Turn, - Win, + FLY, + HAPPY, + TURN, + WIN, } const AUDIO_STREAMS: Array[AudioStreamMP3] = [ @@ -32,7 +32,7 @@ const PARAKEET_SCENE: PackedScene = preload("res://sources/minigames/parakeets/p var parakeets: Array[Parakeet] = [] var selected: Array[Parakeet] = [] -var state: State = State.Locked +var state: State = State.LOCKED @onready var branches: Node2D = $GameRoot/TreeTrunk/Branches @onready var possible_start_positions_parent: Control = $GameRoot/FlyFrom @@ -97,6 +97,9 @@ func _setup_minigame() -> void: # Find the stimuli and distractions of the minigame. func _find_stimuli_and_distractions() -> void: stimuli = Database.get_gps_for_lesson(lesson_nb, true) + # Only select stimuli with 1 letter, not more + stimuli = stimuli.filter(func(stimulus: Dictionary) -> bool: + return (stimulus.Grapheme as String).length() == 1) func _start() -> void: @@ -114,30 +117,30 @@ func _start() -> void: func _on_parakeet_pressed(parakeet: Parakeet) -> void: match state: - State.Selected2, State.Locked: + State.SELECTED_2, State.LOCKED: return - State.Selected1: - state = State.Locked + State.SELECTED_1: + state = State.LOCKED if parakeet in selected: selected.erase(parakeet) await _turn(parakeet, true) - state = State.Idle + state = State.IDLE else: selected.append(parakeet) await _turn(parakeet, false) - state = State.Selected2 + state = State.SELECTED_2 _log_new_response({"pair": [selected[0].stimulus, selected[1].stimulus]}, {"pair": [selected[0].stimulus, selected[0].stimulus]}) if selected[0].stimulus.Grapheme == selected[1].stimulus.Grapheme: _correct() else: _wrong() - State.Idle: - state = State.Locked + State.IDLE: + state = State.LOCKED selected.append(parakeet) await _turn(parakeet, false) - state = State.Selected1 + state = State.SELECTED_1 func _correct() -> void: @@ -151,7 +154,7 @@ func _correct() -> void: await _fly_to(nest_positions) await _make_selected_coo() _fly_to(fly_away_positions) - state = State.Idle + state = State.IDLE selected.clear() @@ -183,14 +186,14 @@ func _present_parakeets() -> void: for parakeet: Parakeet in parakeets: coroutine.add_future(_turn.bind(parakeet, true)) await coroutine.join_all() - state = State.Idle + state = State.IDLE func _make_selected_happy() -> void: for parakeet: Parakeet in selected: parakeet.right() parakeet.happy() - audio_player.stream = AUDIO_STREAMS[Audio.Happy] + audio_player.stream = AUDIO_STREAMS[Audio.HAPPY] audio_player.play() await audio_player.finished @@ -206,7 +209,7 @@ func _make_selected_sad() -> void: func _make_selected_coo() -> void: for parakeet: Parakeet in selected: parakeet.idle() - audio_player.stream = AUDIO_STREAMS[Audio.Win] + audio_player.stream = AUDIO_STREAMS[Audio.WIN] audio_player.play() await audio_player.finished @@ -216,7 +219,7 @@ func _fly_to(targets: Array[Vector2]) -> void: parent.move_child(selected[0], parent.get_child_count() - 1) parent.move_child(selected[1], parent.get_child_count() - 1) var coroutine: Coroutine = Coroutine.new() - audio_player.stream = AUDIO_STREAMS[Audio.Fly] + audio_player.stream = AUDIO_STREAMS[Audio.FLY] audio_player.play() coroutine.add_future(audio_player.finished) coroutine.add_future(selected[0].fly_to.bind(targets[0], fly_duration)) @@ -226,7 +229,7 @@ func _fly_to(targets: Array[Vector2]) -> void: func _turn(parakeet: Parakeet, to_back: bool) -> void: if not audio_player.playing: - audio_player.stream = AUDIO_STREAMS[Audio.Turn] + audio_player.stream = AUDIO_STREAMS[Audio.TURN] audio_player.play() if to_back: await parakeet.turn_to_back() @@ -237,7 +240,7 @@ func _turn(parakeet: Parakeet, to_back: bool) -> void: func _flying_arrival(to: Array[Vector2]) -> void: assert(parakeets.size() <= to.size(), "Some parakeets don't have a destination") var coroutine: Coroutine = Coroutine.new() - audio_player.stream = AUDIO_STREAMS[Audio.Fly] + audio_player.stream = AUDIO_STREAMS[Audio.FLY] audio_player.play() coroutine.add_future(audio_player.finished) for index: int in range(parakeets.size()): diff --git a/sources/minigames/parakeets/parakeets_minigame.tscn b/sources/minigames/parakeets/parakeets_minigame.tscn index ced3f2b3..40a225d1 100644 --- a/sources/minigames/parakeets/parakeets_minigame.tscn +++ b/sources/minigames/parakeets/parakeets_minigame.tscn @@ -19,7 +19,7 @@ script = ExtResource("2_x6xn5") fly_duration = 3.0 minigame_name = 2 -lesson_nb = 8 +lesson_nb = 60 difficulty = 4 max_number_of_lives = 5 diff --git a/sources/minigames/penguin/penguin_minigame.gd b/sources/minigames/penguin/penguin_minigame.gd index 1380bdd4..14a57659 100644 --- a/sources/minigames/penguin/penguin_minigame.gd +++ b/sources/minigames/penguin/penguin_minigame.gd @@ -1,6 +1,7 @@ extends Minigame const LABEL_SCENE: PackedScene = preload("res://sources/minigames/penguin/penguin_label.tscn") +const LABEL_SETTINGS: LabelSettings = preload("res://resources/themes/minigames_label_settings_penguins.tres") var current_word_progression: int = 0: set = _set_current_word_progression var max_word_progression: int = 0 @@ -93,17 +94,25 @@ func _setup_word_progression() -> void: labels.clear() var stimulus: Dictionary = _get_current_stimulus() - + var sentence_text: String = stimulus.get("Sentence", "") as String + var opener: String = _extract_sentence_opener(sentence_text) + var terminator: String = _extract_sentence_terminator(sentence_text) + var first_gp: bool = true var last_word_id: int = -1 var word_container: HBoxContainer - + for gp: Dictionary in stimulus.GPs: if gp.WordID != last_word_id: last_word_id = gp.WordID word_container = HBoxContainer.new() sentence_container.add_child(word_container) - + if first_gp and not opener.is_empty(): + var opener_label: Label = Label.new() + opener_label.text = opener + opener_label.label_settings = LABEL_SETTINGS + word_container.add_child(opener_label) + var label: PenguinLabel = LABEL_SCENE.instantiate() if first_gp: label.capitalized = true @@ -112,10 +121,16 @@ func _setup_word_progression() -> void: word_container.add_child(label) label.pressed.connect(_on_snowball_thrown.bind(label)) labels.append(label) - + if gp.Type == 0: max_word_progression += 1 - + + if word_container and not terminator.is_empty(): + var terminator_label: Label = Label.new() + terminator_label.text = terminator + terminator_label.label_settings = LABEL_SETTINGS + word_container.add_child(terminator_label) + setup_sentence_background() current_word_progression = 0 @@ -164,6 +179,28 @@ func _is_silent(gp: Dictionary) -> bool: return gp.Type == 0 +# Returns the trailing punctuation that closes the sentence (e.g. ".", "?", "!", "...", "?!"). +# Returns an empty string if none is found. +func _extract_sentence_terminator(sentence: String) -> String: + const TERMINATORS: PackedStringArray = [".", "?", "!", "…"] + var trimmed: String = sentence.strip_edges() + var end_index: int = trimmed.length() + while end_index > 0 and trimmed.substr(end_index - 1, 1) in TERMINATORS: + end_index -= 1 + return trimmed.substr(end_index) + + +# Returns the leading punctuation that opens the sentence (e.g. Spanish "¿", "¡", "¿¡"). +# Returns an empty string if none is found. +func _extract_sentence_opener(sentence: String) -> String: + const OPENERS: PackedStringArray = ["¿", "¡"] + var trimmed: String = sentence.strip_edges() + var end_index: int = 0 + while end_index < trimmed.length() and trimmed.substr(end_index, 1) in OPENERS: + end_index += 1 + return trimmed.substr(0, end_index) + + func _set_current_word_progression(p_current_word_progression: int) -> void: current_word_progression = p_current_word_progression if current_word_progression == max_word_progression: diff --git a/sources/minigames/penguin/penguin_minigame.tscn b/sources/minigames/penguin/penguin_minigame.tscn index b8262ae2..41bca4f5 100644 --- a/sources/minigames/penguin/penguin_minigame.tscn +++ b/sources/minigames/penguin/penguin_minigame.tscn @@ -6,12 +6,17 @@ [ext_resource type="Texture2D" uid="uid://kwcp3ondyggo" path="res://assets/minigames/penguin/graphic/gauge_icon_penguin_empty.png" id="3_gdpi3"] [ext_resource type="PackedScene" uid="uid://b78362g1yif2n" path="res://sources/minigames/penguin/penguin.tscn" id="4_txvyj"] [ext_resource type="Texture2D" uid="uid://dq23np4euf6da" path="res://assets/minigames/penguin/graphic/gauge_icon_penguin_full.png" id="4_yua7j"] +[ext_resource type="Script" uid="uid://cgtd34f7vi2tj" path="res://sources/utils/clouds_manager.gd" id="6_ikkck"] [ext_resource type="Texture2D" uid="uid://b2bcmo1keh217" path="res://assets/minigames/ants/graphics/sentence_text_box.png" id="7_8iqp0"] +[ext_resource type="Texture2D" uid="uid://rx270y4n7tul" path="res://assets/minigames/parakeets/graphic/cloud_1.png" id="7_qq4ih"] +[ext_resource type="Texture2D" uid="uid://dphj3hqfnnw4p" path="res://assets/minigames/parakeets/graphic/cloud_2.png" id="8_mh8b7"] +[ext_resource type="Texture2D" uid="uid://1btgagsporxa" path="res://assets/minigames/parakeets/graphic/cloud_3.png" id="9_b75qo"] [node name="PenguinMinigame" unique_id=1041323901 instance=ExtResource("1_s6yuv")] script = ExtResource("2_ncha4") minigame_name = 8 lesson_nb = 60 +difficulty = 4 max_number_of_lives = 5 max_progression = 5 @@ -30,50 +35,60 @@ grow_horizontal = 2 grow_vertical = 2 texture = ExtResource("3_8crb3") -[node name="Penguin" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="1" unique_id=446017555 instance=ExtResource("4_txvyj")] +[node name="Clouds" type="Node2D" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="1" unique_id=1471723126] +script = ExtResource("6_ikkck") +max_speed = 80.0 +min_y = 100.0 +max_y = 300.0 + +[node name="cloud_1" type="Sprite2D" parent="GameRoot/Clouds" index="0" unique_id=772964697] +z_index = -3 +position = Vector2(623, 253.5) +texture = ExtResource("7_qq4ih") + +[node name="cloud_2" type="Sprite2D" parent="GameRoot/Clouds" index="1" unique_id=658891026] +z_index = -3 +position = Vector2(1088, 256) +texture = ExtResource("8_mh8b7") + +[node name="cloud_3" type="Sprite2D" parent="GameRoot/Clouds" index="2" unique_id=1388350244] +z_index = -3 +position = Vector2(1904, 248) +texture = ExtResource("9_b75qo") + +[node name="Penguin" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="2" unique_id=446017555 instance=ExtResource("4_txvyj")] position = Vector2(625, 1398.5) -[node name="SentenceBackground" type="HFlowContainer" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="2" unique_id=414621906] +[node name="MarginContainer" type="MarginContainer" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=946035874] +layout_mode = 1 +anchors_preset = -1 +anchor_top = 0.35 +anchor_bottom = 0.35 +offset_left = 400.0 +offset_right = 470.0 +grow_vertical = 2 +theme_override_constants/margin_left = 20 + +[node name="SentenceBackground" type="HFlowContainer" parent="GameRoot/MarginContainer" index="0" unique_id=419813655] unique_name_in_owner = true visible = false custom_minimum_size = Vector2(0, 159) -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -800.0 -offset_top = -630.0 -offset_right = 1008.0 -offset_bottom = -130.0 -grow_horizontal = 2 -grow_vertical = 2 +layout_mode = 2 mouse_filter = 2 -theme_override_constants/v_separation = 20 +theme_override_constants/v_separation = 25 alignment = 1 -[node name="TextureRect" type="TextureRect" parent="GameRoot/SentenceBackground" index="0" unique_id=655579677] -z_index = -2 +[node name="TextureRect" type="TextureRect" parent="GameRoot/MarginContainer/SentenceBackground" index="0" unique_id=1032993373] layout_mode = 2 texture = ExtResource("7_8iqp0") -stretch_mode = 2 -[node name="Sentence" type="HFlowContainer" parent="GameRoot" parent_id_path=PackedInt32Array(1053321881) index="3" unique_id=162088451] +[node name="SentenceMargin" type="MarginContainer" parent="GameRoot/MarginContainer" index="1" unique_id=1134881747] +layout_mode = 2 +theme_override_constants/margin_left = 50 + +[node name="Sentence" type="HFlowContainer" parent="GameRoot/MarginContainer/SentenceMargin" index="0" unique_id=1061614278] unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -800.0 -offset_top = -630.0 -offset_right = 1008.0 -offset_bottom = -130.0 -grow_horizontal = 2 -grow_vertical = 2 +layout_mode = 2 mouse_filter = 2 -theme_override_constants/h_separation = 48 -theme_override_constants/v_separation = 20 -alignment = 1 +theme_override_constants/h_separation = 45 +theme_override_constants/v_separation = 25 diff --git a/sources/minigames/turtles/turtle.gd b/sources/minigames/turtles/turtle.gd index f3b186a4..26d19389 100644 --- a/sources/minigames/turtles/turtle.gd +++ b/sources/minigames/turtles/turtle.gd @@ -4,25 +4,22 @@ extends Node2D signal pressed(gp: Dictionary) signal animation_changed(position: Vector2) -enum Colors { - Green, - Khaki, - Purple, -} - -const ANIMATIONS: Array[SpriteFrames] = [ - preload("res://sources/minigames/turtles/green_turtle_animations.tres"), - preload("res://sources/minigames/turtles/khaki_turtle_animations.tres"), - preload("res://sources/minigames/turtles/purple_turtle_animations.tres") -] const TURTLE_BACK_RIGHT: CompressedTexture2D = preload("res://assets/minigames/turtles/graphic/turtle_back_right.png") const TURTLE_BACK_WRONG: CompressedTexture2D = preload("res://assets/minigames/turtles/graphic/turtle_back_wrong.png") +# Only used when a turtle lands on the island, so they're instantiated on +# demand instead of sitting idle inside every spawned turtle. +const RIGHT_FX_SCENE: PackedScene = preload("res://sources/utils/fx/right.tscn") +const WRONG_FX_SCENE: PackedScene = preload("res://sources/utils/fx/wrong.tscn") +const RIGHT_STARS_SCENE: PackedScene = preload("res://sources/utils/fx/right_stars.tscn") -@export var color: Colors = Colors.Purple: +# Set by the minigame after the random color is picked, so only one of the three +# 6400x4800 turtle spritesheets is ever in memory. +@export var sprite_frames: SpriteFrames: set(value): - color = value - if sprite: - sprite.sprite_frames = ANIMATIONS[color] + sprite_frames = value + if sprite and value: + sprite.sprite_frames = value + sprite.play("swim") var gp: Dictionary = {}: set(value): @@ -37,6 +34,9 @@ var direction: Vector2 = Vector2(0,-1): var is_moving: bool = true var is_changing_direction: bool = false var is_visible_on_screen: bool = false +var right_fx: RightFX +var right_stars: RightStarsFX +var wrong_fx: WrongFX @onready var body: Node2D = $Body @onready var body_back: Sprite2D = $Body/AnimatedSprite2D/Sprite2D_Back @@ -45,9 +45,8 @@ var is_visible_on_screen: bool = false @onready var head_area_collision_shape: CollisionShape2D = $Body/HeadArea/CollisionShape2D @onready var body_area_collision_shape: CollisionShape2D = $Body/BodyArea/CollisionShape2D @onready var highlight_fx: HighlightFX = %HighlightFX -@onready var right_fx: RightFX = %RightFX -@onready var right_stars: RightStarsFX = %Right_Stars -@onready var wrong_fx: WrongFX = %WrongFX +@onready var back_fx: Control = $BackFX +@onready var front_fx: Control = $FrontFX @onready var delete_timer: Timer = $DeleteTimer @onready var audio_stream_player: AudioStreamPlayer2D = $AudioStreamPlayer2D @@ -92,6 +91,28 @@ func highlight(value: bool = true) -> void: highlight_fx.stop() +func _ensure_right_fx() -> void: + if right_fx: + return + right_fx = RIGHT_FX_SCENE.instantiate() + right_fx.set_anchors_and_offsets_preset(Control.PRESET_CENTER) + right_fx.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + right_fx.size_flags_vertical = Control.SIZE_SHRINK_CENTER + back_fx.add_child(right_fx) + right_stars = RIGHT_STARS_SCENE.instantiate() + front_fx.add_child(right_stars) + + +func _ensure_wrong_fx() -> void: + if wrong_fx: + return + wrong_fx = WRONG_FX_SCENE.instantiate() + wrong_fx.set_anchors_and_offsets_preset(Control.PRESET_CENTER) + wrong_fx.size_flags_horizontal = Control.SIZE_SHRINK_CENTER + wrong_fx.size_flags_vertical = Control.SIZE_SHRINK_CENTER + back_fx.add_child(wrong_fx) + + func right() -> void: is_moving = false change_font_color_after_collision() @@ -99,6 +120,7 @@ func right() -> void: sprite.play("victory") await sprite.animation_finished sprite.play_backwards("victory") + _ensure_right_fx() right_fx.play() right_stars.play() await sprite.animation_finished @@ -109,6 +131,7 @@ func wrong() -> void: is_moving = false change_font_color_after_collision() body_back.texture = TURTLE_BACK_WRONG + _ensure_wrong_fx() wrong_fx.play() sprite.play("defeat") await sprite.animation_finished @@ -121,16 +144,21 @@ func change_font_color_after_collision() -> void: label.label_settings.font_color = Minigame.LABEL_COLOR_NEUTRAL -func disappear() -> void: +func disappear(fast: bool = false) -> void: is_moving = false head_area_collision_shape.set_deferred("disabled", true) body_area_collision_shape.set_deferred("disabled", true) - await get_tree().create_timer(randf_range(0.1, 0.2)).timeout + var speed_scale: float = 3.0 if fast else 1.0 + if fast: + sprite.speed_scale = speed_scale + else: + await get_tree().create_timer(randf_range(0.1, 0.2)).timeout sprite.play("disappear") + var fade_duration: float = sprite.sprite_frames.get_frame_count(sprite.animation) / sprite.sprite_frames.get_animation_speed(sprite.animation) / speed_scale var tween: Tween = create_tween() - tween.tween_property(label, "modulate:a", 0, sprite.sprite_frames.get_frame_count(sprite.animation) /sprite.sprite_frames.get_animation_speed(sprite.animation)) + tween.tween_property(label, "modulate:a", 0, fade_duration) var tween2: Tween = create_tween() - tween2.tween_property(body_back, "modulate:a", 0, sprite.sprite_frames.get_frame_count(sprite.animation) /sprite.sprite_frames.get_animation_speed(sprite.animation)) + tween2.tween_property(body_back, "modulate:a", 0, fade_duration) #endregion @@ -184,7 +212,7 @@ func _on_delete_timer_timeout() -> void: func _on_body_area_area_entered(_area: Area2D) -> void: - disappear() + disappear(true) #endregion diff --git a/sources/minigames/turtles/turtle.tscn b/sources/minigames/turtles/turtle.tscn index b32e7b40..038b8aba 100644 --- a/sources/minigames/turtles/turtle.tscn +++ b/sources/minigames/turtles/turtle.tscn @@ -1,13 +1,9 @@ [gd_scene format=3 uid="uid://djykrpdu58f3v"] [ext_resource type="Script" uid="uid://doq6myv45i4w6" path="res://sources/minigames/turtles/turtle.gd" id="1_vx1yr"] -[ext_resource type="PackedScene" uid="uid://cn2rw06pltyiu" path="res://sources/utils/fx/right.tscn" id="2_d5x3l"] [ext_resource type="PackedScene" uid="uid://cge0uyn30tcpv" path="res://sources/utils/fx/highlight.tscn" id="2_rllc5"] -[ext_resource type="PackedScene" uid="uid://dlmbxcgiv8tpr" path="res://sources/utils/fx/wrong.tscn" id="4_yhidj"] -[ext_resource type="SpriteFrames" uid="uid://gm2hqn76oaib" path="res://sources/minigames/turtles/purple_turtle_animations.tres" id="5_xbpgw"] [ext_resource type="Texture2D" uid="uid://bhahju7y2n5ke" path="res://assets/minigames/turtles/graphic/turtle_back_neutral.png" id="6_4juk7"] [ext_resource type="LabelSettings" uid="uid://dn32fpff81uu" path="res://resources/themes/minigames_label_settings_turtles.tres" id="6_8k7c6"] -[ext_resource type="PackedScene" uid="uid://cs6g7fhc0bjvh" path="res://sources/utils/fx/right_stars.tscn" id="8_xbpgw"] [ext_resource type="AudioStream" uid="uid://cmsn7q4fxnghr" path="res://assets/sfx/splash.mp3" id="42_p3fqk"] [ext_resource type="PackedScene" uid="uid://cjg6pgc7yfp1p" path="res://sources/utils/swipe_detector.tscn" id="49_0qwwy"] @@ -29,19 +25,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="RightFX" parent="BackFX" unique_id=1787877717 instance=ExtResource("2_d5x3l")] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 - [node name="HighlightFX" parent="BackFX" unique_id=462139651 instance=ExtResource("2_rllc5")] unique_name_in_owner = true layout_mode = 1 @@ -54,19 +37,6 @@ grow_horizontal = 2 grow_vertical = 2 scale = Vector2(0.6, 0.6) -[node name="WrongFX" parent="BackFX" unique_id=777978196 instance=ExtResource("4_yhidj")] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 4 -size_flags_vertical = 4 - [node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="." unique_id=799402224] stream = ExtResource("42_p3fqk") bus = &"Effects" @@ -77,9 +47,6 @@ bus = &"Effects" unique_name_in_owner = true position = Vector2(0, -16) scale = Vector2(0.8, 0.8) -sprite_frames = ExtResource("5_xbpgw") -animation = &"swim" -autoplay = "swim" [node name="Sprite2D_Back" type="Sprite2D" parent="Body/AnimatedSprite2D" unique_id=1980717066] position = Vector2(0, 19.999998) @@ -110,10 +77,17 @@ shape = SubResource("CapsuleShape2D_xsnve") debug_color = Color(0.870588, 0.117647, 0, 0.388235) [node name="Label" type="Label" parent="." unique_id=1496868599] -offset_left = -64.0 -offset_top = -88.0 -offset_right = 72.0 -offset_bottom = 72.0 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -68.0 +offset_top = -80.0 +offset_right = 68.0 +offset_bottom = 80.0 +grow_horizontal = 2 +grow_vertical = 2 label_settings = ExtResource("6_8k7c6") horizontal_alignment = 1 vertical_alignment = 1 @@ -132,9 +106,6 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="Right_Stars" parent="FrontFX" unique_id=1474432273 instance=ExtResource("8_xbpgw")] -unique_name_in_owner = true - [node name="DeleteTimer" type="Timer" parent="." unique_id=94467327] wait_time = 3.0 one_shot = true diff --git a/sources/minigames/turtles/turtles_minigame.gd b/sources/minigames/turtles/turtles_minigame.gd index 28578a9e..483c232e 100644 --- a/sources/minigames/turtles/turtles_minigame.gd +++ b/sources/minigames/turtles/turtles_minigame.gd @@ -7,6 +7,12 @@ const TURTLE_SCENE: PackedScene = preload("res://sources/minigames/turtles/turtl const MAX_TURTLE_COUNT: int = 5 # Defines the minimum distance between turtles when spawning them const MIN_DISTANCE: int = 500 +# Each spritesheet is ~123 MB of VRAM; never preload — load only the picked one. +const TURTLE_ANIMATIONS_PATHS: Array[String] = [ + "res://sources/minigames/turtles/green_turtle_animations.tres", + "res://sources/minigames/turtles/khaki_turtle_animations.tres", + "res://sources/minigames/turtles/purple_turtle_animations.tres", +] var difficulty_settings: Array[DifficultySettings] = [ DifficultySettings.new(.75, 200., 4.), @@ -22,7 +28,8 @@ var turtle_count: int = 0: can_spawn_turtle.emit() turtle_count = value var stimulus_spawned: bool = false -var color: Turtle.Colors +# Single shared SpriteFrames assigned to every spawned turtle this round. +var turtle_sprite_frames: SpriteFrames @onready var water: Water = $GameRoot/Water @onready var island: Island = $GameRoot/Island @@ -61,7 +68,12 @@ func _setup_minigame() -> void: func pick_random_color() -> void: - color = randi_range(0, Turtle.Colors.size() - 1) as Turtle.Colors + # Drop the previous color first so its ~123 MB texture can be freed by + # refcount before we load the next one (turtles still fading out also + # hold a ref, so peak overlap is brief). + turtle_sprite_frames = null + var index: int = randi_range(0, TURTLE_ANIMATIONS_PATHS.size() - 1) + turtle_sprite_frames = load(TURTLE_ANIMATIONS_PATHS[index]) func _highlight() -> void: @@ -121,7 +133,7 @@ func _on_spawn_timer_timeout() -> void: ) turtles.add_child(turtle) - turtle.color = color + turtle.sprite_frames = turtle_sprite_frames # Set the direction of the turtle var random_offset: float = deg_to_rad(randf_range(-5, 5)) diff --git a/sources/minigames/turtles/turtles_minigame.tscn b/sources/minigames/turtles/turtles_minigame.tscn index 4d9a8740..7e185b80 100644 --- a/sources/minigames/turtles/turtles_minigame.tscn +++ b/sources/minigames/turtles/turtles_minigame.tscn @@ -380,7 +380,7 @@ animations = [{ [node name="TurtlesMinigame" unique_id=115388830 instance=ExtResource("1_geqym")] script = ExtResource("2_f5de7") minigame_name = 6 -lesson_nb = 24 +lesson_nb = 60 difficulty = 4 max_number_of_lives = 5 max_progression = 5 diff --git a/sources/minigames/turtles/water.gd b/sources/minigames/turtles/water.gd index 84e45383..88999ff6 100644 --- a/sources/minigames/turtles/water.gd +++ b/sources/minigames/turtles/water.gd @@ -2,14 +2,34 @@ class_name Water extends TextureRect const WATER_RING_SCENE: PackedScene = preload("res://sources/utils/fx/water_ring.tscn") +# Rings are checked out for the full 3.0s particle lifetime. +# Worst case: 5 turtles (MAX_TURTLE_COUNT) each looping the swim animation +# every 8/12 = 0.667s emit ~7.5 rings/sec → ~23 concurrent in flight. +# We pre-allocate 24 and grow on demand if real usage ever exceeds that. +const POOL_SIZE: int = 24 @export var ring_color: Color +var _available_rings: Array[WaterRingFX] = [] + + +func _ready() -> void: + for _index: int in POOL_SIZE: + _available_rings.append(_make_ring()) + func spawn_water_ring(pos: Vector2) -> void: - var fx: WaterRingFX = WATER_RING_SCENE.instantiate() + var fx: WaterRingFX = _available_rings.pop_back() if not _available_rings.is_empty() else _make_ring() fx.position = pos - fx.modulate = ring_color - add_child(fx) + fx.show() await fx.play() - fx.queue_free() + fx.hide() + _available_rings.append(fx) + + +func _make_ring() -> WaterRingFX: + var fx: WaterRingFX = WATER_RING_SCENE.instantiate() + fx.modulate = ring_color + fx.hide() + add_child(fx) + return fx diff --git a/sources/minigames/turtles/water.gdshader b/sources/minigames/turtles/water.gdshader index 53c93f7d..f494a3d6 100644 --- a/sources/minigames/turtles/water.gdshader +++ b/sources/minigames/turtles/water.gdshader @@ -40,6 +40,8 @@ float circ(vec2 pos, vec2 c, float s) float waterlayer(vec2 uv) { + // Reduced from 73 to 42 circles by dropping radii < 0.01 — the smaller + // ones barely contributed visually but each circ() is ~10 GPU ops. uv = mod(uv, 1.0); float ret = 1.0; ret += circ(uv, vec2(0.37378, 0.277169), 0.0268181); @@ -52,71 +54,38 @@ float waterlayer(vec2 uv) ret += circ(uv, vec2(0.310149, 0.686637), 0.0128496); ret += circ(uv, vec2(0.928617, 0.195986), 0.0152041); ret += circ(uv, vec2(0.0438506, 0.868153), 0.0268601); - ret += circ(uv, vec2(0.308619, 0.194937), 0.00806102); - ret += circ(uv, vec2(0.349922, 0.449714), 0.00928667); ret += circ(uv, vec2(0.0449556, 0.953415), 0.023126); ret += circ(uv, vec2(0.117761, 0.503309), 0.0151272); ret += circ(uv, vec2(0.563517, 0.244991), 0.0292322); - ret += circ(uv, vec2(0.566936, 0.954457), 0.00981141); ret += circ(uv, vec2(0.0489944, 0.200931), 0.0178746); ret += circ(uv, vec2(0.569297, 0.624893), 0.0132408); ret += circ(uv, vec2(0.298347, 0.710972), 0.0114426); - ret += circ(uv, vec2(0.878141, 0.771279), 0.00322719); - ret += circ(uv, vec2(0.150995, 0.376221), 0.00216157); ret += circ(uv, vec2(0.119673, 0.541984), 0.0124621); ret += circ(uv, vec2(0.629598, 0.295629), 0.0198736); ret += circ(uv, vec2(0.334357, 0.266278), 0.0187145); ret += circ(uv, vec2(0.918044, 0.968163), 0.0182928); - ret += circ(uv, vec2(0.965445, 0.505026), 0.006348); - ret += circ(uv, vec2(0.514847, 0.865444), 0.00623523); - ret += circ(uv, vec2(0.710575, 0.0415131), 0.00322689); ret += circ(uv, vec2(0.71403, 0.576945), 0.0215641); ret += circ(uv, vec2(0.748873, 0.413325), 0.0110795); ret += circ(uv, vec2(0.0623365, 0.896713), 0.0236203); - ret += circ(uv, vec2(0.980482, 0.473849), 0.00573439); ret += circ(uv, vec2(0.647463, 0.654349), 0.0188713); - ret += circ(uv, vec2(0.651406, 0.981297), 0.00710875); ret += circ(uv, vec2(0.428928, 0.382426), 0.0298806); - ret += circ(uv, vec2(0.811545, 0.62568), 0.00265539); - ret += circ(uv, vec2(0.400787, 0.74162), 0.00486609); - ret += circ(uv, vec2(0.331283, 0.418536), 0.00598028); - ret += circ(uv, vec2(0.894762, 0.0657997), 0.00760375); ret += circ(uv, vec2(0.525104, 0.572233), 0.0141796); ret += circ(uv, vec2(0.431526, 0.911372), 0.0213234); - ret += circ(uv, vec2(0.658212, 0.910553), 0.000741023); ret += circ(uv, vec2(0.514523, 0.243263), 0.0270685); - ret += circ(uv, vec2(0.0249494, 0.252872), 0.00876653); ret += circ(uv, vec2(0.502214, 0.47269), 0.0234534); ret += circ(uv, vec2(0.693271, 0.431469), 0.0246533); ret += circ(uv, vec2(0.415, 0.884418), 0.0271696); - ret += circ(uv, vec2(0.149073, 0.41204), 0.00497198); - ret += circ(uv, vec2(0.533816, 0.897634), 0.00650833); ret += circ(uv, vec2(0.0409132, 0.83406), 0.0191398); ret += circ(uv, vec2(0.638585, 0.646019), 0.0206129); - ret += circ(uv, vec2(0.660342, 0.966541), 0.0053511); - ret += circ(uv, vec2(0.513783, 0.142233), 0.00471653); - ret += circ(uv, vec2(0.124305, 0.644263), 0.00116724); ret += circ(uv, vec2(0.99871, 0.583864), 0.0107329); - ret += circ(uv, vec2(0.894879, 0.233289), 0.00667092); - ret += circ(uv, vec2(0.246286, 0.682766), 0.00411623); ret += circ(uv, vec2(0.0761895, 0.16327), 0.0145935); ret += circ(uv, vec2(0.949386, 0.802936), 0.0100873); ret += circ(uv, vec2(0.480122, 0.196554), 0.0110185); ret += circ(uv, vec2(0.896854, 0.803707), 0.013969); - ret += circ(uv, vec2(0.292865, 0.762973), 0.00566413); - ret += circ(uv, vec2(0.0995585, 0.117457), 0.00869407); - ret += circ(uv, vec2(0.377713, 0.00335442), 0.0063147); ret += circ(uv, vec2(0.506365, 0.531118), 0.0144016); ret += circ(uv, vec2(0.408806, 0.894771), 0.0243923); - ret += circ(uv, vec2(0.143579, 0.85138), 0.00418529); ret += circ(uv, vec2(0.0902811, 0.181775), 0.0108896); - ret += circ(uv, vec2(0.780695, 0.394644), 0.00475475); - ret += circ(uv, vec2(0.298036, 0.625531), 0.00325285); - ret += circ(uv, vec2(0.218423, 0.714537), 0.00157212); - ret += circ(uv, vec2(0.658836, 0.159556), 0.00225897); ret += circ(uv, vec2(0.987324, 0.146545), 0.0288391); - ret += circ(uv, vec2(0.222646, 0.251694), 0.00092276); - ret += circ(uv, vec2(0.159826, 0.528063), 0.00605293); return max(ret, 0.0); } diff --git a/sources/ui/change_language_popup.gd b/sources/ui/change_language_popup.gd new file mode 100644 index 00000000..15565140 --- /dev/null +++ b/sources/ui/change_language_popup.gd @@ -0,0 +1,76 @@ +@tool +class_name ChangeLanguagePopup +extends CanvasLayer + +signal accepted(language: String) +signal refused() + +@export_multiline var content_text: String = "CHANGE_LANGUAGE_POPUP": set = _set_content_text +@export var close_on_action: bool = true + +var _locales: Array[String] = [] + +@onready var content_label: Label = %ChangeLanguageContentLabel +@onready var language_field: OptionButton = %ChangeLanguageLanguageField +@onready var confirm_button: Button = %ChangeLanguageConfirmButton +@onready var cancel_button: Button = %ChangeLanguageCancelButton + + +func _ready() -> void: + _set_content_text(content_text) + if not Engine.is_editor_hint(): + _populate_language_field() + + +func show_for_current_language(current_language: String) -> void: + _populate_language_field(current_language) + show() + + +func get_selected_language() -> String: + if not language_field: + return "" + var selected_id: int = language_field.get_selected_id() + if selected_id < 0 or selected_id >= _locales.size(): + return "" + return _locales[selected_id] + + +func _populate_language_field(preselected_locale: String = "") -> void: + if not language_field: + return + _locales.clear() + language_field.clear() + var index: int = 0 + for locale: String in Utils.SUPPORTED_LOCALES.keys(): + if not locale: + continue + var locale_name: String = Utils.SUPPORTED_LOCALES[locale] + if not locale_name: + continue + language_field.add_item(locale_name, index) + _locales.append(locale) + if locale == preselected_locale: + language_field.select(index) + index += 1 + if language_field.get_selected_id() == -1 and _locales.size() > 0: + language_field.select(0) + + +func _set_content_text(p_content_text: String) -> void: + content_text = p_content_text + if content_label: + content_label.text = content_text + + +func _on_confirm_button_pressed() -> void: + var selected_language: String = get_selected_language() + accepted.emit(selected_language) + if close_on_action: + hide() + + +func _on_cancel_button_pressed() -> void: + refused.emit() + if close_on_action: + hide() diff --git a/sources/ui/change_language_popup.gd.uid b/sources/ui/change_language_popup.gd.uid new file mode 100644 index 00000000..bab62365 --- /dev/null +++ b/sources/ui/change_language_popup.gd.uid @@ -0,0 +1 @@ +uid://bxqtlx38skcu3 diff --git a/sources/ui/change_language_popup.tscn b/sources/ui/change_language_popup.tscn new file mode 100644 index 00000000..9470a8e2 --- /dev/null +++ b/sources/ui/change_language_popup.tscn @@ -0,0 +1,92 @@ +[gd_scene format=3] + +[ext_resource type="Script" path="res://sources/ui/change_language_popup.gd" id="1_chglg"] +[ext_resource type="Theme" path="res://resources/themes/kalulu_theme.tres" id="2_chglg"] + +[sub_resource type="Gradient" id="Gradient_chglg"] +colors = PackedColorArray(0.2, 0.2, 0.2, 0.505882, 0.2, 0.2, 0.2, 0.505882) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_chglg"] +gradient = SubResource("Gradient_chglg") + +[node name="ChangeLanguagePopup" type="CanvasLayer"] +script = ExtResource("1_chglg") + +[node name="TextureRect" type="TextureRect" parent="."] +top_level = true +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 0 +texture = SubResource("GradientTexture1D_chglg") + +[node name="PanelContainer" type="PanelContainer" parent="TextureRect"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -20.0 +offset_top = -20.0 +offset_right = 20.0 +offset_bottom = 20.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_type_variation = &"PanelKalulu" + +[node name="VBoxContainer" type="VBoxContainer" parent="TextureRect/PanelContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="TextureRect/PanelContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 25 + +[node name="VBoxContainer" type="VBoxContainer" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 30 + +[node name="ChangeLanguageContentLabel" type="Label" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(1200, 0) +layout_mode = 2 +size_flags_vertical = 1 +theme_override_font_sizes/font_size = 60 +text = "CHANGE_LANGUAGE_POPUP" +autowrap_mode = 2 + +[node name="ChangeLanguageLanguageField" type="OptionButton" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 120) +layout_mode = 2 +theme = ExtResource("2_chglg") +theme_override_font_sizes/font_size = 60 +autowrap_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="ChangeLanguageConfirmButton" type="Button" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_type_variation = &"DangerButton" +theme_override_font_sizes/font_size = 70 +text = "VALIDATE" + +[node name="Separator" type="Control" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="ChangeLanguageCancelButton" type="Button" parent="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_font_sizes/font_size = 70 +text = "CANCEL" + +[connection signal="pressed" from="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/ChangeLanguageConfirmButton" to="." method="_on_confirm_button_pressed"] +[connection signal="pressed" from="TextureRect/PanelContainer/VBoxContainer/MarginContainer/VBoxContainer/HBoxContainer/ChangeLanguageCancelButton" to="." method="_on_cancel_button_pressed"] diff --git a/sources/utils/autoloads/database.gd b/sources/utils/autoloads/database.gd index 3e635b07..224f5ad7 100644 --- a/sources/utils/autoloads/database.gd +++ b/sources/utils/autoloads/database.gd @@ -104,13 +104,13 @@ func get_exercise_for_lesson(lesson_nb: int) -> Array[int]: INNER JOIN Lessons ON Lessons.ID = LessonsExercises.LessonID WHERE LessonNB == " + str(lesson_nb) db.query(query) - + # Exercise* == 0 means "no minigame in this slot": drop zeros so size = count. var result: Array[int] = [] for element: Dictionary in db.query_result: - result.append(element.Exercise1) - result.append(element.Exercise2) - result.append(element.Exercise3) - + for column: String in ["Exercise1", "Exercise2", "Exercise3"]: + var exercise_id: int = element[column] as int + if exercise_id > 0: + result.append(exercise_id) return result diff --git a/sources/utils/autoloads/music_manager.gd b/sources/utils/autoloads/music_manager.gd index 033d8ad2..6fa2164a 100644 --- a/sources/utils/autoloads/music_manager.gd +++ b/sources/utils/autoloads/music_manager.gd @@ -2,8 +2,8 @@ class_name MusicManagerClass extends Node enum Track { - Title, - Garden + TITLE, + GARDEN } const TRACKS: Array = [ @@ -16,7 +16,7 @@ const TRACKS: Array = [ func _ready() -> void: Log.trace("MusicManager: Ready - starting title track") - play(Track.Title) + play(Track.TITLE) func _on_music_player_finished() -> void: diff --git a/sources/utils/autoloads/scene_loader.gd b/sources/utils/autoloads/scene_loader.gd new file mode 100644 index 00000000..af414d9e --- /dev/null +++ b/sources/utils/autoloads/scene_loader.gd @@ -0,0 +1,70 @@ +extends Node +## Scene changer that keeps peak memory low on low-end devices. +## +## [method SceneTree.change_scene_to_file] loads the new scene while the old +## one is still fully resident, so transitions between heavy scenes (gardens, +## minigames) momentarily need the memory of both — enough to OOM-crash old +## tablets. This helper frees the current scene first, then streams the new +## scene from disk on a background thread so the main thread keeps rendering +## frames instead of freezing. +## +## Callers are expected to have covered the screen (OpeningCurtain closed) +## before calling [method change_scene]; the curtain stays visible while the +## tree has no current scene. + +## Scene shown if the requested scene fails to load, so the player is never +## stuck on a black screen. +const FALLBACK_SCENE_PATH: String = "res://sources/menus/main/main_menu.tscn" + +var _is_changing: bool = false + + +func change_scene(scene_path: String) -> void: + if _is_changing: + Log.warn("SceneLoader: Change to %s requested while another change is in progress; ignoring" % scene_path) + return + if not ResourceLoader.exists(scene_path): + Log.error("SceneLoader: Scene does not exist: %s" % scene_path) + return + _is_changing = true + # Defer so the calling scene is never freed while one of its methods is + # still on the stack. + _change_scene_deferred.call_deferred(scene_path) + + +func _change_scene_deferred(scene_path: String) -> void: + var tree: SceneTree = get_tree() + # Free the old scene before loading the new one: this roughly halves the + # memory peak of the transition. + if tree.current_scene: + tree.unload_current_scene() + var error: Error = ResourceLoader.load_threaded_request(scene_path) + if error != OK: + Log.error("SceneLoader: Could not start loading %s (error %s)" % [scene_path, error_string(error)]) + _finish_with_fallback(tree, scene_path) + return + var status: ResourceLoader.ThreadLoadStatus = ResourceLoader.load_threaded_get_status(scene_path) + while status == ResourceLoader.THREAD_LOAD_IN_PROGRESS: + await tree.process_frame + status = ResourceLoader.load_threaded_get_status(scene_path) + if status != ResourceLoader.THREAD_LOAD_LOADED: + Log.error("SceneLoader: Failed to load %s (status %d)" % [scene_path, status]) + _finish_with_fallback(tree, scene_path) + return + var packed_scene: PackedScene = ResourceLoader.load_threaded_get(scene_path) as PackedScene + if not packed_scene: + Log.error("SceneLoader: %s is not a PackedScene" % scene_path) + _finish_with_fallback(tree, scene_path) + return + error = tree.change_scene_to_packed(packed_scene) + if error != OK: + Log.error("SceneLoader: Could not change to %s (error %s)" % [scene_path, error_string(error)]) + _finish_with_fallback(tree, scene_path) + return + _is_changing = false + + +func _finish_with_fallback(tree: SceneTree, failed_scene_path: String) -> void: + _is_changing = false + if failed_scene_path != FALLBACK_SCENE_PATH: + tree.change_scene_to_file(FALLBACK_SCENE_PATH) diff --git a/sources/utils/autoloads/scene_loader.gd.uid b/sources/utils/autoloads/scene_loader.gd.uid new file mode 100644 index 00000000..e8553604 --- /dev/null +++ b/sources/utils/autoloads/scene_loader.gd.uid @@ -0,0 +1 @@ +uid://bm3xnmft2e4ul diff --git a/sources/utils/autoloads/server_manager.gd b/sources/utils/autoloads/server_manager.gd index a2367617..b98b0f99 100644 --- a/sources/utils/autoloads/server_manager.gd +++ b/sources/utils/autoloads/server_manager.gd @@ -174,6 +174,14 @@ func set_user_language(language: String) -> Dictionary: await _post_request("set_language", data) return _response() + +func reset_language(language: String) -> Dictionary: + loading_rect.show() + Log.warn("ServerManager: Reset language request initiated for %s" % language) + var data: Dictionary = {"language": language} + await _post_request("reset_language", data) + return _response() + #region Sender functions func check_internet_access() -> bool: diff --git a/sources/utils/autoloads/user_database_synchronizer.gd b/sources/utils/autoloads/user_database_synchronizer.gd index 0167cafb..b6ddc47f 100644 --- a/sources/utils/autoloads/user_database_synchronizer.gd +++ b/sources/utils/autoloads/user_database_synchronizer.gd @@ -2,11 +2,11 @@ class_name UserDatabaseSynchronizer extends Node enum UpdateNeeded { - Nothing, - FromLocal, - FromServer, - DeleteLocal, - DeleteServer + NOTHING, + FROM_LOCAL, + FROM_SERVER, + DELETE_LOCAL, + DELETE_SERVER } var synchronizing: bool = false @@ -16,7 +16,7 @@ var loading_popup: LoadingPopup func start_sync() -> void: synchronizing = true Log.info("UserDatabaseSynchronizer: Starting synchronization") - if loading_popup != null: + if is_instance_valid(loading_popup): loading_popup.set_finished(false) set_loading_bar_text("SYNCHRONIZATION_INITIALISATION") await set_loading_bar_progression(0.0) @@ -29,7 +29,7 @@ func stop_sync(success: bool = false) -> void: if success: await set_loading_bar_progression(100.0, 1.0) set_loading_bar_text("SYNCHRONIZATION_SUCCESS") - if loading_popup != null: + if is_instance_valid(loading_popup): loading_popup.set_finished(true) @@ -62,13 +62,13 @@ func _determine_user_update(response_body: Dictionary) -> UpdateNeeded: Log.trace("UserDatabaseSynchronizer: Cannot get user from body. Canceling synchronization.") set_loading_bar_text("SYNCHRONIZATION_ERROR_NO_BODY_FROM_SERVER") stop_sync() - return UpdateNeeded.Nothing + return UpdateNeeded.NOTHING var user: Dictionary = response_body.user if not user.has("last_modified"): Log.trace("UserDatabaseSynchronizer: Cannot get last_modified from user. Canceling synchronization.") set_loading_bar_text("SYNCHRONIZATION_ERROR") stop_sync() - return UpdateNeeded.Nothing + return UpdateNeeded.NOTHING var server_unix_time_user: int = Time.get_unix_time_from_datetime_string(user.last_modified as String) var local_user_string_time: String = UserDataManager.teacher_settings.last_modified var local_unix_time_user: int = 0 @@ -79,10 +79,10 @@ func _determine_user_update(response_body: Dictionary) -> UpdateNeeded: func _compute_update_needed(local_unix_time: int, server_unix_time: int) -> UpdateNeeded: if local_unix_time == server_unix_time: - return UpdateNeeded.Nothing + return UpdateNeeded.NOTHING if local_unix_time > server_unix_time: - return UpdateNeeded.FromLocal - return UpdateNeeded.FromServer + return UpdateNeeded.FROM_LOCAL + return UpdateNeeded.FROM_SERVER func _determine_students_update(response_body: Dictionary, need_update_user: UpdateNeeded) -> Dictionary: @@ -150,7 +150,7 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd # Synchronize student data var local_student_unix_time: int = Time.get_unix_time_from_datetime_string(student_data.last_modified) student_updates["data"] = _compute_update_needed(local_student_unix_time, server_student_unix_time) - if student_updates["data"] == UpdateNeeded.Nothing: + if student_updates["data"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) # Synchronize student progression @@ -162,7 +162,7 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd return {} var local_student_progression_unix_time: int = Time.get_unix_time_from_datetime_string(student_progression.last_modified) student_updates["progression"] = _compute_update_needed(local_student_progression_unix_time, server_student_progression_unix_time) - if student_updates["progression"] == UpdateNeeded.Nothing: + if student_updates["progression"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d progression data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) # Synchronize student remediation @@ -170,17 +170,17 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd if student_remediation != null: var local_student_gp_remediation_unix_time: int = Time.get_unix_time_from_datetime_string(student_remediation.gp_last_modified) student_updates["remediation_gp"] = _compute_update_needed(local_student_gp_remediation_unix_time, server_student_remediation_gp_unix_time) - if student_updates["remediation_gp"] == UpdateNeeded.Nothing: + if student_updates["remediation_gp"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d GP remediation data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) var local_student_syllables_remediation_unix_time: int = Time.get_unix_time_from_datetime_string(student_remediation.syllables_last_modified) student_updates["remediation_syllables"] = _compute_update_needed(local_student_syllables_remediation_unix_time, server_student_remediation_syllables_unix_time) - if student_updates["remediation_syllables"] == UpdateNeeded.Nothing: + if student_updates["remediation_syllables"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d syllables remediation data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) var local_student_words_remediation_unix_time: int = Time.get_unix_time_from_datetime_string(student_remediation.words_last_modified) student_updates["remediation_words"] = _compute_update_needed(local_student_words_remediation_unix_time, server_student_remediation_words_unix_time) - if student_updates["remediation_words"] == UpdateNeeded.Nothing: + if student_updates["remediation_words"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d words remediation data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) # Synchronize student confusion matrix @@ -188,20 +188,20 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd if student_confusion_matrix != null: var local_student_gp_confusion_matrix_unix_time: int = Time.get_unix_time_from_datetime_string(student_confusion_matrix.gp_last_modified) student_updates["confusion_matrix_gp"] = _compute_update_needed(local_student_gp_confusion_matrix_unix_time, server_student_confusion_matrix_gp_unix_time) - if student_updates["confusion_matrix_gp"] == UpdateNeeded.Nothing: + if student_updates["confusion_matrix_gp"] == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: Student %d GP confusion matrix data timestamp is the same in local and on server. No synchronization necessary" % code_to_check) else: if server_student_confusion_matrix_gp_unix_time > 0: - student_updates["confusion_matrix_gp"] = UpdateNeeded.FromServer + student_updates["confusion_matrix_gp"] = UpdateNeeded.FROM_SERVER break if found: break if not found: - if need_update_user == UpdateNeeded.FromServer: - need_update_students[code_to_check]["data"] = UpdateNeeded.FromServer - elif need_update_user == UpdateNeeded.FromLocal: - need_update_students[code_to_check]["data"] = UpdateNeeded.DeleteServer + if need_update_user == UpdateNeeded.FROM_SERVER: + need_update_students[code_to_check]["data"] = UpdateNeeded.FROM_SERVER + elif need_update_user == UpdateNeeded.FROM_LOCAL: + need_update_students[code_to_check]["data"] = UpdateNeeded.DELETE_SERVER else: Log.warn("UserDatabaseSynchronizer: Student %d not found in local, but user doesn't need to be updated...this is theoretically not possible" % code_to_check) @@ -209,12 +209,12 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd var students_in_device: Array[StudentData] = UserDataManager.teacher_settings.students[device] for student_data: StudentData in students_in_device: if not need_update_students.has(student_data.code): - if need_update_user == UpdateNeeded.FromServer: + if need_update_user == UpdateNeeded.FROM_SERVER: need_update_students[student_data.code] = {} - need_update_students[student_data.code]["data"] = UpdateNeeded.DeleteLocal - elif need_update_user == UpdateNeeded.FromLocal: + need_update_students[student_data.code]["data"] = UpdateNeeded.DELETE_LOCAL + elif need_update_user == UpdateNeeded.FROM_LOCAL: need_update_students[student_data.code] = {} - need_update_students[student_data.code]["data"] = UpdateNeeded.FromLocal + need_update_students[student_data.code]["data"] = UpdateNeeded.FROM_LOCAL else: Log.warn("UserDatabaseSynchronizer: Student %d not found in server, but user doesn't need to be updated...this is theoretically not possible" % student_data.code) return need_update_students @@ -223,13 +223,13 @@ func _determine_students_update(response_body: Dictionary, need_update_user: Upd func _build_message_to_server(need_update_user: UpdateNeeded, need_update_students: Dictionary[int, Dictionary]) -> Dictionary: var message_to_server: Dictionary = {} - if need_update_user == UpdateNeeded.FromLocal: + if need_update_user == UpdateNeeded.FROM_LOCAL: message_to_server["user"] = { "account_type": UserDataManager.teacher_settings.account_type, "education_method": UserDataManager.teacher_settings.education_method, "last_modified": UserDataManager.teacher_settings.last_modified } - elif need_update_user == UpdateNeeded.FromServer: + elif need_update_user == UpdateNeeded.FROM_SERVER: message_to_server["user"] = {"need_update": true} message_to_server["students"] = {} @@ -241,14 +241,14 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen if student_entry.has("data"): var student_update: UpdateNeeded = student_entry["data"] - if student_update == UpdateNeeded.DeleteLocal: + if student_update == UpdateNeeded.DELETE_LOCAL: UserDataManager.delete_student(student_code) continue - elif student_update == UpdateNeeded.DeleteServer: + elif student_update == UpdateNeeded.DELETE_SERVER: student_block["delete"] = true - elif student_update == UpdateNeeded.FromLocal: + elif student_update == UpdateNeeded.FROM_LOCAL: var device_id: int = UserDataManager.teacher_settings.get_student_device(student_code) if device_id == -1: Log.error("UserDatabaseSynchronizer: Student code %s has no device ID" % student_code) @@ -264,7 +264,7 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen "updated_at": student_data.last_modified }) - elif student_update == UpdateNeeded.FromServer: + elif student_update == UpdateNeeded.FROM_SERVER: student_block["need_update"] = true var student_progression: StudentProgression = UserDataManager.get_student_progression_for_code(0, student_code) @@ -272,16 +272,16 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen Log.trace("Cannot find progression data for student %s" % str(student_code)) elif student_entry.has("progression"): var progression_block: Dictionary = {} - if student_entry.progression == UpdateNeeded.FromLocal: + if student_entry.progression == UpdateNeeded.FROM_LOCAL: progression_block = { "version": student_progression.version, "unlocked": student_progression.unlocks, "highest_boss_defeated": student_progression.highest_boss_defeated, "updated_at": student_progression.last_modified } - elif student_entry.progression == UpdateNeeded.FromServer: + elif student_entry.progression == UpdateNeeded.FROM_SERVER: progression_block = {"need_update": true} - elif student_entry.progression == UpdateNeeded.DeleteServer: + elif student_entry.progression == UpdateNeeded.DELETE_SERVER: progression_block = {"delete": true} if progression_block.size() > 0: @@ -290,14 +290,14 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen var student_remediation: UserRemediation = UserDataManager.get_student_remediation_data(student_code) if student_entry.has("remediation_gp"): var gp_remediation_block: Dictionary = {} - if student_entry.remediation_gp == UpdateNeeded.FromLocal: + if student_entry.remediation_gp == UpdateNeeded.FROM_LOCAL: var tuple_list: Array = [] for key: int in student_remediation.gps_scores.keys(): tuple_list.append([key, student_remediation.gps_scores[key]]) gp_remediation_block = {"score_remediation": tuple_list, "updated_at": student_remediation.gp_last_modified} - elif student_entry.remediation_gp == UpdateNeeded.FromServer: + elif student_entry.remediation_gp == UpdateNeeded.FROM_SERVER: gp_remediation_block = {"need_update": true} - elif student_entry.remediation_gp == UpdateNeeded.DeleteServer: + elif student_entry.remediation_gp == UpdateNeeded.DELETE_SERVER: gp_remediation_block = {"delete": true} if gp_remediation_block.size() > 0: @@ -305,14 +305,14 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen if student_entry.has("remediation_syllables"): var syllables_remediation_block: Dictionary = {} - if student_entry.remediation_syllables == UpdateNeeded.FromLocal: + if student_entry.remediation_syllables == UpdateNeeded.FROM_LOCAL: var tuple_list: Array = [] for key: int in student_remediation.syllables_scores.keys(): tuple_list.append([key, student_remediation.syllables_scores[key]]) syllables_remediation_block = {"score_remediation": tuple_list, "updated_at": student_remediation.syllables_last_modified} - elif student_entry.remediation_syllables == UpdateNeeded.FromServer: + elif student_entry.remediation_syllables == UpdateNeeded.FROM_SERVER: syllables_remediation_block = {"need_update": true} - elif student_entry.remediation_syllables == UpdateNeeded.DeleteServer: + elif student_entry.remediation_syllables == UpdateNeeded.DELETE_SERVER: syllables_remediation_block = {"delete": true} if syllables_remediation_block.size() > 0: @@ -320,14 +320,14 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen if student_entry.has("remediation_words"): var words_remediation_block: Dictionary = {} - if student_entry.remediation_words == UpdateNeeded.FromLocal: + if student_entry.remediation_words == UpdateNeeded.FROM_LOCAL: var tuple_list: Array = [] for key: int in student_remediation.words_scores.keys(): tuple_list.append([key, student_remediation.words_scores[key]]) words_remediation_block = {"score_remediation": tuple_list, "updated_at": student_remediation.words_last_modified} - elif student_entry.remediation_words == UpdateNeeded.FromServer: + elif student_entry.remediation_words == UpdateNeeded.FROM_SERVER: words_remediation_block = {"need_update": true} - elif student_entry.remediation_words == UpdateNeeded.DeleteServer: + elif student_entry.remediation_words == UpdateNeeded.DELETE_SERVER: words_remediation_block = {"delete": true} if words_remediation_block.size() > 0: @@ -336,14 +336,14 @@ func _build_message_to_server(need_update_user: UpdateNeeded, need_update_studen var student_confusion_matrix: UserConfusionMatrix = UserDataManager.get_student_confusion_matrix_data(student_code) if student_entry.has("confusion_matrix_gp"): var gp_confusion_matrix_block: Dictionary = {} - if student_entry.confusion_matrix_gp == UpdateNeeded.FromLocal: + if student_entry.confusion_matrix_gp == UpdateNeeded.FROM_LOCAL: var tuple_list: Array = [] for key: int in student_confusion_matrix.gp_scores.keys(): tuple_list.append([key, student_confusion_matrix.gp_scores[key]]) gp_confusion_matrix_block = {"confusion_matrix": tuple_list, "updated_at": student_confusion_matrix.gp_last_modified} - elif student_entry.confusion_matrix_gp == UpdateNeeded.FromServer: + elif student_entry.confusion_matrix_gp == UpdateNeeded.FROM_SERVER: gp_confusion_matrix_block = {"need_update": true} - elif student_entry.confusion_matrix_gp == UpdateNeeded.DeleteServer: + elif student_entry.confusion_matrix_gp == UpdateNeeded.DELETE_SERVER: gp_confusion_matrix_block = {"delete": true} if gp_confusion_matrix_block.size() > 0: @@ -398,7 +398,7 @@ func _apply_server_response(response_body: Dictionary) -> void: var response_student_data: Dictionary = response_students[response_student_code] if validate_student_data(response_student_data): UserDataManager.teacher_settings.set_data_student_with_code(int(response_student_code), int(response_student_data.device_id as float), response_student_data.name as String, int(response_student_data.age as float), response_student_data.updated_at as String) - if response_student_data.has("progression") and (response_student_data.progression as Dictionary).has("version") and (response_student_data.progression as Dictionary).has("unlocked") and (response_student_data.progression as Dictionary).has("updated_at"): + if response_student_data.has("progression") and _is_valid_progression_payload(response_student_data.progression): # Cleaning data because of JSON parsing changing types int / float / string var received_unlock_data: Dictionary = response_student_data.progression.unlocked as Dictionary var new_unlock_data: Dictionary[int, Dictionary] = {} @@ -407,56 +407,45 @@ func _apply_server_response(response_body: Dictionary) -> void: if key_lesson_int == -1: Log.error("UserDatabaseSynchronizer: Received invalid key for lesson: %s" % str(key_lesson)) continue - new_unlock_data[key_lesson_int] = {"games": [], "look_and_learn": received_unlock_data[key_lesson]["look_and_learn"] as int} - for game_result: Variant in received_unlock_data[key_lesson]["games"]: - (new_unlock_data[key_lesson_int]["games"] as Array).push_back(game_result as int) - new_unlock_data[key_lesson_int].merge({"last_duration": PackedInt32Array(received_unlock_data[key_lesson]["last_duration"] as Array)}) - new_unlock_data[key_lesson_int].merge({"total_duration": PackedInt32Array(received_unlock_data[key_lesson]["total_duration"] as Array)}) + var lesson_data: Variant = received_unlock_data[key_lesson] + if not _is_valid_unlock_entry(lesson_data): + Log.error("UserDatabaseSynchronizer: Skipping malformed unlock data received from server for lesson %d" % key_lesson_int) + continue + var lesson_dict: Dictionary = lesson_data + new_unlock_data[key_lesson_int] = {"games": [], "look_and_learn": int(lesson_dict.look_and_learn as float)} + for game_result: Variant in lesson_dict.games as Array: + (new_unlock_data[key_lesson_int]["games"] as Array).push_back(int(game_result as float)) + new_unlock_data[key_lesson_int].merge({"last_duration": PackedInt32Array(lesson_dict.last_duration as Array)}) + new_unlock_data[key_lesson_int].merge({"total_duration": PackedInt32Array(lesson_dict.total_duration as Array)}) var highest_boss_defeated: int = -1 if (response_student_data.progression as Dictionary).has("highest_boss_defeated"): highest_boss_defeated = int(response_student_data.progression.highest_boss_defeated as float) UserDataManager.set_student_progression_data(int(response_student_code), response_student_data.progression.version as String, new_unlock_data, response_student_data.progression.updated_at as String, highest_boss_defeated) if response_student_data.has("remediation_gp") and (response_student_data.remediation_gp as Dictionary).has("score_remediation") and (response_student_data.remediation_gp as Dictionary).has("updated_at"): - var new_array: Array = JSON.parse_string(response_student_data.remediation_gp.score_remediation as String) as Array - if new_array == null: - Log.warn("UserDatabaseSynchronizer: Cannot parse to JSON the received GP score remediation: %s" % response_student_data.remediation_gp.score_remediation as String) - else: - var new_gp_scores: Dictionary[int, int] = {} - for index: int in range(new_array.size()): - # TODO ADD SECURITY - new_gp_scores[int(new_array[index][0] as float)] = int(new_array[index][1] as float) + var new_gp_scores: Dictionary[int, int] = {} + if _parse_score_remediation(response_student_data.remediation_gp.score_remediation, "GP", new_gp_scores): UserDataManager.set_student_remediation_gp_data(int(response_student_code), new_gp_scores, response_student_data.remediation_gp.updated_at as String) if response_student_data.has("remediation_syllables") and (response_student_data.remediation_syllables as Dictionary).has("score_remediation") and (response_student_data.remediation_syllables as Dictionary).has("updated_at"): - var new_array: Array = JSON.parse_string(response_student_data.remediation_syllables.score_remediation as String) as Array - if new_array == null: - Log.warn("UserDatabaseSynchronizer: Cannot parse to JSON the received syllables score remediation: %s" % response_student_data.remediation_syllables.score_remediation as String) - else: - var new_syllables_scores: Dictionary[int, int] = {} - for index: int in range(new_array.size()): - # TODO ADD SECURITY - new_syllables_scores[int(new_array[index][0] as float)] = int(new_array[index][1] as float) + var new_syllables_scores: Dictionary[int, int] = {} + if _parse_score_remediation(response_student_data.remediation_syllables.score_remediation, "syllables", new_syllables_scores): UserDataManager.set_student_remediation_syllables_data(int(response_student_code), new_syllables_scores, response_student_data.remediation_syllables.updated_at as String) if response_student_data.has("remediation_words") and (response_student_data.remediation_words as Dictionary).has("score_remediation") and (response_student_data.remediation_words as Dictionary).has("updated_at"): - var new_array: Array = JSON.parse_string(response_student_data.remediation_words.score_remediation as String) as Array - if new_array == null: - Log.warn("UserDatabaseSynchronizer: Cannot parse to JSON the received words score remediation: %s" % response_student_data.remediation_words.score_remediation as String) - else: - var new_words_scores: Dictionary[int, int] = {} - for index: int in range(new_array.size()): - # TODO ADD SECURITY - new_words_scores[int(new_array[index][0] as float)] = int(new_array[index][1] as float) + var new_words_scores: Dictionary[int, int] = {} + if _parse_score_remediation(response_student_data.remediation_words.score_remediation, "words", new_words_scores): UserDataManager.set_student_remediation_words_data(int(response_student_code), new_words_scores, response_student_data.remediation_words.updated_at as String) if response_student_data.has("confusion_matrix_gp") and (response_student_data.confusion_matrix_gp as Dictionary).has("confusion_matrix") and (response_student_data.confusion_matrix_gp as Dictionary).has("updated_at"): - # TODO ADD SECURITY - var new_array: Array = response_student_data.confusion_matrix_gp.confusion_matrix - var new_confusion_matrix_gp: Dictionary[int, PackedInt32Array] = {} - for index: int in range(new_array.size()): - # TODO ADD SECURITY - var sub_array: PackedInt32Array = [] - for subindex: int in range((new_array[index][1] as Array).size()): - sub_array.append(int(new_array[index][1][subindex] as float)) - new_confusion_matrix_gp.set(int(new_array[index][0] as float), sub_array as PackedInt32Array) - UserDataManager.set_student_confusion_matrix_gp_data(int(response_student_code), new_confusion_matrix_gp, response_student_data.confusion_matrix_gp.updated_at as String) + var received_matrix: Variant = response_student_data.confusion_matrix_gp.confusion_matrix + if not (received_matrix is Array): + Log.warn("UserDatabaseSynchronizer: Received GP confusion matrix is not an array: %s" % str(received_matrix)) + else: + var new_confusion_matrix_gp: Dictionary[int, PackedInt32Array] = {} + for entry: Variant in received_matrix as Array: + if not _is_valid_confusion_entry(entry): + Log.warn("UserDatabaseSynchronizer: Skipping malformed GP confusion matrix entry received from server: %s" % str(entry)) + continue + var pair: Array = entry + new_confusion_matrix_gp[int(pair[0] as float)] = PackedInt32Array(pair[1] as Array) + UserDataManager.set_student_confusion_matrix_gp_data(int(response_student_code), new_confusion_matrix_gp, response_student_data.confusion_matrix_gp.updated_at as String) func synchronize() -> void: @@ -474,7 +463,7 @@ func synchronize() -> void: return var need_update_user: UpdateNeeded = _determine_user_update(response_body) - if need_update_user == UpdateNeeded.Nothing: + if need_update_user == UpdateNeeded.NOTHING: Log.trace("UserDatabaseSynchronizer: User data timestamp is the same in local and on server. No synchronization necessary") if not synchronizing: return @@ -499,6 +488,81 @@ func synchronize() -> void: #region utils +# Parses a JSON-encoded list of [id, score] pairs received from the server +# into out_scores. Returns false when the payload cannot be parsed at all; +# malformed entries are skipped so one bad record cannot abort the whole +# synchronization. +func _parse_score_remediation(raw_scores: Variant, score_type: String, out_scores: Dictionary[int, int]) -> bool: + if not (raw_scores is String): + Log.warn("UserDatabaseSynchronizer: Received %s score remediation is not a string: %s" % [score_type, str(raw_scores)]) + return false + var parsed: Variant = JSON.parse_string(raw_scores as String) + if not (parsed is Array): + Log.warn("UserDatabaseSynchronizer: Cannot parse to JSON the received %s score remediation: %s" % [score_type, raw_scores]) + return false + for entry: Variant in parsed as Array: + if not _is_valid_score_pair(entry): + Log.warn("UserDatabaseSynchronizer: Skipping malformed %s score remediation entry received from server: %s" % [score_type, str(entry)]) + continue + var pair: Array = entry + out_scores[int(pair[0] as float)] = int(pair[1] as float) + return true + + +func _is_number(value: Variant) -> bool: + return value is int or value is float + + +# A score entry received from the server must be an [id, score] pair of numbers. +func _is_valid_score_pair(entry: Variant) -> bool: + if not (entry is Array): + return false + var pair: Array = entry + return pair.size() == 2 and _is_number(pair[0]) and _is_number(pair[1]) + + +# A confusion matrix entry received from the server must be an [id, [counts...]] +# pair where every count is a number. +func _is_valid_confusion_entry(entry: Variant) -> bool: + if not (entry is Array): + return false + var pair: Array = entry + if pair.size() != 2 or not _is_number(pair[0]) or not (pair[1] is Array): + return false + for value: Variant in pair[1] as Array: + if not _is_number(value): + return false + return true + + +# The progression payload received from the server must contain a version, +# a timestamp, and an unlock dictionary. +func _is_valid_progression_payload(payload: Variant) -> bool: + if not (payload is Dictionary): + return false + var progression: Dictionary = payload + return progression.has("version") and progression.has("updated_at") and progression.get("unlocked") is Dictionary + + +# A lesson unlock entry received from the server must contain a numeric +# look_and_learn status and games / last_duration / total_duration arrays +# of numbers. +func _is_valid_unlock_entry(entry: Variant) -> bool: + if not (entry is Dictionary): + return false + var lesson_dict: Dictionary = entry + if not _is_number(lesson_dict.get("look_and_learn")): + return false + for key: String in ["games", "last_duration", "total_duration"]: + var values: Variant = lesson_dict.get(key) + if not (values is Array): + return false + for value: Variant in values as Array: + if not _is_number(value): + return false + return true + + func validate_student_data(data: Dictionary) -> bool: var required_keys: Array[String] = ["device_id", "name", "age", "updated_at"] var missing: Array[String] = [] @@ -514,13 +578,13 @@ func validate_student_data(data: Dictionary) -> bool: func set_loading_bar_progression(value_percent: float, wait_time: float = 0.2) -> void: - if loading_popup != null: + if is_instance_valid(loading_popup) and loading_popup.is_inside_tree(): loading_popup.set_progress(value_percent) await loading_popup.get_tree().create_timer(wait_time).timeout func set_loading_bar_text(message: String) -> void: - if loading_popup != null: + if is_instance_valid(loading_popup): loading_popup.set_text(message) #endregion diff --git a/sources/utils/autoloads/utils.gd b/sources/utils/autoloads/utils.gd index 877639f1..a4c292df 100644 --- a/sources/utils/autoloads/utils.gd +++ b/sources/utils/autoloads/utils.gd @@ -94,14 +94,22 @@ func clean_dir(path: String) -> Error: return error if dir == null: return ERR_FILE_BAD_PATH + # Hidden files (e.g. .DS_Store created by the macOS Finder) must be removed + # too, otherwise the directory is never empty and cannot be deleted + dir.include_hidden = true + # Best effort: try to remove everything, report the first error encountered + var first_error: Error = OK for file: String in dir.get_files(): - dir.remove(file) + error = dir.remove(file) + if error != OK and first_error == OK: + first_error = error for subfolder: String in dir.get_directories(): error = clean_dir(path.path_join(subfolder)) - if error != OK: - return error - dir.remove(subfolder) - return OK + if error == OK: + error = dir.remove(subfolder) + if error != OK and first_error == OK: + first_error = error + return first_error func delete_directory_recursive(path: String) -> void: diff --git a/sources/utils/clouds_manager.gd b/sources/utils/clouds_manager.gd index eecd3940..e6727b13 100644 --- a/sources/utils/clouds_manager.gd +++ b/sources/utils/clouds_manager.gd @@ -1,3 +1,4 @@ +class_name CloudManager extends Node2D @export var min_speed: float = 20.0 @@ -6,43 +7,119 @@ extends Node2D @export var max_y: float = 200.0 @export var min_scale: float = 0.6 @export var max_scale: float = 1.3 +# 0 = background-locked, 1 = matches scroll, >1 = foreground. +@export var min_parallax_factor: float = 1.0 +@export var max_parallax_factor: float = 1.0 +# 0 falls back to viewport width (legacy minigame behavior). +@export var spawn_width: float = 0.0 +@export var clouds_per_screen: int = 0 +var scroll_offset: float = 0.0 +# Without max_scroll, far clouds (parallax < 1) can land at drift_x values no +# scroll position ever exposes; configure_world() should set this. +var max_scroll: float = 0.0 var cloud_speeds: Dictionary[Sprite2D, float] = {} +var cloud_drift_x: Dictionary[Sprite2D, float] = {} +var cloud_parallax: Dictionary[Sprite2D, float] = {} var screen_width: float = 0.0 func _ready() -> void: randomize() screen_width = get_viewport_rect().size.x - for cloud: Node in get_children(): - if cloud is Sprite2D: - _init_cloud_start(cloud as Sprite2D) - else: - Log.error("CloudManager: A child cloud is not a Sprite2D, this should not be possible") + _initialize_clouds() func _process(delta: float) -> void: var new_width: float = get_viewport_rect().size.x if new_width != screen_width: screen_width = new_width - - for cloud: Sprite2D in get_children(): - var speed: float = cloud_speeds[cloud] - cloud.position.x -= speed * delta - - if cloud.position.x < -cloud.texture.get_width(): - _reset_cloud(cloud) + + var world_anchored: bool = spawn_width > 0.0 + + for cloud: Node in get_children(): + if not (cloud is Sprite2D): + continue + var sprite: Sprite2D = cloud as Sprite2D + var speed: float = cloud_speeds.get(sprite, 0.0) + var parallax: float = cloud_parallax.get(sprite, 1.0) + var drift_x: float = cloud_drift_x.get(sprite, sprite.position.x) - speed * delta + cloud_drift_x[sprite] = drift_x + var rendered_x: float = drift_x - scroll_offset * parallax + sprite.position.x = rendered_x + + # World-anchored mode recycles in world space; legacy mode in viewport space. + if world_anchored: + if drift_x < -sprite.texture.get_width(): + _reset_cloud(sprite) + else: + if rendered_x < -sprite.texture.get_width(): + _reset_cloud(sprite) + + +func configure_world(world_width: float, p_max_scroll: float = -1.0, override_clouds_per_screen: int = -1) -> void: + if override_clouds_per_screen >= 0: + clouds_per_screen = override_clouds_per_screen + set_world_bounds(world_width, p_max_scroll) + screen_width = get_viewport_rect().size.x + _initialize_clouds() + + +func set_world_bounds(world_width: float, p_max_scroll: float = -1.0) -> void: + spawn_width = world_width + max_scroll = p_max_scroll if p_max_scroll >= 0.0 else world_width + + +func _initialize_clouds() -> void: + _populate_extra_clouds() + cloud_speeds.clear() + cloud_drift_x.clear() + cloud_parallax.clear() + + var sprites: Array[Sprite2D] = [] + for cloud: Node in get_children(): + if cloud is Sprite2D: + sprites.append(cloud as Sprite2D) + else: + Log.error("CloudsManager: A child cloud is not a Sprite2D, this should not be possible") + + # Avoid duplicated templates landing in adjacent stratified slots. + sprites.shuffle() + + var slot_count: int = sprites.size() + for index: int in range(slot_count): + _init_cloud_start(sprites[index], index, slot_count) + + +func _populate_extra_clouds() -> void: + if clouds_per_screen <= 0 or spawn_width <= 0.0: + return + var viewport_w: float = max(1.0, screen_width) + var screens: int = maxi(1, ceili(spawn_width / viewport_w)) + var target_count: int = clouds_per_screen * screens + + var template_clouds: Array[Sprite2D] = [] + for child: Node in get_children(): + if child is Sprite2D: + template_clouds.append(child as Sprite2D) + if template_clouds.is_empty(): + return + + var to_add: int = target_count - template_clouds.size() + for index: int in range(to_add): + var template: Sprite2D = template_clouds[index % template_clouds.size()] + var clone: Sprite2D = template.duplicate() as Sprite2D + add_child(clone) func _depth_factor_for_cloud(cloud: Sprite2D) -> float: - # Normalise la hauteur sur 0 a 1 var factor: float = (cloud.position.y - min_y) / float(max_y - min_y) return clampf(factor, 0.0, 1.0) func _apply_parallax_speed(cloud: Sprite2D) -> float: var factor: float = _depth_factor_for_cloud(cloud) - return lerp(min_speed, max_speed, factor) + return lerpf(min_speed, max_speed, factor) func _apply_parallax_scale(cloud: Sprite2D) -> void: @@ -51,17 +128,58 @@ func _apply_parallax_scale(cloud: Sprite2D) -> void: cloud.scale = Vector2(target_scale, target_scale) -func _init_cloud_start(cloud: Sprite2D) -> void: - cloud.position.x = randf_range(0, screen_width) +func _apply_parallax_factor(cloud: Sprite2D) -> float: + var factor: float = _depth_factor_for_cloud(cloud) + return lerpf(min_parallax_factor, max_parallax_factor, factor) + + +func _spawn_range() -> float: + return spawn_width if spawn_width > 0.0 else screen_width + + +func _init_cloud_start(cloud: Sprite2D, slot_index: int = 0, slot_count: int = 1) -> void: cloud.position.y = randf_range(min_y, max_y) - + cloud_parallax[cloud] = _apply_parallax_factor(cloud) cloud_speeds[cloud] = _apply_parallax_speed(cloud) _apply_parallax_scale(cloud) + var parallax: float = cloud_parallax[cloud] + var drift_x: float + if max_scroll > 0.0 and slot_count > 1: + # Stratify in scroll space and multiply by parallax so drift_x stays + # within the cloud's reachable range. + var scroll_slot_width: float = max_scroll / float(slot_count) + var slot_min_scroll: float = float(slot_index) * scroll_slot_width + var slot_max_scroll: float = float(slot_index + 1) * scroll_slot_width + var target_scroll: float = randf_range(slot_min_scroll, slot_max_scroll) + var horiz_jitter: float = randf_range(0.0, screen_width) + drift_x = target_scroll * parallax + horiz_jitter + elif spawn_width > 0.0 and slot_count > 1: + var slot_width: float = spawn_width / float(slot_count) + drift_x = randf_range(float(slot_index) * slot_width, float(slot_index + 1) * slot_width) + else: + drift_x = randf_range(0.0, _spawn_range()) + + cloud_drift_x[cloud] = drift_x + cloud.position.x = drift_x - scroll_offset * parallax + func _reset_cloud(cloud: Sprite2D) -> void: - cloud.position.x = screen_width + cloud.texture.get_width() * 0.5 cloud.position.y = randf_range(min_y, max_y) - + cloud_parallax[cloud] = _apply_parallax_factor(cloud) cloud_speeds[cloud] = _apply_parallax_speed(cloud) _apply_parallax_scale(cloud) + + var parallax: float = cloud_parallax[cloud] + if max_scroll > 0.0: + # Respawn at the right edge of this cloud's reachable range, not the world's. + var max_visibility_drift_x: float = max_scroll * parallax + screen_width + cloud.texture.get_width() * 0.5 + cloud_drift_x[cloud] = max_visibility_drift_x + cloud.position.x = max_visibility_drift_x - scroll_offset * parallax + elif spawn_width > 0.0: + cloud_drift_x[cloud] = spawn_width + cloud.texture.get_width() * 0.5 + cloud.position.x = cloud_drift_x[cloud] - scroll_offset * parallax + else: + var target_rendered_x: float = screen_width + cloud.texture.get_width() * 0.5 + cloud_drift_x[cloud] = target_rendered_x + scroll_offset * parallax + cloud.position.x = target_rendered_x diff --git a/tests/integration_tests/test_account_lifecycle.gd b/tests/integration_tests/test_account_lifecycle.gd index ada7f400..3ef0f322 100644 --- a/tests/integration_tests/test_account_lifecycle.gd +++ b/tests/integration_tests/test_account_lifecycle.gd @@ -84,30 +84,30 @@ func test_full_account_creation_login_and_deletion() -> void: gut.p("Step 2: Building registration payload…") var register_data: TeacherSettings = TeacherSettings.new() - register_data.account_type = TeacherSettings.AccountType.Teacher - register_data.education_method = TeacherSettings.EducationMethod.Complete + register_data.account_type = TeacherSettings.AccountType.TEACHER + register_data.education_method = TeacherSettings.EducationMethod.COMPLETE register_data.email = _test_email register_data.password = TEST_PASSWORD - register_data.language = "fr" + register_data.language = "fr_FR" # Device 1 — two students var student_alice: StudentData = StudentData.new() student_alice.code = 123 student_alice.name = "Alice" - student_alice.level = StudentData.Level.Beginner + student_alice.level = StudentData.Level.BEGINNER student_alice.age = 7 var student_bob: StudentData = StudentData.new() student_bob.code = 124 student_bob.name = "Bob" - student_bob.level = StudentData.Level.Reviewer + student_bob.level = StudentData.Level.REVIEWER student_bob.age = 8 # Device 2 — one student var student_charlie: StudentData = StudentData.new() student_charlie.code = 321 student_charlie.name = "Charlie" - student_charlie.level = StudentData.Level.Adult + student_charlie.level = StudentData.Level.ADULT student_charlie.age = 10 register_data.students[1] = [student_alice, student_bob] @@ -166,9 +166,9 @@ func test_full_account_creation_login_and_deletion() -> void: # --- Basic fields --- assert_eq(str(login_body.email), _test_email, "Returned email should match") - assert_eq(login_body.account_type as int, TeacherSettings.AccountType.Teacher, + assert_eq(login_body.account_type as int, TeacherSettings.AccountType.TEACHER, "Account type should be Teacher (0)") - assert_eq(login_body.education_method as int, TeacherSettings.EducationMethod.Complete, + assert_eq(login_body.education_method as int, TeacherSettings.EducationMethod.COMPLETE, "Education method should be Complete (1)") assert_eq(str(login_body.language), "fr_FR", "Language should be 'fr'") assert_true(login_body.has("token"), "Login response must include token") @@ -198,13 +198,13 @@ func test_full_account_creation_login_and_deletion() -> void: found_alice = true assert_eq(str(student.name), "Alice", "Student 123 should be Alice") assert_eq(student.age as int, 7, "Alice should be age 7") - assert_eq(student.level as int, StudentData.Level.Beginner, + assert_eq(student.level as int, StudentData.Level.BEGINNER, "Alice should be Beginner (0)") 124: found_bob = true assert_eq(str(student.name), "Bob", "Student 124 should be Bob") assert_eq(student.age as int, 8, "Bob should be age 8") - assert_eq(student.level as int, StudentData.Level.Reviewer, + assert_eq(student.level as int, StudentData.Level.REVIEWER, "Bob should be Reviewer (1)") assert_true(found_alice, "Alice (code 123) should be present on device 1") assert_true(found_bob, "Bob (code 124) should be present on device 1") @@ -215,9 +215,32 @@ func test_full_account_creation_login_and_deletion() -> void: assert_eq(charlie.code as int, 321, "Device 2 student should have code 321") assert_eq(str(charlie.name), "Charlie", "Student 321 should be Charlie") assert_eq(charlie.age as int, 10, "Charlie should be age 10") - assert_eq(charlie.level as int, StudentData.Level.Adult, + assert_eq(charlie.level as int, StudentData.Level.ADULT, "Charlie should be Adult (2)") + # ------------------------------------------------------------------ + # Step 5b – Login with wrong password must report INVALID_PASSWORD + # ------------------------------------------------------------------ + gut.p("Step 5b: Attempting login with a wrong password…") + var wrong_pw_res: Dictionary = await ServerManager.login(_test_email, TEST_PASSWORD + "_wrong") + assert_eq(wrong_pw_res.code as int, 401, + "Login with wrong password should return 401") + var wrong_pw_body: Dictionary = wrong_pw_res.body as Dictionary + assert_eq(str(wrong_pw_body.get("error_code", "")), "INVALID_PASSWORD", + "Wrong password for an existing email should return error_code INVALID_PASSWORD") + + # ------------------------------------------------------------------ + # Step 5c – Login with unknown email must report USER_NOT_FOUND + # ------------------------------------------------------------------ + gut.p("Step 5c: Attempting login with an unknown email…") + var unknown_email: String = TEST_EMAIL_PREFIX + "unknown_" + str(Time.get_ticks_usec()) + TEST_EMAIL_DOMAIN + var unknown_res: Dictionary = await ServerManager.login(unknown_email, TEST_PASSWORD) + assert_eq(unknown_res.code as int, 401, + "Login with unknown email should return 401") + var unknown_body: Dictionary = unknown_res.body as Dictionary + assert_eq(str(unknown_body.get("error_code", "")), "USER_NOT_FOUND", + "Unknown email should return error_code USER_NOT_FOUND") + # ------------------------------------------------------------------ # Step 6 – Set auth context and delete the account # ------------------------------------------------------------------ @@ -248,14 +271,11 @@ func test_full_account_creation_login_and_deletion() -> void: UserDataManager.teacher_settings = null var login_after_del: Dictionary = await ServerManager.login(_test_email, TEST_PASSWORD) - assert_ne(login_after_del.code as int, 200, - "Login should fail after account deletion (expected 401, got %d)" % login_after_del.code) - - # Handle expected warnings: server returns 401 for deleted account login - assert_engine_error("Response code = 401", - "Expected: server returns 401 for deleted account") - assert_engine_error("Login or password incorrect", - "Expected: login should fail after account deletion") + assert_eq(login_after_del.code as int, 401, + "Login should fail with 401 after account deletion (got %d)" % login_after_del.code) + var deleted_body: Dictionary = login_after_del.body as Dictionary + assert_eq(str(deleted_body.get("error_code", "")), "USER_NOT_FOUND", + "Login after deletion should return error_code USER_NOT_FOUND") # ------------------------------------------------------------------ # Step 8 – Email should be available again @@ -270,10 +290,17 @@ func test_full_account_creation_login_and_deletion() -> void: # cannot reach those, so we mark them manually via get_errors(). # "Database is null" warnings are also expected when the godot-sqlite addon # is absent (e.g. in GitHub Actions), so we suppress them here too. + # Each failed login produces two ServerManager warnings (HTTP code line + # + pretty-printed body). We acknowledge all of them here because + # assert_engine_error() handles only the first occurrence of a pattern. for err: GutTrackedError in get_errors(): - if not err.handled and err.contains_text("Database file not found"): - err.handled = true - if not err.handled and err.contains_text("Database is null"): + if err.handled: + continue + if err.contains_text("Database file not found") \ + or err.contains_text("Database is null") \ + or err.contains_text("Response code = 401") \ + or err.contains_text("INVALID_PASSWORD") \ + or err.contains_text("USER_NOT_FOUND"): err.handled = true gut.p("All steps passed.") diff --git a/tests/unit_tests/test_minigame.gd b/tests/unit_tests/test_minigame.gd index f3ea9485..db17a439 100644 --- a/tests/unit_tests/test_minigame.gd +++ b/tests/unit_tests/test_minigame.gd @@ -13,7 +13,7 @@ func test_reset_logs_initializes_answers_bucket() -> void: func test_log_new_response_adds_entry_with_right_answer_metadata() -> void: var minigame: Minigame = Minigame.new() - minigame.minigame_name = Minigame.Type.jellyfish + minigame.minigame_name = Minigame.Type.JELLYFISH minigame.current_number_of_hints = 1 minigame.current_progression = 2 minigame.max_progression = 10 diff --git a/tests/unit_tests/test_student_data.gd b/tests/unit_tests/test_student_data.gd index bbedff5d..8cf256e7 100644 --- a/tests/unit_tests/test_student_data.gd +++ b/tests/unit_tests/test_student_data.gd @@ -3,14 +3,14 @@ extends GutTest var default_student_data_dict: Dictionary = { "code": 0, "name": "", - "level": StudentData.Level.Beginner, + "level": StudentData.Level.BEGINNER, "age": 0, "last_modified": "" } var modified_student_data_dict: Dictionary = { "code": 123, "name": "Alice", - "level": StudentData.Level.Adult, + "level": StudentData.Level.ADULT, "age": 7, "last_modified": Time.get_datetime_string_from_unix_time(12345) } @@ -21,7 +21,7 @@ func test_to_dict() -> void: assert_eq_deep(default_student.to_dict(), default_student_data_dict) default_student.code = 123 default_student.name = "Alice" - default_student.level = StudentData.Level.Adult + default_student.level = StudentData.Level.ADULT default_student.age = 7 default_student.last_modified = Time.get_datetime_string_from_unix_time(12345) assert_eq_deep(default_student.to_dict(), modified_student_data_dict) diff --git a/tests/unit_tests/test_utils.gd b/tests/unit_tests/test_utils.gd new file mode 100644 index 00000000..a3dc04e8 --- /dev/null +++ b/tests/unit_tests/test_utils.gd @@ -0,0 +1,63 @@ +extends GutTest + +const TEST_ROOT: String = "user://test_clean_dir" + + +func after_each() -> void: + _force_delete_directory(TEST_ROOT) + + +func test_delete_directory_recursive_removes_hidden_files() -> void: + # Regression test: the macOS Finder drops .DS_Store files in browsed + # folders; deletion used to fail silently on them, breaking the + # language pack swap in PackageDownloader + _create_file(TEST_ROOT.path_join("visible.txt")) + _create_file(TEST_ROOT.path_join(".hidden")) + _create_file(TEST_ROOT.path_join("sub").path_join(".hidden_nested")) + + Utils.delete_directory_recursive(TEST_ROOT) + + assert_false(DirAccess.dir_exists_absolute(TEST_ROOT), "directory with hidden files should be fully deleted") + + +func test_clean_dir_keeps_root_and_removes_all_content() -> void: + _create_file(TEST_ROOT.path_join("visible.txt")) + _create_file(TEST_ROOT.path_join("sub").path_join("nested.txt")) + + var error: Error = Utils.clean_dir(TEST_ROOT) + + assert_eq(error, OK) + assert_true(DirAccess.dir_exists_absolute(TEST_ROOT), "root directory should be kept") + var dir: DirAccess = DirAccess.open(TEST_ROOT) + dir.include_hidden = true + assert_eq(dir.get_files().size(), 0, "all files should be removed") + assert_eq(dir.get_directories().size(), 0, "all subdirectories should be removed") + + +func test_clean_dir_returns_error_on_missing_directory() -> void: + var error: Error = Utils.clean_dir("user://test_clean_dir_does_not_exist") + + assert_ne(error, OK) + + +func _create_file(path: String) -> void: + DirAccess.make_dir_recursive_absolute(path.get_base_dir()) + var file: FileAccess = FileAccess.open(path, FileAccess.WRITE) + assert_not_null(file, "test setup should be able to create %s" % path) + file.store_string("test") + file.close() + + +# Cleanup helper independent from the code under test +func _force_delete_directory(path: String) -> void: + if not DirAccess.dir_exists_absolute(path): + return + var dir: DirAccess = DirAccess.open(path) + if dir == null: + return + dir.include_hidden = true + for file: String in dir.get_files(): + dir.remove(file) + for subfolder: String in dir.get_directories(): + _force_delete_directory(path.path_join(subfolder)) + DirAccess.remove_absolute(path) diff --git a/tests/unit_tests/test_utils.gd.uid b/tests/unit_tests/test_utils.gd.uid new file mode 100644 index 00000000..62c2615b --- /dev/null +++ b/tests/unit_tests/test_utils.gd.uid @@ -0,0 +1 @@ +uid://34wj4ytlkuvn