Clean code naming convention
This commit is contained in:
+1024
File diff suppressed because it is too large
Load Diff
+23
-23
@@ -1,16 +1,16 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
class_name Gardens
|
||||||
|
|
||||||
signal minigame_layout_opened()
|
signal minigame_layout_opened()
|
||||||
|
|
||||||
# Namespace
|
# Namespace
|
||||||
const LookAndLearn: = preload("res://sources/look_and_learn/look_and_learn.gd")
|
const KALULU: = preload("res://sources/minigames/base/kalulu.gd")
|
||||||
const MinigameLayout: = preload("res://sources/gardens/minigame_layout.gd")
|
|
||||||
const Kalulu: = preload("res://sources/minigames/base/kalulu.gd")
|
|
||||||
|
|
||||||
const garden_scene: PackedScene = preload("res://resources/gardens/garden.tscn")
|
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 LOOK_AND_LEARN_SCENE: PackedScene = preload("res://sources/look_and_learn/look_and_learn.tscn")
|
||||||
const flower_fvx: PackedScene = preload("res://sources/gardens/flower_particle.tscn")
|
const FLOWER_FVX: PackedScene = preload("res://sources/gardens/flower_particle.tscn")
|
||||||
|
|
||||||
const garden_size: int = 2400
|
const GARDEN_SIZE: int = 2400
|
||||||
|
|
||||||
@export_category("Layout")
|
@export_category("Layout")
|
||||||
@export var gardens_layout: GardensLayout:
|
@export var gardens_layout: GardensLayout:
|
||||||
@@ -46,7 +46,7 @@ const garden_size: int = 2400
|
|||||||
@onready var minigame_background: TextureRect = %MinigameBackground
|
@onready var minigame_background: TextureRect = %MinigameBackground
|
||||||
@onready var minigame_background_center: TextureRect = %MinigameBackgroundCenter
|
@onready var minigame_background_center: TextureRect = %MinigameBackgroundCenter
|
||||||
@onready var lock: Control = %Lock
|
@onready var lock: Control = %Lock
|
||||||
@onready var kalulu: Kalulu = %Kalulu
|
@onready var kalulu: KALULU = %Kalulu
|
||||||
@onready var kalulu_button: CanvasItem = %KaluluButton
|
@onready var kalulu_button: CanvasItem = %KaluluButton
|
||||||
|
|
||||||
@onready var intro_speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path("gardens_screen", "intro"))
|
@onready var intro_speech: AudioStreamMP3 = Database.load_external_sound(Database.get_kalulu_speech_path("gardens_screen", "intro"))
|
||||||
@@ -238,9 +238,9 @@ func _ready() -> void:
|
|||||||
Logger.error("Gardens: initialisation: transition_data exists but does not contains the needed current_garden_index")
|
Logger.error("Gardens: initialisation: transition_data exists but does not contains the needed current_garden_index")
|
||||||
starting_garden = 0
|
starting_garden = 0
|
||||||
|
|
||||||
scroll_container.scroll_horizontal = garden_size * starting_garden
|
scroll_container.scroll_horizontal = GARDEN_SIZE * starting_garden
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
scroll_beginning_garden = scroll_container.scroll_horizontal / garden_size
|
scroll_beginning_garden = scroll_container.scroll_horizontal / GARDEN_SIZE
|
||||||
|
|
||||||
current_garden = garden_parent.get_child(starting_garden)
|
current_garden = garden_parent.get_child(starting_garden)
|
||||||
|
|
||||||
@@ -285,7 +285,7 @@ func _ready() -> void:
|
|||||||
play_animation = true
|
play_animation = true
|
||||||
|
|
||||||
if play_animation:
|
if play_animation:
|
||||||
var fvfx: FlowerVFX = flower_fvx.instantiate()
|
var fvfx: FlowerVFX = FLOWER_FVX.instantiate()
|
||||||
current_garden.flower_controls[flower_ind].add_child(fvfx)
|
current_garden.flower_controls[flower_ind].add_child(fvfx)
|
||||||
fvfx.anchor_bottom = 0.5
|
fvfx.anchor_bottom = 0.5
|
||||||
fvfx.anchor_top = 0.5
|
fvfx.anchor_top = 0.5
|
||||||
@@ -346,14 +346,14 @@ func _ready() -> void:
|
|||||||
# Check if we need to scroll to the next garden
|
# Check if we need to scroll to the next garden
|
||||||
if is_last_lesson_of_garden:
|
if is_last_lesson_of_garden:
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
scroll_beginning_garden = scroll_container.scroll_horizontal / garden_size
|
scroll_beginning_garden = scroll_container.scroll_horizontal / GARDEN_SIZE
|
||||||
var target_scroll: int = scroll_beginning_garden * garden_size + garden_size
|
var target_scroll: int = scroll_beginning_garden * GARDEN_SIZE + GARDEN_SIZE
|
||||||
var tween: Tween = create_tween()
|
var tween: Tween = create_tween()
|
||||||
tween.set_ease(Tween.EASE_IN_OUT)
|
tween.set_ease(Tween.EASE_IN_OUT)
|
||||||
tween.tween_property(scroll_container, "scroll_horizontal", target_scroll, 4)
|
tween.tween_property(scroll_container, "scroll_horizontal", target_scroll, 4)
|
||||||
|
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
scroll_beginning_garden = target_scroll / garden_size
|
scroll_beginning_garden = target_scroll / GARDEN_SIZE
|
||||||
|
|
||||||
current_garden = garden_parent.get_child(scroll_beginning_garden)
|
current_garden = garden_parent.get_child(scroll_beginning_garden)
|
||||||
|
|
||||||
@@ -571,7 +571,7 @@ func add_gardens() -> void:
|
|||||||
var current_lesson_count: int = 0
|
var current_lesson_count: int = 0
|
||||||
var garden_index: int = 0
|
var garden_index: int = 0
|
||||||
for garden_layout: GardenLayout in gardens_layout.gardens:
|
for garden_layout: GardenLayout in gardens_layout.gardens:
|
||||||
var garden: Garden = garden_scene.instantiate()
|
var garden: Garden = GARDEN_SCENE.instantiate()
|
||||||
garden_parent.add_child(garden)
|
garden_parent.add_child(garden)
|
||||||
garden.garden_index = garden_index
|
garden.garden_index = garden_index
|
||||||
garden_index += 1
|
garden_index += 1
|
||||||
@@ -649,7 +649,7 @@ func _on_lesson_button_pressed() -> void:
|
|||||||
current_garden_index = current_garden.garden_index,
|
current_garden_index = current_garden.garden_index,
|
||||||
look_and_learn_completed = false
|
look_and_learn_completed = false
|
||||||
}
|
}
|
||||||
get_tree().change_scene_to_packed(look_and_learn_scene)
|
get_tree().change_scene_to_packed(LOOK_AND_LEARN_SCENE)
|
||||||
|
|
||||||
|
|
||||||
func _on_minigame_button_pressed(minigame_scene: PackedScene, minigame_number: int) -> void:
|
func _on_minigame_button_pressed(minigame_scene: PackedScene, minigame_number: int) -> void:
|
||||||
@@ -675,21 +675,21 @@ func _on_scroll_container_gui_input(event: InputEvent) -> void:
|
|||||||
if event.is_action_pressed("left_click"):
|
if event.is_action_pressed("left_click"):
|
||||||
is_scrolling = true
|
is_scrolling = true
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
scroll_beginning_garden = scroll_container.scroll_horizontal / garden_size
|
scroll_beginning_garden = scroll_container.scroll_horizontal / GARDEN_SIZE
|
||||||
if scroll_tween:
|
if scroll_tween:
|
||||||
scroll_tween.stop()
|
scroll_tween.stop()
|
||||||
scroll_tween = null
|
scroll_tween = null
|
||||||
elif event.is_action_released("left_click"):
|
elif event.is_action_released("left_click"):
|
||||||
is_scrolling = false
|
is_scrolling = false
|
||||||
var shift_value: int = scroll_container.scroll_horizontal - scroll_beginning_garden * garden_size
|
var shift_value: int = scroll_container.scroll_horizontal - scroll_beginning_garden * GARDEN_SIZE
|
||||||
var target_scroll: int = scroll_beginning_garden * garden_size
|
var target_scroll: int = scroll_beginning_garden * GARDEN_SIZE
|
||||||
var is_garden_changed: bool = false
|
var is_garden_changed: bool = false
|
||||||
if shift_value < - 400:
|
if shift_value < - 400:
|
||||||
target_scroll -= garden_size
|
target_scroll -= GARDEN_SIZE
|
||||||
is_garden_changed = true
|
is_garden_changed = true
|
||||||
left_audio_stream_player.play()
|
left_audio_stream_player.play()
|
||||||
elif shift_value > 400:
|
elif shift_value > 400:
|
||||||
target_scroll += garden_size
|
target_scroll += GARDEN_SIZE
|
||||||
is_garden_changed = true
|
is_garden_changed = true
|
||||||
right_audio_stream_player.play()
|
right_audio_stream_player.play()
|
||||||
scroll_tween = create_tween()
|
scroll_tween = create_tween()
|
||||||
@@ -698,12 +698,12 @@ func _on_scroll_container_gui_input(event: InputEvent) -> void:
|
|||||||
scroll_tween.tween_property(scroll_container, "scroll_horizontal", target_scroll, 1)
|
scroll_tween.tween_property(scroll_container, "scroll_horizontal", target_scroll, 1)
|
||||||
if is_garden_changed:
|
if is_garden_changed:
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
current_garden = garden_parent.get_child(target_scroll / garden_size)
|
current_garden = garden_parent.get_child(target_scroll / GARDEN_SIZE)
|
||||||
current_garden.pop_animation()
|
current_garden.pop_animation()
|
||||||
|
|
||||||
await scroll_tween.finished
|
await scroll_tween.finished
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
scroll_beginning_garden = scroll_container.scroll_horizontal / garden_size
|
scroll_beginning_garden = scroll_container.scroll_horizontal / GARDEN_SIZE
|
||||||
|
|
||||||
if is_scrolling and event is InputEventMouseMotion:
|
if is_scrolling and event is InputEventMouseMotion:
|
||||||
var motion_event: InputEventMouseMotion = event
|
var motion_event: InputEventMouseMotion = event
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
extends "res://sources/gardens/gardens.gd"
|
extends Gardens
|
||||||
|
|
||||||
const max_lesson_number: int = 80
|
const MAX_LESSON_NUMBER: int = 80
|
||||||
const garden_textures_nb: int = 20
|
const GARDEN_TEXTURES_NB: int = 20
|
||||||
const flower_types_nb: int = 5
|
const FLOWER_TYPES_NB: int = 5
|
||||||
const gardens_layout_resource_path: String = "res://resources/gardens/gardens_layout.tres"
|
const GARDENS_LAYOUT_RESOURCE_PATH: String = "res://resources/gardens/gardens_layout.tres"
|
||||||
|
|
||||||
|
|
||||||
var dragging_element: Variant
|
var dragging_element: Variant
|
||||||
@@ -15,16 +15,16 @@ func _ready() -> void:
|
|||||||
line_particles.hide()
|
line_particles.hide()
|
||||||
back_button.hide()
|
back_button.hide()
|
||||||
|
|
||||||
for index: int in max_lesson_number:
|
for index: int in MAX_LESSON_NUMBER:
|
||||||
lessons[index] = index
|
lessons[index] = index
|
||||||
|
|
||||||
# Checks if a configuration exists
|
# Checks if a configuration exists
|
||||||
if not ResourceLoader.exists(gardens_layout_resource_path):
|
if not ResourceLoader.exists(GARDENS_LAYOUT_RESOURCE_PATH):
|
||||||
gardens_layout = GardensLayout.new()
|
gardens_layout = GardensLayout.new()
|
||||||
gardens_layout.resource_path = gardens_layout_resource_path
|
gardens_layout.resource_path = GARDENS_LAYOUT_RESOURCE_PATH
|
||||||
_init_gardens_layout()
|
_init_gardens_layout()
|
||||||
|
|
||||||
gardens_layout = load(gardens_layout_resource_path)
|
gardens_layout = load(GARDENS_LAYOUT_RESOURCE_PATH)
|
||||||
set_up_click_detection()
|
set_up_click_detection()
|
||||||
|
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ func _init_gardens_layout() -> void:
|
|||||||
# Empty the gardens configuration
|
# Empty the gardens configuration
|
||||||
gardens_layout.gardens.clear()
|
gardens_layout.gardens.clear()
|
||||||
|
|
||||||
for index: int in max_lesson_number:
|
for index: int in MAX_LESSON_NUMBER:
|
||||||
|
|
||||||
var garden_layout: GardenLayout
|
var garden_layout: GardenLayout
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ func _init_gardens_layout() -> void:
|
|||||||
gardens_layout.gardens.append(garden_layout)
|
gardens_layout.gardens.append(garden_layout)
|
||||||
|
|
||||||
@warning_ignore("integer_division")
|
@warning_ignore("integer_division")
|
||||||
garden_layout.color = (index / 4) % garden_textures_nb
|
garden_layout.color = (index / 4) % GARDEN_TEXTURES_NB
|
||||||
|
|
||||||
# Add the flowers to the garden
|
# Add the flowers to the garden
|
||||||
for flower_i: int in 5:
|
for flower_i: int in 5:
|
||||||
@@ -181,7 +181,7 @@ func _on_flower_gui_input(event: InputEvent, garden_control_ind: int, flower_ind
|
|||||||
var garden: Garden = garden_parent.get_child(garden_control_ind)
|
var garden: Garden = garden_parent.get_child(garden_control_ind)
|
||||||
var flower: GardenLayout.Flower = gardens_layout.gardens[garden_control_ind].flowers[flower_ind]
|
var flower: GardenLayout.Flower = gardens_layout.gardens[garden_control_ind].flowers[flower_ind]
|
||||||
flower.type += 1
|
flower.type += 1
|
||||||
if flower.type >= flower_types_nb:
|
if flower.type >= FLOWER_TYPES_NB:
|
||||||
flower.type = 0
|
flower.type = 0
|
||||||
garden.set_flowers(gardens_layout.gardens[garden_control_ind].flowers, Garden.FlowerSizes.LARGE)
|
garden.set_flowers(gardens_layout.gardens[garden_control_ind].flowers, Garden.FlowerSizes.LARGE)
|
||||||
ResourceSaver.save(gardens_layout, gardens_layout.resource_path)
|
ResourceSaver.save(gardens_layout, gardens_layout.resource_path)
|
||||||
@@ -205,7 +205,7 @@ func _on_change_flower_color_button_pressed() -> void:
|
|||||||
var flowers: Array[GardenLayout.Flower] = gardens_layout.gardens[garden_ind].flowers
|
var flowers: Array[GardenLayout.Flower] = gardens_layout.gardens[garden_ind].flowers
|
||||||
for flower: GardenLayout.Flower in flowers:
|
for flower: GardenLayout.Flower in flowers:
|
||||||
flower.color += 1
|
flower.color += 1
|
||||||
if flower.color >= garden_textures_nb:
|
if flower.color >= GARDEN_TEXTURES_NB:
|
||||||
flower.color = 0
|
flower.color = 0
|
||||||
gardens_layout.gardens[garden_ind].flowers = flowers
|
gardens_layout.gardens[garden_ind].flowers = flowers
|
||||||
|
|
||||||
@@ -222,7 +222,7 @@ func _on_change_flower_color_button_2_pressed() -> void:
|
|||||||
for flower: GardenLayout.Flower in flowers:
|
for flower: GardenLayout.Flower in flowers:
|
||||||
flower.color -= 1
|
flower.color -= 1
|
||||||
if flower.color < 0:
|
if flower.color < 0:
|
||||||
flower.color = garden_textures_nb - 1
|
flower.color = GARDEN_TEXTURES_NB - 1
|
||||||
gardens_layout.gardens[garden_ind].flowers = flowers
|
gardens_layout.gardens[garden_ind].flowers = flowers
|
||||||
|
|
||||||
garden.set_flowers(flowers, Garden.FlowerSizes.LARGE)
|
garden.set_flowers(flowers, Garden.FlowerSizes.LARGE)
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
extends TextureRect
|
extends TextureRect
|
||||||
|
class_name MinigameLayout
|
||||||
|
|
||||||
signal pressed()
|
signal pressed()
|
||||||
|
|
||||||
@onready var icon: TextureRect = $TextureRect
|
@onready var icon: TextureRect = $TextureRect
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ class_name GPImageAndSoundDescriptions
|
|||||||
|
|
||||||
@onready var description_container: VBoxContainer = %DescriptionsContainer
|
@onready var description_container: VBoxContainer = %DescriptionsContainer
|
||||||
|
|
||||||
const description_line_scene: PackedScene = preload("res://sources/language_tool/image_and_sound_gp_description.tscn")
|
const DESCRIPTION_LINE_SCENE: PackedScene = preload("res://sources/language_tool/image_and_sound_gp_description.tscn")
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
@@ -11,8 +11,8 @@ func _ready() -> void:
|
|||||||
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.look_and_learn_sounds)
|
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.look_and_learn_sounds)
|
||||||
|
|
||||||
Database.db.query("SELECT * FROM GPs WHERE GPs.Exception=0")
|
Database.db.query("SELECT * FROM GPs WHERE GPs.Exception=0")
|
||||||
for res in Database.db.query_result:
|
for res: Dictionary in Database.db.query_result:
|
||||||
var description_line: ImageAndSoundGPDescription = description_line_scene.instantiate()
|
var description_line: ImageAndSoundGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
description_container.add_child(description_line)
|
description_container.add_child(description_line)
|
||||||
description_line.set_gp(res)
|
description_line.set_gp(res)
|
||||||
|
|
||||||
|
|||||||
@@ -2,17 +2,17 @@ extends Control
|
|||||||
|
|
||||||
@onready var description_container: VBoxContainer = %DescriptionsContainer
|
@onready var description_container: VBoxContainer = %DescriptionsContainer
|
||||||
|
|
||||||
const description_line_scene: PackedScene = preload("res://sources/language_tool/video_gp_description.tscn")
|
const DESCRIPTION_LINE_SCENE: PackedScene = preload("res://sources/language_tool/video_gp_description.tscn")
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
var _description_line: VideoGPDescription = description_line_scene.instantiate()
|
var _description_line: VideoGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.look_and_learn_videos)
|
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.look_and_learn_videos)
|
||||||
_description_line.queue_free()
|
_description_line.queue_free()
|
||||||
|
|
||||||
Database.db.query("Select * FROM GPs WHERE GPs.Exception=0")
|
Database.db.query("Select * FROM GPs WHERE GPs.Exception=0")
|
||||||
for gp in Database.db.query_result:
|
for gp in Database.db.query_result:
|
||||||
var description_line: VideoGPDescription = description_line_scene.instantiate()
|
var description_line: VideoGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
description_container.add_child(description_line)
|
description_container.add_child(description_line)
|
||||||
description_line.set_gp(gp)
|
description_line.set_gp(gp)
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ func set_gp(value: Dictionary) -> void:
|
|||||||
func _on_image_upload_button_pressed() -> void:
|
func _on_image_upload_button_pressed() -> void:
|
||||||
if not gp.is_empty():
|
if not gp.is_empty():
|
||||||
file_dialog.filters = []
|
file_dialog.filters = []
|
||||||
file_dialog.add_filter("*" + Database.image_extension, "Images")
|
file_dialog.add_filter("*" + Database.IMAGE_EXTENSION, "Images")
|
||||||
|
|
||||||
for connection in file_dialog.file_selected.get_connections():
|
for connection in file_dialog.file_selected.get_connections():
|
||||||
connection["signal"].disconnect(connection["callable"])
|
connection["signal"].disconnect(connection["callable"])
|
||||||
@@ -104,7 +104,7 @@ func _on_image_upload_button_pressed() -> void:
|
|||||||
func _on_sound_upload_button_pressed() -> void:
|
func _on_sound_upload_button_pressed() -> void:
|
||||||
if not gp.is_empty():
|
if not gp.is_empty():
|
||||||
file_dialog.filters = []
|
file_dialog.filters = []
|
||||||
file_dialog.add_filter("*" + Database.sound_extension, "Sounds")
|
file_dialog.add_filter("*" + Database.SOUND_EXTENSION, "Sounds")
|
||||||
|
|
||||||
for connection in file_dialog.file_selected.get_connections():
|
for connection in file_dialog.file_selected.get_connections():
|
||||||
connection["signal"].disconnect(connection["callable"])
|
connection["signal"].disconnect(connection["callable"])
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ func _ready() -> void:
|
|||||||
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.language_sounds)
|
DirAccess.make_dir_recursive_absolute(Database.base_path + Database.language + Database.language_sounds)
|
||||||
|
|
||||||
Database.db.query("SELECT * FROM GPs WHERE GPs.Exception=0")
|
Database.db.query("SELECT * FROM GPs WHERE GPs.Exception=0")
|
||||||
for res in Database.db.query_result:
|
for res: Dictionary in Database.db.query_result:
|
||||||
var description_line: ImageAndSoundGPDescription = description_line_scene.instantiate()
|
var description_line: ImageAndSoundGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
description_line.get_sound_path = Database.get_gp_sound_path
|
description_line.get_sound_path = Database.get_gp_sound_path
|
||||||
description_line.get_image_path = get_empty_string
|
description_line.get_image_path = get_empty_string
|
||||||
description_line.hide_image_part()
|
description_line.hide_image_part()
|
||||||
@@ -17,8 +17,8 @@ func _ready() -> void:
|
|||||||
description_line.image_upload_button.hide()
|
description_line.image_upload_button.hide()
|
||||||
|
|
||||||
Database.db.query("SELECT * FROM Syllables WHERE Syllables.Exception=0")
|
Database.db.query("SELECT * FROM Syllables WHERE Syllables.Exception=0")
|
||||||
for res in Database.db.query_result:
|
for res: Dictionary in Database.db.query_result:
|
||||||
var description_line: = description_line_scene.instantiate()
|
var description_line: ImageAndSoundGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
description_line.get_sound_path = Database.get_syllable_sound_path
|
description_line.get_sound_path = Database.get_syllable_sound_path
|
||||||
description_line.get_image_path = get_empty_string
|
description_line.get_image_path = get_empty_string
|
||||||
description_line.hide_image_part()
|
description_line.hide_image_part()
|
||||||
@@ -29,8 +29,8 @@ func _ready() -> void:
|
|||||||
description_line.image_upload_button.hide()
|
description_line.image_upload_button.hide()
|
||||||
|
|
||||||
Database.db.query("SELECT * FROM Words WHERE Words.Exception=0")
|
Database.db.query("SELECT * FROM Words WHERE Words.Exception=0")
|
||||||
for res in Database.db.query_result:
|
for res: Dictionary in Database.db.query_result:
|
||||||
var description_line: = description_line_scene.instantiate()
|
var description_line: ImageAndSoundGPDescription = DESCRIPTION_LINE_SCENE.instantiate()
|
||||||
description_line.get_sound_path = Database.get_word_sound_path
|
description_line.get_sound_path = Database.get_word_sound_path
|
||||||
description_line.get_image_path = get_empty_string
|
description_line.get_image_path = get_empty_string
|
||||||
description_line.hide_image_part()
|
description_line.hide_image_part()
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ extends PanelContainer
|
|||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
file_dialog.access = FileDialog.ACCESS_FILESYSTEM
|
file_dialog.access = FileDialog.ACCESS_FILESYSTEM
|
||||||
file_dialog.filters = []
|
file_dialog.filters = []
|
||||||
file_dialog.add_filter("*" + Database.sound_extension, "Sounds")
|
file_dialog.add_filter("*" + Database.SOUND_EXTENSION, "Sounds")
|
||||||
|
|
||||||
_set_speech_name(speech_name)
|
_set_speech_name(speech_name)
|
||||||
_set_speech_description(speech_description)
|
_set_speech_description(speech_description)
|
||||||
|
|||||||
@@ -1,15 +1,6 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const LessonExerciceContainer: = preload("res://sources/language_tool/lesson_exercises_container.gd")
|
const LESSON_EXERCICE_CONTAINER_SCENE: = preload("res://sources/language_tool/lesson_exercises_container.tscn")
|
||||||
const lesson_exercice_container_scene: = preload("res://sources/language_tool/lesson_exercises_container.tscn")
|
|
||||||
|
|
||||||
const exercise_types: Array[String] = [
|
|
||||||
"Syllable",
|
|
||||||
"Pairing",
|
|
||||||
"Words",
|
|
||||||
"Sentences",
|
|
||||||
"Boss"
|
|
||||||
]
|
|
||||||
|
|
||||||
@onready var lessons_container: VBoxContainer = %LessonsContainer
|
@onready var lessons_container: VBoxContainer = %LessonsContainer
|
||||||
|
|
||||||
@@ -51,7 +42,7 @@ func _ready() -> void:
|
|||||||
var sentences_by_lesson: = Database.get_sentences_by_lessons()
|
var sentences_by_lesson: = Database.get_sentences_by_lessons()
|
||||||
Database.db.query("Select * FROM Lessons")
|
Database.db.query("Select * FROM Lessons")
|
||||||
for e in Database.db.query_result:
|
for e in Database.db.query_result:
|
||||||
var container: LessonExerciceContainer = lesson_exercice_container_scene.instantiate()
|
var container: LessonExerciceContainer = LESSON_EXERCICE_CONTAINER_SCENE.instantiate()
|
||||||
lessons_container.add_child(container)
|
lessons_container.add_child(container)
|
||||||
container.sentences_by_lesson = sentences_by_lesson
|
container.sentences_by_lesson = sentences_by_lesson
|
||||||
container.lesson_number = e.LessonNb
|
container.lesson_number = e.LessonNb
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends PanelContainer
|
extends PanelContainer
|
||||||
|
class_name LessonExerciceContainer
|
||||||
|
|
||||||
@export var lesson_number: = -1:
|
@export var lesson_number: = -1:
|
||||||
set = _set_lesson_number
|
set = _set_lesson_number
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const base_path: String = "user://language_resources/"
|
const BASE_PATH: String = "user://language_resources/"
|
||||||
const save_file_path: String = "user://prof_tool_save.tres"
|
const SAVE_FILE_PATH: String = "user://prof_tool_save.tres"
|
||||||
var save_file: ProfToolSave
|
var save_file: ProfToolSave
|
||||||
|
|
||||||
@onready var language_select_button: OptionButton = %LanguageSelectButton
|
@onready var language_select_button: OptionButton = %LanguageSelectButton
|
||||||
@@ -18,11 +18,11 @@ func _ready() -> void:
|
|||||||
MusicManager.stop()
|
MusicManager.stop()
|
||||||
Database.load_additional_word_list()
|
Database.load_additional_word_list()
|
||||||
_update_add_word_list_button()
|
_update_add_word_list_button()
|
||||||
if not ResourceLoader.exists(save_file_path):
|
if not ResourceLoader.exists(SAVE_FILE_PATH):
|
||||||
save_file = ProfToolSave.new()
|
save_file = ProfToolSave.new()
|
||||||
save_file.resource_path = save_file_path
|
save_file.resource_path = SAVE_FILE_PATH
|
||||||
ResourceSaver.save(save_file, save_file_path)
|
ResourceSaver.save(save_file, SAVE_FILE_PATH)
|
||||||
save_file = load(save_file_path)
|
save_file = load(SAVE_FILE_PATH)
|
||||||
_display_available_languages()
|
_display_available_languages()
|
||||||
tab_container.current_tab = Globals.main_menu_selected_tab
|
tab_container.current_tab = Globals.main_menu_selected_tab
|
||||||
tab_container.tab_changed.connect(_on_tab_container_tab_changed)
|
tab_container.tab_changed.connect(_on_tab_container_tab_changed)
|
||||||
@@ -97,11 +97,11 @@ func _on_exercises_button_pressed() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _on_export_filename_selected(filename: String) -> void:
|
func _on_export_filename_selected(filename: String) -> void:
|
||||||
var version_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("version.txt"), FileAccess.WRITE)
|
var version_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("version.txt"), FileAccess.WRITE)
|
||||||
version_file.store_line(Time.get_datetime_string_from_system(true, false))
|
version_file.store_line(Time.get_datetime_string_from_system(true, false))
|
||||||
version_file.close()
|
version_file.close()
|
||||||
|
|
||||||
var summary_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("summary.txt"), FileAccess.WRITE)
|
var summary_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("summary.txt"), FileAccess.WRITE)
|
||||||
var sentences_by_lesson: Dictionary = Database.get_sentences_by_lessons()
|
var sentences_by_lesson: Dictionary = Database.get_sentences_by_lessons()
|
||||||
for index: int in Database.get_lessons_count():
|
for index: int in Database.get_lessons_count():
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ func _on_export_filename_selected(filename: String) -> void:
|
|||||||
_create_sentence_csv()
|
_create_sentence_csv()
|
||||||
|
|
||||||
var folder_zipper: FolderZipper = FolderZipper.new()
|
var folder_zipper: FolderZipper = FolderZipper.new()
|
||||||
folder_zipper.compress(base_path.path_join(Database.language), filename)
|
folder_zipper.compress(BASE_PATH.path_join(Database.language), filename)
|
||||||
|
|
||||||
#region Database integrity check
|
#region Database integrity check
|
||||||
var integrity_checking: bool = false
|
var integrity_checking: bool = false
|
||||||
@@ -327,13 +327,13 @@ func file_exists_case_sensitive(path: String) -> Dictionary:
|
|||||||
|
|
||||||
func _get_available_languages() -> Array[String]:
|
func _get_available_languages() -> Array[String]:
|
||||||
var available_languages: Array[String] = []
|
var available_languages: Array[String] = []
|
||||||
var dir: DirAccess = DirAccess.open(base_path)
|
var dir: DirAccess = DirAccess.open(BASE_PATH)
|
||||||
if dir:
|
if dir:
|
||||||
dir.list_dir_begin()
|
dir.list_dir_begin()
|
||||||
var file_name: String = dir.get_next()
|
var file_name: String = dir.get_next()
|
||||||
while file_name != "":
|
while file_name != "":
|
||||||
if dir.current_is_dir():
|
if dir.current_is_dir():
|
||||||
if FileAccess.file_exists(base_path.path_join(file_name).path_join("language.db")):
|
if FileAccess.file_exists(BASE_PATH.path_join(file_name).path_join("language.db")):
|
||||||
available_languages.append(file_name)
|
available_languages.append(file_name)
|
||||||
file_name = dir.get_next()
|
file_name = dir.get_next()
|
||||||
return available_languages
|
return available_languages
|
||||||
@@ -346,7 +346,7 @@ func _on_language_select_button_item_selected(index: int) -> void:
|
|||||||
return
|
return
|
||||||
|
|
||||||
save_file.selected_language = language_select_button.get_item_text(index)
|
save_file.selected_language = language_select_button.get_item_text(index)
|
||||||
ResourceSaver.save(save_file, save_file_path)
|
ResourceSaver.save(save_file, SAVE_FILE_PATH)
|
||||||
Database.language = save_file.selected_language
|
Database.language = save_file.selected_language
|
||||||
|
|
||||||
|
|
||||||
@@ -354,14 +354,14 @@ func _on_validate_language_pressed() -> void:
|
|||||||
if not line_edit.text:
|
if not line_edit.text:
|
||||||
return
|
return
|
||||||
|
|
||||||
DirAccess.make_dir_recursive_absolute(base_path.path_join(line_edit.text))
|
DirAccess.make_dir_recursive_absolute(BASE_PATH.path_join(line_edit.text))
|
||||||
var file: FileAccess = FileAccess.open("res://model_database.db", FileAccess.READ)
|
var file: FileAccess = FileAccess.open("res://model_database.db", FileAccess.READ)
|
||||||
var dest: FileAccess = FileAccess.open(base_path.path_join(line_edit.text).path_join("language.db"), FileAccess.WRITE)
|
var dest: FileAccess = FileAccess.open(BASE_PATH.path_join(line_edit.text).path_join("language.db"), FileAccess.WRITE)
|
||||||
dest.store_buffer(file.get_buffer(file.get_length()))
|
dest.store_buffer(file.get_buffer(file.get_length()))
|
||||||
file.close()
|
file.close()
|
||||||
dest.close()
|
dest.close()
|
||||||
save_file.selected_language = line_edit.text
|
save_file.selected_language = line_edit.text
|
||||||
ResourceSaver.save(save_file, save_file_path)
|
ResourceSaver.save(save_file, SAVE_FILE_PATH)
|
||||||
get_tree().reload_current_scene()
|
get_tree().reload_current_scene()
|
||||||
|
|
||||||
|
|
||||||
@@ -437,12 +437,12 @@ func _on_export_button_pressed() -> void:
|
|||||||
func _language_data_selected(file_path: String) -> void:
|
func _language_data_selected(file_path: String) -> void:
|
||||||
if FileAccess.file_exists(file_path):
|
if FileAccess.file_exists(file_path):
|
||||||
var folder_unzipper: FolderUnzipper = FolderUnzipper.new()
|
var folder_unzipper: FolderUnzipper = FolderUnzipper.new()
|
||||||
folder_unzipper.extract(file_path, base_path, false)
|
folder_unzipper.extract(file_path, BASE_PATH, false)
|
||||||
get_tree().reload_current_scene()
|
get_tree().reload_current_scene()
|
||||||
|
|
||||||
|
|
||||||
func _create_GP_csv() -> void:
|
func _create_GP_csv() -> void:
|
||||||
var gp_list_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("gp_list.csv"), FileAccess.WRITE)
|
var gp_list_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("gp_list.csv"), FileAccess.WRITE)
|
||||||
gp_list_file.store_csv_line(["Grapheme", "Phoneme", "Type", "Exception"])
|
gp_list_file.store_csv_line(["Grapheme", "Phoneme", "Type", "Exception"])
|
||||||
var query: String = "Select * FROM GPs ORDER BY GPs.Grapheme"
|
var query: String = "Select * FROM GPs ORDER BY GPs.Grapheme"
|
||||||
Database.db.query(query)
|
Database.db.query(query)
|
||||||
@@ -453,7 +453,7 @@ func _create_GP_csv() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _create_words_csv() -> void:
|
func _create_words_csv() -> void:
|
||||||
var gp_list_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("words_list.csv"), FileAccess.WRITE)
|
var gp_list_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("words_list.csv"), FileAccess.WRITE)
|
||||||
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON", "READING", "WRITING"])
|
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON", "READING", "WRITING"])
|
||||||
var query: String = "SELECT Words.ID as WordId, Word, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Words.Exception, Reading, Writing
|
var query: String = "SELECT Words.ID as WordId, Word, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Words.Exception, Reading, Writing
|
||||||
FROM Words
|
FROM Words
|
||||||
@@ -482,7 +482,7 @@ func _create_words_csv() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _create_syllable_csv() -> void:
|
func _create_syllable_csv() -> void:
|
||||||
var gp_list_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("syllables_list.csv"), FileAccess.WRITE)
|
var gp_list_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("syllables_list.csv"), FileAccess.WRITE)
|
||||||
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON", "READING", "WRITING"])
|
gp_list_file.store_csv_line(["ORTHO", "GPMATCH", "LESSON", "READING", "WRITING"])
|
||||||
var query: String = "SELECT Syllables.ID as SyllableId, Syllable, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Syllables.Exception, Reading, Writing
|
var query: String = "SELECT Syllables.ID as SyllableId, Syllable, group_concat(Grapheme, ' ') as Graphemes, group_concat(Phoneme, ' ') as Phonemes, group_concat(GPs.ID, ' ') as GPIDs, Syllables.Exception, Reading, Writing
|
||||||
FROM Syllables
|
FROM Syllables
|
||||||
@@ -511,7 +511,7 @@ func _create_syllable_csv() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _create_sentence_csv() -> void:
|
func _create_sentence_csv() -> void:
|
||||||
var gp_list_file: FileAccess = FileAccess.open(base_path.path_join(Database.language).path_join("sentences_list.csv"), FileAccess.WRITE)
|
var gp_list_file: FileAccess = FileAccess.open(BASE_PATH.path_join(Database.language).path_join("sentences_list.csv"), FileAccess.WRITE)
|
||||||
gp_list_file.store_csv_line(["Sentence", "Lesson"])
|
gp_list_file.store_csv_line(["Sentence", "Lesson"])
|
||||||
var query: String = "SELECT Sentences.ID as SentenceId, Sentence, group_concat(Word, ' ') as Words, group_concat(Word, ' ') as Words, group_concat(Words.ID, ' ') as WordIDs, Sentences.Exception
|
var query: String = "SELECT Sentences.ID as SentenceId, Sentence, group_concat(Word, ' ') as Words, group_concat(Word, ' ') as Words, group_concat(Words.ID, ' ') as WordIDs, Sentences.Exception
|
||||||
FROM Sentences
|
FROM Sentences
|
||||||
@@ -533,7 +533,7 @@ func _create_sentence_csv() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _on_open_folder_button_pressed() -> void:
|
func _on_open_folder_button_pressed() -> void:
|
||||||
OS.shell_show_in_file_manager(ProjectSettings.globalize_path(base_path))
|
OS.shell_show_in_file_manager(ProjectSettings.globalize_path(BASE_PATH))
|
||||||
|
|
||||||
|
|
||||||
func _on_tab_container_tab_changed(tab: int) -> void:
|
func _on_tab_container_tab_changed(tab: int) -> void:
|
||||||
@@ -542,7 +542,7 @@ func _on_tab_container_tab_changed(tab: int) -> void:
|
|||||||
|
|
||||||
#region Book Generation
|
#region Book Generation
|
||||||
func create_book() -> void:
|
func create_book() -> void:
|
||||||
var lang_path: String = base_path.path_join(Database.language)
|
var lang_path: String = BASE_PATH.path_join(Database.language)
|
||||||
var file_names: Dictionary[String, String] = {
|
var file_names: Dictionary[String, String] = {
|
||||||
"word": "words_list.csv",
|
"word": "words_list.csv",
|
||||||
"syllable": "syllables_list.csv",
|
"syllable": "syllables_list.csv",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ extends "res://sources/language_tool/word_list_element.gd"
|
|||||||
|
|
||||||
signal not_found(text: String)
|
signal not_found(text: String)
|
||||||
|
|
||||||
const word_list_element_scene: = preload("res://sources/language_tool/word_list_element.tscn")
|
const WORD_LIST_ELEMENT_SCENE: = preload("res://sources/language_tool/word_list_element.tscn")
|
||||||
|
|
||||||
var words_not_founds: PackedStringArray
|
var words_not_founds: PackedStringArray
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ func _add_from_additional_word_list(new_text: String) -> int:
|
|||||||
var new_text_clean: = new_text.to_lower()
|
var new_text_clean: = new_text.to_lower()
|
||||||
for chara in punc:
|
for chara in punc:
|
||||||
new_text_clean = new_text_clean.replace(chara, " ")
|
new_text_clean = new_text_clean.replace(chara, " ")
|
||||||
var word_list_element: WordListElement = word_list_element_scene.instantiate()
|
var word_list_element: WordListElement = WORD_LIST_ELEMENT_SCENE.instantiate()
|
||||||
var all_found: = true
|
var all_found: = true
|
||||||
words_not_founds.clear()
|
words_not_founds.clear()
|
||||||
var word_ids: Array[int] = []
|
var word_ids: Array[int] = []
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ extends Control
|
|||||||
@onready var save_ok: TextureRect = %SaveOk
|
@onready var save_ok: TextureRect = %SaveOk
|
||||||
@onready var copy_from: MenuButton = %CopyFrom
|
@onready var copy_from: MenuButton = %CopyFrom
|
||||||
|
|
||||||
const extension: String = ".csv"
|
const EXTENSION: String = ".csv"
|
||||||
|
|
||||||
var letters: Array[String] = []
|
var letters: Array[String] = []
|
||||||
var current_letter: int = -1
|
var current_letter: int = -1
|
||||||
@@ -92,7 +92,7 @@ func upper_path(letter: String) -> String:
|
|||||||
|
|
||||||
|
|
||||||
func real_path(path: String) -> String:
|
func real_path(path: String) -> String:
|
||||||
return Database.base_path.path_join(Database.language).path_join(Database.tracing_data_folder).path_join(path) + extension
|
return Database.base_path.path_join(Database.language).path_join(Database.tracing_data_folder).path_join(path) + EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func _on_save_button_pressed() -> void:
|
func _on_save_button_pressed() -> void:
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ func set_gp(p_gp: Dictionary) -> void:
|
|||||||
func _on_video_upload_button_pressed() -> void:
|
func _on_video_upload_button_pressed() -> void:
|
||||||
if not gp.is_empty():
|
if not gp.is_empty():
|
||||||
file_dialog.filters = []
|
file_dialog.filters = []
|
||||||
file_dialog.add_filter("*" + Database.video_extension, "Videos")
|
file_dialog.add_filter("*" + Database.VIDEO_EXTENSION, "Videos")
|
||||||
|
|
||||||
for connection in file_dialog.file_selected.get_connections():
|
for connection in file_dialog.file_selected.get_connections():
|
||||||
connection["signal"].disconnect(connection["callable"])
|
connection["signal"].disconnect(connection["callable"])
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ signal new_GP_asked(i: int)
|
|||||||
signal validated()
|
signal validated()
|
||||||
signal GPs_updated()
|
signal GPs_updated()
|
||||||
|
|
||||||
const gp_list_button_scene: PackedScene = preload("res://sources/language_tool/gp_list_button.tscn")
|
const GP_LIST_BUTTON_SCENE: PackedScene = preload("res://sources/language_tool/gp_list_button.tscn")
|
||||||
const plus_button_scene: PackedScene = preload("res://sources/language_tool/plus_button.tscn")
|
const PLUS_BUTTON_SCENE: PackedScene = preload("res://sources/language_tool/plus_button.tscn")
|
||||||
|
|
||||||
@export var table: String = "Words"
|
@export var table: String = "Words"
|
||||||
@export var table_graph_column: String = "Word"
|
@export var table_graph_column: String = "Word"
|
||||||
@@ -101,14 +101,14 @@ func set_graphemes_edit(p_gp_ids: Array[int]) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func add_gp_list_button(gp_id: int, ind_gp_id: int) -> void:
|
func add_gp_list_button(gp_id: int, ind_gp_id: int) -> void:
|
||||||
var gp_list_button: GPListButton = gp_list_button_scene.instantiate()
|
var gp_list_button: GPListButton = GP_LIST_BUTTON_SCENE.instantiate()
|
||||||
gp_list_button.set_gp_list(sub_elements_list)
|
gp_list_button.set_gp_list(sub_elements_list)
|
||||||
graphemes_edit_container.add_child(gp_list_button)
|
graphemes_edit_container.add_child(gp_list_button)
|
||||||
graphemes_edit_container.move_child(gp_list_button, 2 * ind_gp_id)
|
graphemes_edit_container.move_child(gp_list_button, 2 * ind_gp_id)
|
||||||
gp_list_button.select_id(gp_id)
|
gp_list_button.select_id(gp_id)
|
||||||
gp_list_button.gp_selected.connect(_on_gp_list_button_selected.bind(gp_list_button))
|
gp_list_button.gp_selected.connect(_on_gp_list_button_selected.bind(gp_list_button))
|
||||||
gp_list_button.new_selected.connect(_on_gp_list_button_new_selected.bind(gp_list_button))
|
gp_list_button.new_selected.connect(_on_gp_list_button_new_selected.bind(gp_list_button))
|
||||||
var plus_button: PlusButton = plus_button_scene.instantiate()
|
var plus_button: PlusButton = PLUS_BUTTON_SCENE.instantiate()
|
||||||
plus_button.size = Vector2(50, 50)
|
plus_button.size = Vector2(50, 50)
|
||||||
graphemes_edit_container.add_child(plus_button)
|
graphemes_edit_container.add_child(plus_button)
|
||||||
graphemes_edit_container.move_child(plus_button, 2 * ind_gp_id + 1)
|
graphemes_edit_container.move_child(plus_button, 2 * ind_gp_id + 1)
|
||||||
|
|||||||
@@ -3,9 +3,6 @@ class_name LetterSegment
|
|||||||
|
|
||||||
signal finished()
|
signal finished()
|
||||||
|
|
||||||
const TracingPath: = preload("res://sources/look_and_learn/tracing_path.gd")
|
|
||||||
const TracingEffects: = preload("res://sources/look_and_learn/tracing_effects.gd")
|
|
||||||
|
|
||||||
@onready var tracing_path: TracingPath = $TracingPath
|
@onready var tracing_path: TracingPath = $TracingPath
|
||||||
@onready var tracing_effects: TracingEffects = $TracingEffects
|
@onready var tracing_effects: TracingEffects = $TracingEffects
|
||||||
@onready var complete_particles: GPUParticles2D = $CompleteParticles
|
@onready var complete_particles: GPUParticles2D = $CompleteParticles
|
||||||
@@ -43,7 +40,7 @@ func _process(_delta: float) -> void:
|
|||||||
tracing_effects.stop()
|
tracing_effects.stop()
|
||||||
|
|
||||||
|
|
||||||
func _on_CompleteAudioStreamPlayer_finished() -> void:
|
func _on_complete_audio_stream_player_finished() -> void:
|
||||||
tracing_effects.stop()
|
tracing_effects.stop()
|
||||||
complete_particles.emitting = false
|
complete_particles.emitting = false
|
||||||
finished.emit()
|
finished.emit()
|
||||||
|
|||||||
@@ -52,4 +52,4 @@ stream = ExtResource("5")
|
|||||||
|
|
||||||
[connection signal="demo_finished" from="TracingPath" to="." method="_on_tracing_path_demo_finished"]
|
[connection signal="demo_finished" from="TracingPath" to="." method="_on_tracing_path_demo_finished"]
|
||||||
[connection signal="finished" from="TracingPath" to="." method="_on_tracing_path_finished"]
|
[connection signal="finished" from="TracingPath" to="." method="_on_tracing_path_finished"]
|
||||||
[connection signal="finished" from="CompleteAudioStreamPlayer" to="." method="_on_CompleteAudioStreamPlayer_finished"]
|
[connection signal="finished" from="CompleteAudioStreamPlayer" to="." method="_on_complete_audio_stream_player_finished"]
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
class_name LookAndLearn
|
||||||
const Gardens: = preload("res://sources/gardens/gardens.gd")
|
|
||||||
const TracingManager: = preload("res://sources/look_and_learn/tracing_manager.gd")
|
|
||||||
|
|
||||||
@export var lesson_nb: int = 1
|
@export var lesson_nb: int = 1
|
||||||
@export var current_button_pressed: int = 0
|
@export var current_button_pressed: int = 0
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name TracingEffects
|
||||||
|
|
||||||
@onready var particles_effect: GPUParticles2D = $TracingParticles
|
@onready var particles_effect: GPUParticles2D = $TracingParticles
|
||||||
@onready var sound_effect: AudioStreamPlayer = $TracingAudioStreamPlayer
|
@onready var sound_effect: AudioStreamPlayer = $TracingAudioStreamPlayer
|
||||||
@@ -30,6 +31,6 @@ func stop() -> void:
|
|||||||
timer.start()
|
timer.start()
|
||||||
|
|
||||||
|
|
||||||
func _on_Timer_timeout() -> void:
|
func _on_timer_timeout() -> void:
|
||||||
particles_effect.emitting = false
|
particles_effect.emitting = false
|
||||||
sound_effect.playing = false
|
sound_effect.playing = false
|
||||||
|
|||||||
@@ -36,10 +36,10 @@ script = ExtResource("1_fwn5n")
|
|||||||
[node name="TracingParticles" type="GPUParticles2D" parent="."]
|
[node name="TracingParticles" type="GPUParticles2D" parent="."]
|
||||||
emitting = false
|
emitting = false
|
||||||
amount = 12
|
amount = 12
|
||||||
process_material = SubResource("ParticleProcessMaterial_me6ey")
|
|
||||||
texture = ExtResource("2_3m3v8")
|
texture = ExtResource("2_3m3v8")
|
||||||
lifetime = 0.5
|
lifetime = 0.5
|
||||||
visibility_rect = Rect2(-500, -500, 1000, 1000)
|
visibility_rect = Rect2(-500, -500, 1000, 1000)
|
||||||
|
process_material = SubResource("ParticleProcessMaterial_me6ey")
|
||||||
|
|
||||||
[node name="TracingAudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
[node name="TracingAudioStreamPlayer" type="AudioStreamPlayer" parent="."]
|
||||||
stream = ExtResource("3_m2u4r")
|
stream = ExtResource("3_m2u4r")
|
||||||
@@ -49,4 +49,4 @@ volume_db = -5.0
|
|||||||
wait_time = 0.2
|
wait_time = 0.2
|
||||||
one_shot = true
|
one_shot = true
|
||||||
|
|
||||||
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
|
[connection signal="timeout" from="Timer" to="." method="_on_timer_timeout"]
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
extends Control
|
extends Control
|
||||||
|
class_name TracingManager
|
||||||
|
|
||||||
signal finished()
|
signal finished()
|
||||||
|
|
||||||
const letter_segment_class: PackedScene = preload("res://sources/look_and_learn/letter_segment.tscn")
|
const LETTER_SEGMENT_CLASS: PackedScene = preload("res://sources/look_and_learn/letter_segment.tscn")
|
||||||
|
|
||||||
@export var label_settings: LabelSettings
|
@export var label_settings: LabelSettings
|
||||||
|
|
||||||
@onready var lower_labels: HBoxContainer = %LowerLabels
|
@onready var lower_labels: HBoxContainer = %LowerLabels
|
||||||
@onready var upper_labels: HBoxContainer = %UpperLabels
|
@onready var upper_labels: HBoxContainer = %UpperLabels
|
||||||
|
|
||||||
const tracing_data_folder: String = "tracing_data/"
|
const EXTENSION: String = ".csv"
|
||||||
const extension: String = ".csv"
|
|
||||||
|
|
||||||
func _process(_delta: float) -> void:
|
func _process(_delta: float) -> void:
|
||||||
place_segments(upper_labels.get_children())
|
place_segments(upper_labels.get_children())
|
||||||
@@ -65,7 +65,7 @@ func setup_tracing(letter: String, letter_tracings: Array, parent: Control, lowe
|
|||||||
parent.add_child(label)
|
parent.add_child(label)
|
||||||
|
|
||||||
for points: Array in letter_tracings:
|
for points: Array in letter_tracings:
|
||||||
var segment: LetterSegment = letter_segment_class.instantiate()
|
var segment: LetterSegment = LETTER_SEGMENT_CLASS.instantiate()
|
||||||
label.add_child(segment)
|
label.add_child(segment)
|
||||||
segment.setup(points)
|
segment.setup(points)
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ func _upper_path(letter: String) -> String:
|
|||||||
|
|
||||||
|
|
||||||
func _real_path(path: String) -> String:
|
func _real_path(path: String) -> String:
|
||||||
return Database.base_path.path_join(Database.language).path_join(Database.tracing_data_folder).path_join(path) + extension
|
return Database.base_path.path_join(Database.language).path_join(Database.tracing_data_folder).path_join(path) + EXTENSION
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Path2D
|
extends Path2D
|
||||||
|
class_name TracingPath
|
||||||
|
|
||||||
signal finished
|
signal finished
|
||||||
signal demo_finished
|
signal demo_finished
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Control
|
extends Control
|
||||||
|
|
||||||
const Gardens: = preload("res://sources/gardens/gardens.gd")
|
const GARDENS_SCENE: PackedScene = preload("res://sources/gardens/gardens.tscn")
|
||||||
const gardens_scene: PackedScene = preload("res://sources/gardens/gardens.tscn")
|
|
||||||
const Kalulu: = preload("res://sources/minigames/base/kalulu.gd")
|
const Kalulu: = preload("res://sources/minigames/base/kalulu.gd")
|
||||||
|
|
||||||
@export var locked_color: Color
|
@export var locked_color: Color
|
||||||
@@ -126,7 +125,7 @@ func _on_garden_button_pressed(button_number: int) -> void:
|
|||||||
audio_stream_player.play()
|
audio_stream_player.play()
|
||||||
await OpeningCurtain.close()
|
await OpeningCurtain.close()
|
||||||
|
|
||||||
var gardens: Gardens = gardens_scene.instantiate()
|
var gardens: Gardens = GARDENS_SCENE.instantiate()
|
||||||
gardens.starting_garden = button_number
|
gardens.starting_garden = button_number
|
||||||
get_tree().root.add_child(gardens)
|
get_tree().root.add_child(gardens)
|
||||||
get_tree().current_scene = gardens
|
get_tree().current_scene = gardens
|
||||||
|
|||||||
@@ -2,9 +2,6 @@
|
|||||||
extends Control
|
extends Control
|
||||||
class_name Minigame
|
class_name Minigame
|
||||||
|
|
||||||
const Gardens: = preload("res://sources/gardens/gardens.gd")
|
|
||||||
const Fireworks: = preload("res://sources/utils/fx/fireworks.gd")
|
|
||||||
|
|
||||||
enum Type {
|
enum Type {
|
||||||
jellyfish,
|
jellyfish,
|
||||||
crabs,
|
crabs,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Area2D
|
extends Area2D
|
||||||
|
class_name Berry
|
||||||
|
|
||||||
signal pressed(gp: Dictionary)
|
signal pressed(gp: Dictionary)
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name Branch
|
||||||
|
|
||||||
signal branch_pressed()
|
signal branch_pressed()
|
||||||
signal berry_pressed(gp: Dictionary)
|
signal berry_pressed(gp: Dictionary)
|
||||||
|
|
||||||
# Namespace
|
const LEAF_SCENE: PackedScene = preload("res://sources/minigames/caterpillar/leaf.tscn")
|
||||||
const Leaf: = preload("res://sources/minigames/caterpillar/leaf.gd")
|
const BERRY_SCENE: PackedScene = preload("res://sources/minigames/caterpillar/berry.tscn")
|
||||||
const Berry: = preload("res://sources/minigames/caterpillar/berry.gd")
|
|
||||||
|
|
||||||
const leaf_scene: PackedScene = preload("res://sources/minigames/caterpillar/leaf.tscn")
|
|
||||||
const berry_scene: PackedScene = preload("res://sources/minigames/caterpillar/berry.tscn")
|
|
||||||
|
|
||||||
@onready var leaves: Node2D = $Leaves
|
@onready var leaves: Node2D = $Leaves
|
||||||
@onready var berries: Node2D = $Berries
|
@onready var berries: Node2D = $Berries
|
||||||
@@ -32,7 +29,7 @@ func _ready() -> void:
|
|||||||
# Adds some leaves from start
|
# Adds some leaves from start
|
||||||
var pos: float = -leaves.position.x + velocity * randf_range(0,2)
|
var pos: float = -leaves.position.x + velocity * randf_range(0,2)
|
||||||
while pos < 0:
|
while pos < 0:
|
||||||
var leaf: Leaf = leaf_scene.instantiate()
|
var leaf: Leaf = LEAF_SCENE.instantiate()
|
||||||
leaves.add_child(leaf)
|
leaves.add_child(leaf)
|
||||||
leaf.position.x = pos
|
leaf.position.x = pos
|
||||||
pos = pos + velocity * randf_range(2, 5)
|
pos = pos + velocity * randf_range(2, 5)
|
||||||
@@ -54,7 +51,7 @@ func _process(delta: float) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func spawn_berry(gp: Dictionary, is_distractor: bool) -> void:
|
func spawn_berry(gp: Dictionary, is_distractor: bool) -> void:
|
||||||
var berry : Berry = berry_scene.instantiate()
|
var berry : Berry = BERRY_SCENE.instantiate()
|
||||||
berries.add_child(berry)
|
berries.add_child(berry)
|
||||||
berry.gp = gp
|
berry.gp = gp
|
||||||
berry.is_distractor = is_distractor
|
berry.is_distractor = is_distractor
|
||||||
@@ -76,7 +73,7 @@ func _on_button_pressed() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _on_leaf_timer_timeout() -> void:
|
func _on_leaf_timer_timeout() -> void:
|
||||||
var leaf: Leaf = leaf_scene.instantiate()
|
var leaf: Leaf = LEAF_SCENE.instantiate()
|
||||||
leaves.add_child(leaf)
|
leaves.add_child(leaf)
|
||||||
|
|
||||||
leaf_timer.wait_time = randf_range(2.0, 5.0)
|
leaf_timer.wait_time = randf_range(2.0, 5.0)
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name Caterpillar
|
||||||
# Namespace
|
|
||||||
const CaterpillarHead: = preload("res://sources/minigames/caterpillar/caterpillar_head.gd")
|
|
||||||
const CaterpillarBody: = preload("res://sources/minigames/caterpillar/caterpillar_body.gd")
|
|
||||||
const Berry: = preload("res://sources/minigames/caterpillar/berry.gd")
|
|
||||||
|
|
||||||
signal berry_eaten(berry: Berry)
|
signal berry_eaten(berry: Berry)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name CaterpillarBody
|
||||||
|
|
||||||
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
||||||
@onready var label: Label = $Label
|
@onready var label: Label = $Label
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
@tool
|
@tool
|
||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name CaterpillarHead
|
||||||
|
|
||||||
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
|
||||||
@onready var audio_stream_player: CaterpillarAudioStreamPlayer = $CaterpillarAudioStreamPlayer
|
@onready var audio_stream_player: CaterpillarAudioStreamPlayer = $CaterpillarAudioStreamPlayer
|
||||||
|
|||||||
@@ -1,12 +1,7 @@
|
|||||||
@tool
|
@tool
|
||||||
extends WordsMinigame
|
extends WordsMinigame
|
||||||
|
|
||||||
# Namespace
|
const BRANCH_SCENE: PackedScene = preload("res://sources/minigames/caterpillar/branch.tscn")
|
||||||
const Caterpillar: = preload("res://sources/minigames/caterpillar/caterpillar.gd")
|
|
||||||
const Branch: = preload("res://sources/minigames/caterpillar/branch.gd")
|
|
||||||
const Berry: = preload("res://sources/minigames/caterpillar/berry.gd")
|
|
||||||
|
|
||||||
const branch_scene: PackedScene = preload("res://sources/minigames/caterpillar/branch.tscn")
|
|
||||||
|
|
||||||
|
|
||||||
class DifficultySettings:
|
class DifficultySettings:
|
||||||
@@ -50,7 +45,7 @@ func _setup_minigame() -> void:
|
|||||||
# Spawn the right amount of branches
|
# Spawn the right amount of branches
|
||||||
var branch_size: float = branches_zone.size.y / (settings.branches + 1)
|
var branch_size: float = branches_zone.size.y / (settings.branches + 1)
|
||||||
for index: int in settings.branches:
|
for index: int in settings.branches:
|
||||||
var branch: Branch = branch_scene.instantiate()
|
var branch: Branch = BRANCH_SCENE.instantiate()
|
||||||
branch.velocity = settings.velocity
|
branch.velocity = settings.velocity
|
||||||
branches_zone.add_child(branch)
|
branches_zone.add_child(branch)
|
||||||
branch.set_position(Vector2(0, branch_size * (index+1)))
|
branch.set_position(Vector2(0, branch_size * (index+1)))
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
|
class_name Leaf
|
||||||
|
|
||||||
func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
|
func _on_visible_on_screen_notifier_2d_screen_exited() -> void:
|
||||||
queue_free()
|
queue_free()
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
extends Node2D
|
extends Node2D
|
||||||
class_name Penguin
|
class_name Penguin
|
||||||
|
|
||||||
# Namespace
|
|
||||||
const Snowball: = preload("res://sources/minigames/penguin/snowball.gd")
|
|
||||||
|
|
||||||
const snowball_scene: PackedScene = preload("res://sources/minigames/penguin/snowball.tscn")
|
const snowball_scene: PackedScene = preload("res://sources/minigames/penguin/snowball.tscn")
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Path2D
|
extends Path2D
|
||||||
|
class_name Snowball
|
||||||
|
|
||||||
@onready var path_follow: PathFollow2D = $PathFollow2D
|
@onready var path_follow: PathFollow2D = $PathFollow2D
|
||||||
@onready var sprite: Sprite2D = $PathFollow2D/Sprite2D
|
@onready var sprite: Sprite2D = $PathFollow2D/Sprite2D
|
||||||
|
|||||||
@@ -15,11 +15,10 @@ const look_and_learn_sounds: String = "/look_and_learn/sounds/"
|
|||||||
const look_and_learn_videos: String = "/look_and_learn/video/"
|
const look_and_learn_videos: String = "/look_and_learn/video/"
|
||||||
const language_sounds: String = "/language_sounds/"
|
const language_sounds: String = "/language_sounds/"
|
||||||
const kalulu_folder: String = "/kalulu/"
|
const kalulu_folder: String = "/kalulu/"
|
||||||
const tracing_data_folder: String = "tracing_data/"
|
|
||||||
const additional_word_list_path: String = "word_list.csv"
|
const additional_word_list_path: String = "word_list.csv"
|
||||||
const video_extension: String = ".ogv"
|
const VIDEO_EXTENSION: String = ".ogv"
|
||||||
const image_extension: String = ".png"
|
const IMAGE_EXTENSION: String = ".png"
|
||||||
const sound_extension: String = ".mp3"
|
const SOUND_EXTENSION: String = ".mp3"
|
||||||
|
|
||||||
var language: String:
|
var language: String:
|
||||||
set(value):
|
set(value):
|
||||||
@@ -539,31 +538,31 @@ func get_gp_name(gp: Dictionary) -> String:
|
|||||||
|
|
||||||
|
|
||||||
func get_gp_look_and_learn_image_path(gp: Dictionary) -> String:
|
func get_gp_look_and_learn_image_path(gp: Dictionary) -> String:
|
||||||
return base_path + language + look_and_learn_images + get_gp_name(gp) + image_extension
|
return base_path + language + look_and_learn_images + get_gp_name(gp) + IMAGE_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_gp_look_and_learn_sound_path(gp: Dictionary) -> String:
|
func get_gp_look_and_learn_sound_path(gp: Dictionary) -> String:
|
||||||
return base_path + language + look_and_learn_sounds + get_gp_name(gp) + sound_extension
|
return base_path + language + look_and_learn_sounds + get_gp_name(gp) + SOUND_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_gp_look_and_learn_video_path(gp: Dictionary) -> String:
|
func get_gp_look_and_learn_video_path(gp: Dictionary) -> String:
|
||||||
return base_path + language + look_and_learn_videos + get_gp_name(gp) + video_extension
|
return base_path + language + look_and_learn_videos + get_gp_name(gp) + VIDEO_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_gp_sound_path(gp: Dictionary) -> String:
|
func get_gp_sound_path(gp: Dictionary) -> String:
|
||||||
return base_path + language + language_sounds + Database.get_gp_name(gp) + sound_extension
|
return base_path + language + language_sounds + Database.get_gp_name(gp) + SOUND_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_syllable_sound_path(syllable: Dictionary) -> String:
|
func get_syllable_sound_path(syllable: Dictionary) -> String:
|
||||||
return base_path + language + language_sounds + syllable.Grapheme + sound_extension
|
return base_path + language + language_sounds + syllable.Grapheme + SOUND_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_word_sound_path(word: Dictionary) -> String:
|
func get_word_sound_path(word: Dictionary) -> String:
|
||||||
return base_path + language + language_sounds + word.Word + sound_extension
|
return base_path + language + language_sounds + word.Word + SOUND_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func get_kalulu_speech_path(speech_category: String, speech_name: String) -> String:
|
func get_kalulu_speech_path(speech_category: String, speech_name: String) -> String:
|
||||||
return base_path + language + language_sounds + kalulu_folder + speech_category + "_" + speech_name + sound_extension
|
return base_path + language + language_sounds + kalulu_folder + speech_category + "_" + speech_name + SOUND_EXTENSION
|
||||||
|
|
||||||
|
|
||||||
func load_external_sound(path: String) -> AudioStreamMP3:
|
func load_external_sound(path: String) -> AudioStreamMP3:
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
class_name Fireworks
|
||||||
|
|
||||||
signal finished()
|
signal finished()
|
||||||
|
|
||||||
const Rocket: = preload("res://sources/utils/fx/rocket.gd")
|
const ROKCET_SCENE: PackedScene = preload("res://sources/utils/fx/rocket.tscn")
|
||||||
const rocket_scene: PackedScene = preload("res://sources/utils/fx/rocket.tscn")
|
|
||||||
|
|
||||||
@export var number_of_rockets: int = 25
|
@export var number_of_rockets: int = 25
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ func _on_FireDelayTimer_timeout() -> void:
|
|||||||
var start_node: Node2D = starts[randi() % starts.size()]
|
var start_node: Node2D = starts[randi() % starts.size()]
|
||||||
var end_node: Node2D = ends[randi() % ends.size()]
|
var end_node: Node2D = ends[randi() % ends.size()]
|
||||||
|
|
||||||
var rocket: Rocket = rocket_scene.instantiate()
|
var rocket: Rocket = ROKCET_SCENE.instantiate()
|
||||||
rockets.add_child(rocket)
|
rockets.add_child(rocket)
|
||||||
rocket.start(start_node.global_position, end_node.global_position + Vector2(randf_range(-25.0, 25.0), randf_range(-25.0, 25.0)))
|
rocket.start(start_node.global_position, end_node.global_position + Vector2(randf_range(-25.0, 25.0), randf_range(-25.0, 25.0)))
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
extends Path2D
|
extends Path2D
|
||||||
|
class_name Rocket
|
||||||
|
|
||||||
@export var spread_angle: float = PI/8.0
|
@export var spread_angle: float = PI/8.0
|
||||||
@export var segments: int = 5
|
@export var segments: int = 5
|
||||||
|
|||||||
Reference in New Issue
Block a user