Silence Godot 4 editor warnings (debugger)
Address every warning that surfaced in the running game's debugger: - Drop deprecated 'graph_offset = Vector2(...)' lines from the three in-tree VisualShader resources (red.tres, green.tres, Summary.tscn). The property is editor-only graph pan, ignored at runtime but warns at load. - Add android/.gdignore so Godot stops scanning the build template copies of red.tres/green.tres (which still had graph_offset). Tighten .gitignore to keep tracking the .gdignore marker only. - Drop the broken 'nodes/fragment/connections = ...' line from the inline VisualShader in Summary.tscn — connections referenced out-of-bounds ports (e.g. port 1 on a 1-output node). The pre-compiled 'code = ...' string is kept so rendering is unaffected. - Drop the orphaned 'ext_resource WarCraft.lmbake' from WarCraft.tscn: the LightmapGI node no longer references it but Godot still loaded the (Godot-3-format) blob from the ext_resource declaration alone, triggering '(p_data.size() % 4) != 0'. - Animation tracks: SlideReset (Template.tscn), BorderAnim (Loading.tscn), and ObjectFindAll (ListObjects.tscn) each had a bezier track with empty PackedFloat32Array keys, which AnimationMixer rejects in Godot 4. Drop the empty x track in each (the y track held the actual motion). - Re-save 57 .mesh files via scripts/migrate_misc.gd so the surface format is the current Godot 4 variant. sm_stackgold.mesh in particular triggered the deprecation warning every load. GDScript: rename function parameters and locals that shadowed Node.name / Node.value in: - db/MScene.gd (set_lock, set_mesh, set_tick_reference, set_value) - scripts/Setting.gd untouched (no shadow, false positive earlier) - scenes/UI/choose_scenes/ChooseScene.gd (_load_scene, _build_path, _build_method) - scenes/levels/Levels.gd (_create_animation_slide, _create_animation_warning, _add_animation_to_player, _create_button_info, _node_object_list) lod plugin: Godot 4 added 'lod_bias' as a native property on VisualInstance3D, which collided with the plugin's 'lod_bias' member across all five lod_*.gd files. Rename to 'lod_distance_bias' so the scripts parse again. Also drop Light3D.shadow_color writes in lod_omni_light.gd and lod_spot_light.gd — that property was removed in Godot 4, so the related shadow_value computation became dead code. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+3
-1
@@ -10,7 +10,9 @@
|
||||
.godot/
|
||||
|
||||
# Android build template directory generated by the editor
|
||||
android/
|
||||
# (the .gdignore file is kept; everything else under android/ is build output)
|
||||
android/*
|
||||
!android/.gdignore
|
||||
|
||||
export.cfg
|
||||
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
# Puzzle Quest
|
||||
|
||||
Hidden-object game built with **Godot 4.6** (single renderer: Forward+).
|
||||
Branched from a Godot 3.3 codebase — migration is recent, expect leftover
|
||||
Godot-3-isms to occasionally surface.
|
||||
|
||||
## Run
|
||||
|
||||
```
|
||||
godot --editor # open project in the editor
|
||||
godot # run the main scene (scenes/Main.tscn)
|
||||
```
|
||||
|
||||
The system package `godot` (Arch `extra/godot`) is the project's Godot. There
|
||||
is no in-repo Godot binary.
|
||||
|
||||
## Architecture
|
||||
|
||||
**Autoloads** (declared in `project.godot [autoload]`, loaded in this order):
|
||||
|
||||
| Name | Source | Role |
|
||||
|------------------|---------------------------------------|-------------------------------------------------------------------|
|
||||
| `Loading` | `scenes/UI/loading/Loading.tscn` | Full-screen transition overlay (BG + animated border + progress) |
|
||||
| `Global` | `scripts/Global.gd` | Async scene loader (`goto_scene(path)`) + `database` reference |
|
||||
| `Setting` | `scripts/Setting.gd` | Reads/writes the settings table; applies locale/resolution/fullscreen |
|
||||
| `Event` | `scripts/Event.gd` | Static handlers connected to scene buttons (Warcraft / Home / reset / back) |
|
||||
| `GlobalAnimation`| `scripts/Animation.gd` | Tween-based dissolve + HUD slide/warning animations |
|
||||
|
||||
**Database (`scripts/Database.gd`)**
|
||||
|
||||
- Plain JSON at `db/ahog.json`. Three tables: `settings`, `levels`, `scenes`.
|
||||
- On Android the file is copied once to `user://database.json` and written
|
||||
there (game saves modify lock state per item).
|
||||
- `Global.database` is a `Database.DB` instance exposing
|
||||
`get_table_by_name(name)` and `save_db()`. Each `Table` exposes
|
||||
`get_data_at_row_idx(row_id)`, `edit_data(prop_id, row_id, value)`,
|
||||
`m_rows_count`, `get_data_by_prop_name_and_data(prop_name, value)`,
|
||||
`get_dictionary_by_prop_name_and_data(prop_name, value)`.
|
||||
- `db/M*.gd` are typed accessors (MBase / MScene / MLevel / MSetting) that
|
||||
read rows via the API above — extend these, not the JSON shape directly.
|
||||
|
||||
**Scene transitions** (`Global.goto_scene(path)`)
|
||||
|
||||
Uses `ResourceLoader.load_threaded_request` + `load_threaded_get_status` +
|
||||
`load_threaded_get` (Godot 4 API; the original `load_interactive`/`poll()`
|
||||
was removed). The Loading overlay (autoload) plays `BorderAnim` while the
|
||||
new scene loads in a background thread; `Event._loading_is_started/finished`
|
||||
flip `Global.loaded` so the poll only runs once the entry animation has set
|
||||
the boolean. Don't call `current_scene.queue_free()` outside this function
|
||||
— it will leak the resource and break the loader state.
|
||||
|
||||
**Levels.tscn / level scenes**
|
||||
|
||||
`scenes/levels/Levels.tscn` is the shared shell; concrete levels
|
||||
(`warcraft/WarCraft.tscn`, `home/Home.tscn`) inherit from it. Each scene
|
||||
has a `HiddenObjectsItems/<Item>` `MeshInstance3D` with an `Area3D`
|
||||
collision shape; clicking it triggers `Levels._check_collider` →
|
||||
`_start_dissolve(name)` → `GlobalAnimation.start_dissolve(mesh, material)`
|
||||
which runs the dissolve shader on `material.dissolve_amount`.
|
||||
|
||||
The runtime hidden-object list lives under
|
||||
`scenes/levels/parts/ListObjects.tscn` and is populated dynamically from
|
||||
the `scenes` table for the current `Global.current_scene_int`.
|
||||
|
||||
## Migration notes (Godot 3 → 4)
|
||||
|
||||
The conversion is mostly done but a few classes of mistake keep surfacing
|
||||
because `godot --convert-3to4` does not handle them:
|
||||
|
||||
- **Label**: `align/valign` → `horizontal_alignment/vertical_alignment`.
|
||||
- **Button**: `pressed` (property) → `button_pressed`; `set_pressed()` →
|
||||
assignment to `button_pressed`. The `pressed` *signal* still exists.
|
||||
- **ScrollContainer**: `scroll_horizontal_enabled = false` →
|
||||
`horizontal_scroll_mode = 0` (and same for vertical). ScrollContainer
|
||||
also ships a non-empty default panel style in Godot 4 — set
|
||||
`theme_override_styles/panel = StyleBoxEmpty` if you need transparency.
|
||||
- **TextureRect / TextureButton**: `expand = true` → `expand_mode = 1`.
|
||||
`stretch_mode` enum values **shifted down by 1** between 3 and 4 (the
|
||||
deprecated "Scale on Expand" at index 0 was removed): G3's Tile (2) is
|
||||
G4's Tile (1), G3's Keep (3) is G4's Keep (2), etc.
|
||||
- **Environment**: `background_mode` enum changed (G3 3=Sky → G4 2=Sky;
|
||||
G4 3 is Canvas which renders black). `background_sky` → `sky`;
|
||||
`background_energy` → `background_energy_multiplier`;
|
||||
`fog_color` → `fog_light_color`; `fog_height_min` → `fog_height`;
|
||||
`fog_mode = 1` (Depth) needed to keep `fog_depth_*` semantics, otherwise
|
||||
Godot 4 falls back to dense `fog_density` exponential fog.
|
||||
- **AnimationPlayer**: `add_animation(name, anim)` removed — go through
|
||||
`get_animation_library("")` (create one with `add_animation_library("")`
|
||||
if it returns null) and call `lib.add_animation(name, anim)`.
|
||||
- **Tween**: no longer a Node — call `create_tween()` from any Node and use
|
||||
`tween.tween_method(...)`. Delete any `[node type="Tween"]` from older
|
||||
`.tscn` files (the loader will crash otherwise).
|
||||
- **PhysicsRayQuery**: `space_state.intersect_ray(from, to, ...)` →
|
||||
`PhysicsRayQueryParameters3D.create(from, to)`, set fields, then
|
||||
`space_state.intersect_ray(query)`.
|
||||
- **PackedScene.instance()** → `instantiate()`.
|
||||
- **String / cast operators**: `String(x)` constructor doesn't exist — use
|
||||
`str(x)`. `x as int/String/bool` does **not** parse strings — use
|
||||
`int(s)`, `str(x)`, `bool(int(s))`.
|
||||
- **Internationalization**: project setting is `[internationalization]
|
||||
locale/translations=...`, not `[locale] translations=...`. Locale codes
|
||||
must match `.po` filenames exactly (`fr.po` → `"fr"`; G3-style `fr_FR`
|
||||
no longer auto-falls-back).
|
||||
- **Inherited scenes**: nodes from an instanced child scene need
|
||||
`layout_mode = 1` + `anchors_preset = 15` explicitly set in the parent
|
||||
scene file, otherwise Godot 4 treats them as Position-mode and zeroes
|
||||
the anchors. Watch for stale per-Label `layout_mode = 0` /
|
||||
`anchor_right = 0` overrides in Main.tscn-style parent scenes.
|
||||
|
||||
## Plugins
|
||||
|
||||
- `addons/lod/` — Calinou's Level-of-Detail plugin (Spatial / OmniLight /
|
||||
SpotLight / Particles → 3D variants). Class declarations use the Godot 4
|
||||
form (`@icon("...") class_name X` + `extends Node3D` separately).
|
||||
- `addons/godot_db_manager/` — **removed during migration**. Don't restore
|
||||
it; it relies on `WindowDialog`/`Tabs`/`PopupPanel` which were dropped in
|
||||
Godot 4. The replacement is `scripts/Database.gd` (see above).
|
||||
|
||||
## Custom shaders / materials
|
||||
|
||||
Drop-in shaders live in `.material` resources (binary `RSCC` format) next
|
||||
to each prop. `scripts/migrate_shaders.gd` is a one-shot tool that walks
|
||||
`assets/` and rewrites the embedded shader code (Godot 3 → 4 keyword
|
||||
renames: `depth_draw_alpha_prepass`, `hint_color`, `NORMALMAP`). Re-run it
|
||||
with `godot --headless --script scripts/migrate_shaders.gd` after adding
|
||||
new materials authored in Godot 3.
|
||||
|
||||
`assets/fonts/text_outline.material` is a VisualShader graph from Godot 3
|
||||
that doesn't connect cleanly in 4 (out-of-bounds `p_from_port` errors,
|
||||
COLOR never written). It has been detached from the Summary menu labels;
|
||||
re-author it with Godot 4's built-in `theme_override_constants/outline_size`
|
||||
+ `theme_override_colors/font_outline_color` instead.
|
||||
|
||||
## Known visual issues to revisit
|
||||
|
||||
- **Baked lightmap is gone.** `scenes/levels/warcraft/WarCraft.lmbake` is
|
||||
in Godot 3's binary format (incompatible). The `LightmapGI` node still
|
||||
exists in `WarCraft.tscn` but its `light_data` reference is cleared.
|
||||
Open the scene in the editor and re-bake (Scene → Bake Lightmaps).
|
||||
- **`assets/ui/themes/tab_select/UI-level-btn-shadow.png`** is 83% opaque
|
||||
black with feathered edges (a drop-shadow texture). In Godot 4 it
|
||||
renders stretched and opaque, which looked like a black square below
|
||||
each level tile, so its `BackgroundTile` TextureRect is currently
|
||||
`visible = false`. Replace with a proper 9-patch / shader if the shadow
|
||||
effect is wanted.
|
||||
- `developers/aurelien/` is a sandbox — files there (`ui_scrolls.tscn`,
|
||||
`ui_tile.tscn`, `CheckLightmap.tscn`) still use Godot-3 property names
|
||||
in places. Not on the main flow, low priority.
|
||||
|
||||
## CI
|
||||
|
||||
Build pipeline is in `releases/.drone.yml`. The Docker images still pin
|
||||
`barichello/godot-ci:3.3.2` and a custom `devcrea/godot-ci:3.3.2-android`
|
||||
— **bump these to a 4.x image** before relying on CI builds again. Butler
|
||||
push targets `dev-crea/ahog:windows|android|linux|mac` on itch.io.
|
||||
|
||||
Branches: default `dev`, releases from `main`. Long-running migration work
|
||||
on `feature/godot-migration`.
|
||||
|
||||
## Conventions
|
||||
|
||||
- Don't commit `db/ahog.json` runtime mutations (lock progress saved
|
||||
during play). The README documents using `git update-index --skip-worktree`
|
||||
but the cleaner alternative is just to `git checkout db/ahog.json`
|
||||
before staging.
|
||||
- `android/`, `.godot/`, and `releases/` are in `.gitignore`. The
|
||||
`.import` sidecars next to assets **are** committed (they carry the
|
||||
stable UIDs Godot 4 generates).
|
||||
- Commit messages: imperative, English, explain the *why* (especially for
|
||||
migration commits — the next person reading the diff won't have the
|
||||
Godot 3 context).
|
||||
@@ -23,7 +23,7 @@ var refresh_rate := 0.25
|
||||
# Positive values will decrease the detail level and improve performance.
|
||||
# Negative values will improve visual appearance at the cost of performance.
|
||||
# This can overridden by setting the project setting `lod/bias`.
|
||||
var lod_bias := 0.0
|
||||
var lod_distance_bias := 0.0
|
||||
|
||||
# The internal refresh timer.
|
||||
var timer := 0.0
|
||||
@@ -31,7 +31,7 @@ var timer := 0.0
|
||||
|
||||
func _ready() -> void:
|
||||
if ProjectSettings.has_setting("lod/particle_bias"):
|
||||
lod_bias = ProjectSettings.get_setting("lod/particle_bias")
|
||||
lod_distance_bias = ProjectSettings.get_setting("lod/particle_bias")
|
||||
if ProjectSettings.has_setting("lod/refresh_rate"):
|
||||
refresh_rate = ProjectSettings.get_setting("lod/refresh_rate")
|
||||
|
||||
@@ -56,5 +56,5 @@ func _physics_process(delta: float) -> void:
|
||||
|
||||
timer = 0.0
|
||||
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_bias
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_distance_bias
|
||||
emitting = distance < max_emit_distance
|
||||
|
||||
@@ -36,7 +36,7 @@ var refresh_rate := 0.05
|
||||
# Positive values will decrease the detail level and improve performance.
|
||||
# Negative values will improve visual appearance at the cost of performance.
|
||||
# This can overridden by setting the project setting `lod/bias`.
|
||||
var lod_bias := 0.0
|
||||
var lod_distance_bias := 0.0
|
||||
|
||||
# The internal refresh timer.
|
||||
var timer := 0.0
|
||||
@@ -47,7 +47,7 @@ var base_light_energy := light_energy
|
||||
|
||||
func _ready() -> void:
|
||||
if ProjectSettings.has_setting("lod/light_bias"):
|
||||
lod_bias = ProjectSettings.get_setting("lod/light_bias")
|
||||
lod_distance_bias = ProjectSettings.get_setting("lod/light_bias")
|
||||
if ProjectSettings.has_setting("lod/light_refresh_rate"):
|
||||
refresh_rate = ProjectSettings.get_setting("lod/light_refresh_rate")
|
||||
|
||||
@@ -72,7 +72,7 @@ func _physics_process(delta: float) -> void:
|
||||
|
||||
timer = 0.0
|
||||
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_bias
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_distance_bias
|
||||
|
||||
visible = distance < light_max_distance
|
||||
var light_fade_start_distance := light_max_distance * light_fade_start
|
||||
@@ -83,11 +83,3 @@ func _physics_process(delta: float) -> void:
|
||||
light_energy = base_light_energy
|
||||
|
||||
shadow_enabled = distance < shadow_max_distance
|
||||
var shadow_fade_start_distance := shadow_max_distance * shadow_fade_start
|
||||
var shadow_value: float
|
||||
if distance > shadow_fade_start_distance:
|
||||
shadow_value = min(1, (distance - shadow_fade_start_distance) / (shadow_max_distance - shadow_fade_start_distance))
|
||||
else:
|
||||
# We're close enough to the light to show its shadow at full darkness.
|
||||
shadow_value = 0.0
|
||||
shadow_color = Color(shadow_value, shadow_value, shadow_value)
|
||||
|
||||
@@ -23,7 +23,7 @@ var refresh_rate := 0.25
|
||||
# Positive values will decrease the detail level and improve performance.
|
||||
# Negative values will improve visual appearance at the cost of performance.
|
||||
# This can overridden by setting the project setting `lod/bias`.
|
||||
var lod_bias := 0.0
|
||||
var lod_distance_bias := 0.0
|
||||
|
||||
# The internal refresh timer.
|
||||
var timer := 0.0
|
||||
@@ -31,7 +31,7 @@ var timer := 0.0
|
||||
|
||||
func _ready() -> void:
|
||||
if ProjectSettings.has_setting("lod/particle_bias"):
|
||||
lod_bias = ProjectSettings.get_setting("lod/particle_bias")
|
||||
lod_distance_bias = ProjectSettings.get_setting("lod/particle_bias")
|
||||
if ProjectSettings.has_setting("lod/refresh_rate"):
|
||||
refresh_rate = ProjectSettings.get_setting("lod/refresh_rate")
|
||||
|
||||
@@ -56,5 +56,5 @@ func _physics_process(delta: float) -> void:
|
||||
|
||||
timer = 0.0
|
||||
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_bias
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_distance_bias
|
||||
emitting = distance < max_emit_distance
|
||||
|
||||
@@ -30,7 +30,7 @@ var refresh_rate := 0.25
|
||||
# Positive values will decrease the detail level and improve performance.
|
||||
# Negative values will improve visual appearance at the cost of performance.
|
||||
# This can overridden by setting the project setting `lod/bias`.
|
||||
var lod_bias := 0.0
|
||||
var lod_distance_bias := 0.0
|
||||
|
||||
# The internal refresh timer.
|
||||
var timer := 0.0
|
||||
@@ -38,7 +38,7 @@ var timer := 0.0
|
||||
|
||||
func _ready() -> void:
|
||||
if ProjectSettings.has_setting("lod/spatial_bias"):
|
||||
lod_bias = ProjectSettings.get_setting("lod/spatial_bias")
|
||||
lod_distance_bias = ProjectSettings.get_setting("lod/spatial_bias")
|
||||
if ProjectSettings.has_setting("lod/refresh_rate"):
|
||||
refresh_rate = ProjectSettings.get_setting("lod/refresh_rate")
|
||||
|
||||
@@ -64,7 +64,7 @@ func _physics_process(delta: float) -> void:
|
||||
|
||||
timer = 0.0
|
||||
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_bias
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_distance_bias
|
||||
# The LOD level to choose (lower is more detailed).
|
||||
var lod: int
|
||||
if distance < lod_0_max_distance:
|
||||
|
||||
@@ -36,7 +36,7 @@ var refresh_rate := 0.05
|
||||
# Positive values will decrease the detail level and improve performance.
|
||||
# Negative values will improve visual appearance at the cost of performance.
|
||||
# This can overridden by setting the project setting `lod/bias`.
|
||||
var lod_bias := 0.0
|
||||
var lod_distance_bias := 0.0
|
||||
|
||||
# The internal refresh timer.
|
||||
var timer := 0.0
|
||||
@@ -47,7 +47,7 @@ var base_light_energy := light_energy
|
||||
|
||||
func _ready() -> void:
|
||||
if ProjectSettings.has_setting("lod/light_bias"):
|
||||
lod_bias = ProjectSettings.get_setting("lod/light_bias")
|
||||
lod_distance_bias = ProjectSettings.get_setting("lod/light_bias")
|
||||
if ProjectSettings.has_setting("lod/light_refresh_rate"):
|
||||
refresh_rate = ProjectSettings.get_setting("lod/light_refresh_rate")
|
||||
|
||||
@@ -72,7 +72,7 @@ func _physics_process(delta: float) -> void:
|
||||
|
||||
timer = 0.0
|
||||
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_bias
|
||||
var distance := camera.global_transform.origin.distance_to(global_transform.origin) + lod_distance_bias
|
||||
|
||||
visible = distance < light_max_distance
|
||||
var light_fade_start_distance := light_max_distance * light_fade_start
|
||||
@@ -83,11 +83,3 @@ func _physics_process(delta: float) -> void:
|
||||
light_energy = base_light_energy
|
||||
|
||||
shadow_enabled = distance < shadow_max_distance
|
||||
var shadow_fade_start_distance := shadow_max_distance * shadow_fade_start
|
||||
var shadow_value: float
|
||||
if distance > shadow_fade_start_distance:
|
||||
shadow_value = min(1, (distance - shadow_fade_start_distance) / (shadow_max_distance - shadow_fade_start_distance))
|
||||
else:
|
||||
# We're close enough to the light to show its shadow at full darkness.
|
||||
shadow_value = 0.0
|
||||
shadow_color = Color(shadow_value, shadow_value, shadow_value)
|
||||
|
||||
@@ -31,7 +31,6 @@ void light() {
|
||||
|
||||
}
|
||||
"
|
||||
graph_offset = Vector2( -278, -353.75 )
|
||||
nodes/fragment/5/node = SubResource( 1 )
|
||||
nodes/fragment/5/position = Vector2( 180, 140 )
|
||||
nodes/fragment/connections = PackedInt32Array( 5, 0, 0, 0 )
|
||||
|
||||
@@ -31,7 +31,6 @@ void light() {
|
||||
|
||||
}
|
||||
"
|
||||
graph_offset = Vector2( -278, -353.75 )
|
||||
nodes/fragment/5/node = SubResource( 1 )
|
||||
nodes/fragment/5/position = Vector2( 180, 140 )
|
||||
nodes/fragment/connections = PackedInt32Array( 5, 0, 0, 0 )
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dvoars6va7511"
|
||||
path="res://.godot/imported/dagger_Dagger_BC.png-6deff32a41940f92bbdb14bc9b47beb3.ctex"
|
||||
path.s3tc="res://.godot/imported/dagger_Dagger_BC.png-6deff32a41940f92bbdb14bc9b47beb3.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/props/dagger/dagger_Dagger_BC.png"
|
||||
dest_files=["res://.godot/imported/dagger_Dagger_BC.png-6deff32a41940f92bbdb14bc9b47beb3.ctex"]
|
||||
dest_files=["res://.godot/imported/dagger_Dagger_BC.png-6deff32a41940f92bbdb14bc9b47beb3.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,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=""
|
||||
@@ -37,4 +38,4 @@ 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
|
||||
detect_3d/compress_to=0
|
||||
|
||||
@@ -3,30 +3,31 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cfhmpp3pitqbi"
|
||||
path="res://.godot/imported/dagger_Dagger_NM.png-16adfa9ec4fd4455ed9dd788fbba2519.ctex"
|
||||
path.s3tc="res://.godot/imported/dagger_Dagger_NM.png-16adfa9ec4fd4455ed9dd788fbba2519.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/props/dagger/dagger_Dagger_NM.png"
|
||||
dest_files=["res://.godot/imported/dagger_Dagger_NM.png-16adfa9ec4fd4455ed9dd788fbba2519.ctex"]
|
||||
dest_files=["res://.godot/imported/dagger_Dagger_NM.png-16adfa9ec4fd4455ed9dd788fbba2519.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
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/normal_map=1
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
roughness/mode=1
|
||||
roughness/src_normal="res://assets/props/dagger/dagger_Dagger_NM.png"
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
@@ -37,4 +38,4 @@ 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
|
||||
detect_3d/compress_to=0
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b5jfvsejxruax"
|
||||
path="res://.godot/imported/dagger_dagger_E.png-f59a7c6d2e36ce0df3488a3ad845f982.ctex"
|
||||
path.s3tc="res://.godot/imported/dagger_dagger_E.png-f59a7c6d2e36ce0df3488a3ad845f982.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/props/dagger/dagger_dagger_E.png"
|
||||
dest_files=["res://.godot/imported/dagger_dagger_E.png-f59a7c6d2e36ce0df3488a3ad845f982.ctex"]
|
||||
dest_files=["res://.godot/imported/dagger_dagger_E.png-f59a7c6d2e36ce0df3488a3ad845f982.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,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=""
|
||||
@@ -37,4 +38,4 @@ 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
|
||||
detect_3d/compress_to=0
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b2yaxbeog0iiq"
|
||||
path="res://.godot/imported/dagger_dagger_ORM.png-d6cee18aee3cb84d78327e37eda49e85.ctex"
|
||||
path.s3tc="res://.godot/imported/dagger_dagger_ORM.png-d6cee18aee3cb84d78327e37eda49e85.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://assets/props/dagger/dagger_dagger_ORM.png"
|
||||
dest_files=["res://.godot/imported/dagger_dagger_ORM.png-d6cee18aee3cb84d78327e37eda49e85.ctex"]
|
||||
dest_files=["res://.godot/imported/dagger_dagger_ORM.png-d6cee18aee3cb84d78327e37eda49e85.s3tc.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,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=""
|
||||
@@ -37,4 +38,4 @@ 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
|
||||
detect_3d/compress_to=0
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
-8
@@ -44,8 +44,8 @@ func label_counter():
|
||||
func lock():
|
||||
return m_lock
|
||||
|
||||
func set_lock(value):
|
||||
m_lock = _set_data(LOCK_ID, m_row_id, value)
|
||||
func set_lock(p_value):
|
||||
m_lock = _set_data(LOCK_ID, m_row_id, p_value)
|
||||
|
||||
func mesh():
|
||||
return m_mesh
|
||||
@@ -53,20 +53,20 @@ func mesh():
|
||||
func tween():
|
||||
return m_mesh + "/Tween"
|
||||
|
||||
func set_mesh(value):
|
||||
m_mesh = value
|
||||
func set_mesh(p_value):
|
||||
m_mesh = p_value
|
||||
|
||||
func tick_reference():
|
||||
return m_tick_reference
|
||||
|
||||
func set_tick_reference(value):
|
||||
m_tick_reference = value
|
||||
func set_tick_reference(p_value):
|
||||
m_tick_reference = p_value
|
||||
|
||||
func value():
|
||||
return m_value
|
||||
|
||||
func set_value(value):
|
||||
m_value = value
|
||||
func set_value(p_value):
|
||||
m_value = p_value
|
||||
|
||||
func audio_sound():
|
||||
var stream = load("res://assets/sounds/objects/" + label() + ".ogg")
|
||||
|
||||
@@ -18,17 +18,17 @@ func _apply_scene(level, index):
|
||||
configure_reset(level, node, index, false)
|
||||
configure_counter(level, node)
|
||||
|
||||
func _load_scene(name):
|
||||
func _load_scene(p_name):
|
||||
var template_instance = template.instantiate()
|
||||
template_instance.set_name(name)
|
||||
template_instance.set_name(p_name)
|
||||
|
||||
return template_instance
|
||||
|
||||
func _build_path(name):
|
||||
return "MarginContainer/"+name
|
||||
func _build_path(p_name):
|
||||
return "MarginContainer/" + p_name
|
||||
|
||||
func _build_method(name):
|
||||
return "_on_"+name.to_lower()+"_pressed"
|
||||
func _build_method(p_name):
|
||||
return "_on_" + p_name.to_lower() + "_pressed"
|
||||
|
||||
func _load_texture(thumbnail):
|
||||
return load(thumbnail)
|
||||
|
||||
@@ -12,22 +12,12 @@
|
||||
[sub_resource type="Animation" id=1]
|
||||
resource_name = "SlideReset"
|
||||
tracks/0/type = "bezier"
|
||||
tracks/0/path = NodePath("MarginContainer/CenterAlign/MainButton/TabAlign/ButtonReset:position:x")
|
||||
tracks/0/path = NodePath("MarginContainer/CenterAlign/MainButton/TabAlign/ButtonReset:position:y")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"points": PackedFloat32Array( ),
|
||||
"times": PackedFloat32Array( )
|
||||
}
|
||||
tracks/1/type = "bezier"
|
||||
tracks/1/path = NodePath("MarginContainer/CenterAlign/MainButton/TabAlign/ButtonReset:position:y")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"points": PackedFloat32Array( 0, -0.25, 0, 0.506539, 0.5, -40, -0.236722, -22.5, 0.25, 0 ),
|
||||
"times": PackedFloat32Array( 0, 1 )
|
||||
}
|
||||
|
||||
@@ -7,32 +7,22 @@
|
||||
[sub_resource type="Animation" id=1]
|
||||
resource_name = "BorderAnim"
|
||||
tracks/0/type = "bezier"
|
||||
tracks/0/path = NodePath("LoadingTopBorder:position:x")
|
||||
tracks/0/path = NodePath("LoadingTopBorder:position:y")
|
||||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
tracks/0/keys = {
|
||||
"points": PackedFloat32Array( ),
|
||||
"times": PackedFloat32Array( )
|
||||
"points": PackedFloat32Array( -768, -0.25, 0, 1.01154, 306.838, -160.174, -1.02203, -283.071, 0.439946, 60.9141, -27.6065, -0.45336, -19.562, 0.536352, 17.1993, 0.362091, -0.538766, -0.968613, 0.25, 0 ),
|
||||
"times": PackedFloat32Array( 0.1, 0.3, 0.6, 0.9 )
|
||||
}
|
||||
tracks/1/type = "bezier"
|
||||
tracks/1/path = NodePath("LoadingTopBorder:position:y")
|
||||
tracks/1/path = NodePath("LoadingBare:modulate:a")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"points": PackedFloat32Array( -768, -0.25, 0, 1.01154, 306.838, -160.174, -1.02203, -283.071, 0.439946, 60.9141, -27.6065, -0.45336, -19.562, 0.536352, 17.1993, 0.362091, -0.538766, -0.968613, 0.25, 0 ),
|
||||
"times": PackedFloat32Array( 0.1, 0.3, 0.6, 0.9 )
|
||||
}
|
||||
tracks/2/type = "bezier"
|
||||
tracks/2/path = NodePath("LoadingBare:modulate:a")
|
||||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/imported = false
|
||||
tracks/2/enabled = true
|
||||
tracks/2/keys = {
|
||||
"points": PackedFloat32Array( 0, -0.25, 0, 1.10651, 0.716757, 1, -1.59408, -0.0328361, 0.25, 0 ),
|
||||
"times": PackedFloat32Array( 0, 0.4 )
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
[ext_resource path="res://assets/fonts/kirsty/kirsty_base.tres" type="FontFile" id=3]
|
||||
[ext_resource path="res://assets/fonts/kirsty/kirsty_title.tres" type="FontFile" id=4]
|
||||
[ext_resource path="res://assets/ui/icones/treasure.png" type="Texture2D" id=5]
|
||||
[ext_resource path="res://assets/fonts/text_outline.material" type="Material" id=6]
|
||||
[ext_resource path="res://assets/ui/icones/treasure-hover.png" type="Texture2D" id=7]
|
||||
[ext_resource path="res://assets/ui/themes/bck-vert-grd.png" type="Texture2D" id=8]
|
||||
[ext_resource path="res://assets/ui/themes/wood-tile.jpg" type="Texture2D" id=9]
|
||||
@@ -129,7 +128,6 @@ void light() {
|
||||
|
||||
}
|
||||
"
|
||||
graph_offset = Vector2( -1049.92, -110.97 )
|
||||
mode = 1
|
||||
flags/light_only = false
|
||||
nodes/fragment/0/position = Vector2( 2300, 540 )
|
||||
@@ -163,7 +161,6 @@ nodes/fragment/22/node = SubResource( 8 )
|
||||
nodes/fragment/22/position = Vector2( 1260, 780 )
|
||||
nodes/fragment/23/node = SubResource( 9 )
|
||||
nodes/fragment/23/position = Vector2( 1080, 1080 )
|
||||
nodes/fragment/connections = PackedInt32Array( 8, 0, 5, 1, 7, 1, 8, 0, 7, 0, 5, 0, 5, 0, 4, 0, 3, 0, 11, 0, 6, 0, 11, 1, 11, 0, 7, 0, 14, 0, 15, 0, 4, 0, 17, 0, 15, 1, 17, 2, 4, 0, 19, 1, 18, 0, 19, 0, 19, 0, 17, 1, 4, 0, 22, 0, 20, 0, 0, 0, 15, 1, 23, 0, 22, 0, 20, 0, 15, 1, 20, 2, 17, 0, 20, 1 )
|
||||
|
||||
[sub_resource type="ShaderMaterial" id=17]
|
||||
shader = SubResource( 16 )
|
||||
|
||||
+12
-13
@@ -70,16 +70,16 @@ func _load_ambient_sound():
|
||||
|
||||
func _create_button_info(scene, counter, label_counter):
|
||||
var button = _search_button_to_use(counter)
|
||||
var name = scene.label()
|
||||
var label_name = scene.label()
|
||||
|
||||
if label_counter != null and label_counter == scene.label_counter():
|
||||
name = last_button.get_node("Label").text + " " + str(scene.counter())
|
||||
_configure_button_object(last_button, scene, name)
|
||||
_create_animation_warning(_get_node_animated().get_node("Label"), name)
|
||||
label_name = last_button.get_node("Label").text + " " + str(scene.counter())
|
||||
_configure_button_object(last_button, scene, label_name)
|
||||
_create_animation_warning(_get_node_animated().get_node("Label"), label_name)
|
||||
else:
|
||||
$ListObjects/ListContainer.add_child(button)
|
||||
_configure_button_object(button, scene, name)
|
||||
_create_animation_slide(_get_node_animated(), name)
|
||||
_configure_button_object(button, scene, label_name)
|
||||
_create_animation_slide(_get_node_animated(), label_name)
|
||||
|
||||
last_button = button
|
||||
|
||||
@@ -101,19 +101,19 @@ func _configure_button_object(button, scene, label):
|
||||
button.set_meta("counter", scene.counter())
|
||||
button.set_meta("counted", 0)
|
||||
|
||||
func _create_animation_slide(node, name):
|
||||
_add_animation_to_player(name, GlobalAnimation.level_hud_slide(node))
|
||||
func _create_animation_slide(node, p_name):
|
||||
_add_animation_to_player(p_name, GlobalAnimation.level_hud_slide(node))
|
||||
|
||||
func _create_animation_warning(node, name):
|
||||
_add_animation_to_player(name, GlobalAnimation.level_hud_warning(node))
|
||||
func _create_animation_warning(node, p_name):
|
||||
_add_animation_to_player(p_name, GlobalAnimation.level_hud_warning(node))
|
||||
|
||||
func _add_animation_to_player(name: String, anim: Animation) -> void:
|
||||
func _add_animation_to_player(p_name: String, anim: Animation) -> void:
|
||||
var player = $ListObjects/AnimationPlayer
|
||||
var lib = player.get_animation_library("")
|
||||
if lib == null:
|
||||
lib = AnimationLibrary.new()
|
||||
player.add_animation_library("", lib)
|
||||
lib.add_animation(name, anim)
|
||||
lib.add_animation(p_name, anim)
|
||||
|
||||
func _process(_delta):
|
||||
_check_dissolve_mesh()
|
||||
@@ -233,7 +233,6 @@ func _node_to_area(key):
|
||||
|
||||
func _node_object_list(key):
|
||||
var animation_played = null
|
||||
var name = null
|
||||
|
||||
for child in $ListObjects/ListContainer.get_children():
|
||||
if child.has_meta("name"):
|
||||
|
||||
@@ -30,16 +30,6 @@ tracks/0/keys = {
|
||||
"points": PackedFloat32Array( 0, -0.25, 0, 0.0305311, 190.492, 170, -0.349132, 2.57608, 0.25, 0 ),
|
||||
"times": PackedFloat32Array( 0, 1 )
|
||||
}
|
||||
tracks/1/type = "bezier"
|
||||
tracks/1/path = NodePath("ListContainer/TextureButtonLast:position:y")
|
||||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/imported = false
|
||||
tracks/1/enabled = true
|
||||
tracks/1/keys = {
|
||||
"points": PackedFloat32Array( ),
|
||||
"times": PackedFloat32Array( )
|
||||
}
|
||||
|
||||
[node name="Control" type="MarginContainer"]
|
||||
anchor_left = 1.0
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
[ext_resource path="res://assets/props/fireplace/sm_fireplace.mesh" type="ArrayMesh" id=38]
|
||||
[ext_resource path="res://assets/materials/gray.tres" type="Material" id=39]
|
||||
[ext_resource path="res://assets/props/rock floor/materials/MA_rock_floor.material" type="Material" id=40]
|
||||
[ext_resource path="res://scenes/levels/warcraft/WarCraft.lmbake" type="LightmapGIData" id=41]
|
||||
|
||||
[sub_resource type="Sky" id=1]
|
||||
panorama = ExtResource( 11 )
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
@tool
|
||||
extends SceneTree
|
||||
|
||||
# One-shot cleanup:
|
||||
# 1. Reset VisualShader.graph_offset to default on every .material so the
|
||||
# deprecated property no longer triggers a warning at load.
|
||||
# 2. Re-save every .mesh whose surface format is the old (Godot 3) variant
|
||||
# so Godot 4 stops nagging.
|
||||
|
||||
func _init() -> void:
|
||||
var changed := 0
|
||||
|
||||
for path in _find_resources("res://assets", [".material", ".tres"]):
|
||||
var res = ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_IGNORE)
|
||||
if res is ShaderMaterial and res.shader is VisualShader:
|
||||
var vs: VisualShader = res.shader
|
||||
if vs.graph_offset != Vector2.ZERO:
|
||||
vs.graph_offset = Vector2.ZERO
|
||||
if ResourceSaver.save(res, path) == OK:
|
||||
changed += 1
|
||||
print("CLEARED graph_offset on ", path)
|
||||
|
||||
for path in _find_resources("res://assets", [".mesh"]):
|
||||
var mesh = ResourceLoader.load(path, "", ResourceLoader.CACHE_MODE_IGNORE)
|
||||
if mesh is ArrayMesh:
|
||||
# Just re-saving rewrites the file using the current surface format.
|
||||
if ResourceSaver.save(mesh, path) == OK:
|
||||
changed += 1
|
||||
print("RESAVED mesh ", path)
|
||||
|
||||
print("Done. changed=", changed)
|
||||
quit()
|
||||
|
||||
func _find_resources(dir_path: String, exts: Array) -> Array:
|
||||
var result := []
|
||||
var dir = DirAccess.open(dir_path)
|
||||
if dir == null:
|
||||
return result
|
||||
dir.list_dir_begin()
|
||||
var name = dir.get_next()
|
||||
while name != "":
|
||||
if name != "." and name != "..":
|
||||
var sub = dir_path + "/" + name
|
||||
if dir.current_is_dir():
|
||||
result.append_array(_find_resources(sub, exts))
|
||||
else:
|
||||
for ext in exts:
|
||||
if name.ends_with(ext):
|
||||
result.append(sub)
|
||||
break
|
||||
name = dir.get_next()
|
||||
return result
|
||||
@@ -0,0 +1 @@
|
||||
uid://be5t0j47tufka
|
||||
Reference in New Issue
Block a user