Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
981965d8c7 | ||
|
|
d28e734806 | ||
|
|
4ca102966b | ||
|
|
35004684f4 | ||
|
|
fb8a2da4ff | ||
|
|
dc1a6686bc | ||
|
|
fadf0cb769 | ||
|
|
f1acb6e3e9 | ||
|
|
6a1a663020 | ||
|
|
e305e3213d | ||
|
|
e6d34a50a5 | ||
|
|
c992950789 | ||
|
|
ab5089ad6c | ||
|
|
4b8e59ee56 | ||
|
|
9570fd96c2 | ||
|
|
3a82e8b3c1 | ||
|
|
3146198725 | ||
|
|
8d3b0768fa | ||
|
|
27b236b27c | ||
|
|
6a751eaf7d | ||
|
|
f2aa04e5e9 | ||
|
|
00742de387 | ||
|
|
6632c2f533 | ||
|
|
4457b4ff84 | ||
|
|
32f0867d1e | ||
|
|
eb009d6f41 | ||
|
|
71f36fb430 | ||
|
|
42bbef60d5 | ||
|
|
7d81023331 | ||
|
|
d835de1d66 | ||
|
|
605b5a16cf | ||
|
|
1922864343 | ||
|
|
3f4f024070 | ||
|
|
96e20b7ff0 | ||
|
|
99a0522e9e | ||
|
|
9dbc3ffb49 | ||
|
|
109c9c3b84 | ||
|
|
c54d072bcb | ||
|
|
307b7418f4 | ||
|
|
3fa84994cd | ||
|
|
5722fbb437 | ||
|
|
96d1a4f4dd | ||
|
|
cc421a951f | ||
|
|
83d462f2f4 | ||
|
|
62b34473b6 | ||
|
|
ff4feacea3 |
@@ -18,4 +18,7 @@ mono_crash.*.json
|
|||||||
|
|
||||||
.vscode
|
.vscode
|
||||||
|
|
||||||
.export/
|
.export/
|
||||||
|
|
||||||
|
stw_demo_save.tres
|
||||||
|
stw_settings.tres
|
||||||
@@ -3,20 +3,21 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://cl03vrbj5wsjk"
|
uid="uid://cl03vrbj5wsjk"
|
||||||
path="res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.ctex"
|
path.s3tc="res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"has_editor_variant": true,
|
"has_editor_variant": true,
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://addons/dialogic/Editor/Images/Pieces/expand-icon.svg"
|
source_file="res://addons/dialogic/Editor/Images/Pieces/expand-icon.svg"
|
||||||
dest_files=["res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.ctex"]
|
dest_files=["res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -24,7 +25,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -38,7 +39,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=1.0
|
svg/scale=1.0
|
||||||
editor/scale_with_editor_scale=true
|
editor/scale_with_editor_scale=true
|
||||||
editor/convert_colors_with_editor_theme=true
|
editor/convert_colors_with_editor_theme=true
|
||||||
|
|||||||
@@ -3,20 +3,21 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://qx5bntelnslj"
|
uid="uid://qx5bntelnslj"
|
||||||
path="res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.ctex"
|
path.s3tc="res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"has_editor_variant": true,
|
"has_editor_variant": true,
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://addons/dialogic/Modules/Character/update_portrait.svg"
|
source_file="res://addons/dialogic/Modules/Character/update_portrait.svg"
|
||||||
dest_files=["res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.ctex"]
|
dest_files=["res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -24,7 +25,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -38,7 +39,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=1.0
|
svg/scale=1.0
|
||||||
editor/scale_with_editor_scale=true
|
editor/scale_with_editor_scale=true
|
||||||
editor/convert_colors_with_editor_theme=true
|
editor/convert_colors_with_editor_theme=true
|
||||||
|
|||||||
@@ -24,18 +24,18 @@ var portrait := ""
|
|||||||
|
|
||||||
## Used to set the character resource from the unique name identifier and vice versa
|
## Used to set the character resource from the unique name identifier and vice versa
|
||||||
var character_identifier: String:
|
var character_identifier: String:
|
||||||
get:
|
get:
|
||||||
if character and not "{" in character_identifier:
|
if character and not "{" in character_identifier:
|
||||||
var identifier := character.get_identifier()
|
var identifier := character.get_identifier()
|
||||||
if not identifier.is_empty():
|
if not identifier.is_empty():
|
||||||
return identifier
|
return identifier
|
||||||
return character_identifier
|
return character_identifier
|
||||||
set(value):
|
set(value):
|
||||||
character_identifier = value
|
character_identifier = value
|
||||||
character = DialogicResourceUtil.get_character_resource(value)
|
character = DialogicResourceUtil.get_character_resource(value)
|
||||||
if Engine.is_editor_hint() and ((not character) or (character and not character.portraits.has(portrait))):
|
if Engine.is_editor_hint() and ((not character) or (character and not character.portraits.has(portrait))):
|
||||||
portrait = ""
|
portrait = ""
|
||||||
ui_update_needed.emit()
|
ui_update_needed.emit()
|
||||||
|
|
||||||
var regex := RegEx.create_from_string(r'\s*((")?(?<name>(?(2)[^"\n]*|[^(: \n]*))(?(2)"|)(\W*(?<portrait>\(.*\)))?\s*(?<!\\):)?(?<text>(.|\n)*)')
|
var regex := RegEx.create_from_string(r'\s*((")?(?<name>(?(2)[^"\n]*|[^(: \n]*))(?(2)"|)(\W*(?<portrait>\(.*\)))?\s*(?<!\\):)?(?<text>(.|\n)*)')
|
||||||
var split_regex := RegEx.create_from_string(r"((\[n\]|\[n\+\])?((?!(\[n\]|\[n\+\]))(.|\n))+)")
|
var split_regex := RegEx.create_from_string(r"((\[n\]|\[n\+\])?((?!(\[n\]|\[n\+\]))(.|\n))+)")
|
||||||
@@ -49,225 +49,225 @@ signal advance
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
func _clear_state() -> void:
|
func _clear_state() -> void:
|
||||||
dialogic.current_state_info.erase('text_sub_idx')
|
dialogic.current_state_info.erase('text_sub_idx')
|
||||||
_disconnect_signals()
|
_disconnect_signals()
|
||||||
|
|
||||||
|
|
||||||
func _execute() -> void:
|
func _execute() -> void:
|
||||||
if text.is_empty():
|
if text.is_empty():
|
||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
|
|
||||||
## If the speaker is provided as an expression, parse it now.
|
## If the speaker is provided as an expression, parse it now.
|
||||||
if "{" in character_identifier:
|
if "{" in character_identifier:
|
||||||
character = null
|
character = null
|
||||||
var character_name: String = dialogic.Expressions.execute_string(character_identifier)
|
var character_name: String = dialogic.Expressions.execute_string(character_identifier)
|
||||||
get_or_create_character(character_name)
|
get_or_create_character(character_name)
|
||||||
|
|
||||||
## Change Portrait and Active Speaker
|
## Change Portrait and Active Speaker
|
||||||
if dialogic.has_subsystem("Portraits"):
|
if dialogic.has_subsystem("Portraits"):
|
||||||
if character:
|
if character:
|
||||||
|
|
||||||
dialogic.Portraits.change_speaker(character, portrait)
|
dialogic.Portraits.change_speaker(character, portrait)
|
||||||
|
|
||||||
if portrait and dialogic.Portraits.is_character_joined(character):
|
if portrait and dialogic.Portraits.is_character_joined(character):
|
||||||
dialogic.Portraits.change_character_portrait(character, portrait)
|
dialogic.Portraits.change_character_portrait(character, portrait)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
dialogic.Portraits.change_speaker(null)
|
dialogic.Portraits.change_speaker(null)
|
||||||
|
|
||||||
## Change and Type Sound Mood
|
## Change and Type Sound Mood
|
||||||
if character:
|
if character:
|
||||||
dialogic.Text.update_name_label(character)
|
dialogic.Text.update_name_label(character)
|
||||||
|
|
||||||
var current_portrait: String = portrait
|
var current_portrait: String = portrait
|
||||||
if portrait.is_empty():
|
if portrait.is_empty():
|
||||||
current_portrait = dialogic.current_state_info["portraits"].get(character.get_identifier(), {}).get("portrait", "")
|
current_portrait = dialogic.current_state_info["portraits"].get(character.get_identifier(), {}).get("portrait", "")
|
||||||
|
|
||||||
var current_portrait_sound_mood: String = character.portraits.get(current_portrait, {}).get("sound_mood", "")
|
var current_portrait_sound_mood: String = character.portraits.get(current_portrait, {}).get("sound_mood", "")
|
||||||
dialogic.Text.update_typing_sound_mood_from_character(character, current_portrait_sound_mood)
|
dialogic.Text.update_typing_sound_mood_from_character(character, current_portrait_sound_mood)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
dialogic.Text.update_name_label(null)
|
dialogic.Text.update_name_label(null)
|
||||||
dialogic.Text.update_typing_sound_mood()
|
dialogic.Text.update_typing_sound_mood()
|
||||||
|
|
||||||
|
|
||||||
## Handle style changes
|
## Handle style changes
|
||||||
if dialogic.has_subsystem("Styles"):
|
if dialogic.has_subsystem("Styles"):
|
||||||
var current_base_style: String = dialogic.current_state_info.get("base_style")
|
var current_base_style: String = dialogic.current_state_info.get("base_style")
|
||||||
var current_style: String = dialogic.current_state_info.get("style", "")
|
var current_style: String = dialogic.current_state_info.get("style", "")
|
||||||
var character_style: String = "" if not character else character.custom_info.get("style", "")
|
var character_style: String = "" if not character else character.custom_info.get("style", "")
|
||||||
|
|
||||||
## Change back to base style, if another characters style is currently used
|
## Change back to base style, if another characters style is currently used
|
||||||
if (not character or character_style.is_empty()) and (current_base_style != current_style):
|
if (not character or character_style.is_empty()) and (current_base_style != current_style):
|
||||||
dialogic.Styles.change_style(dialogic.current_state_info.get("base_style", "Default"))
|
dialogic.Styles.change_style(dialogic.current_state_info.get("base_style", "Default"))
|
||||||
await dialogic.get_tree().process_frame
|
await dialogic.get_tree().process_frame
|
||||||
|
|
||||||
## Change to the characters style if this character has one
|
## Change to the characters style if this character has one
|
||||||
elif character and not character_style.is_empty():
|
elif character and not character_style.is_empty():
|
||||||
dialogic.Styles.change_style(character_style, false)
|
dialogic.Styles.change_style(character_style, false)
|
||||||
await dialogic.get_tree().process_frame
|
await dialogic.get_tree().process_frame
|
||||||
|
|
||||||
_connect_signals()
|
_connect_signals()
|
||||||
|
|
||||||
var character_name_text := dialogic.Text.get_character_name_parsed(character)
|
var character_name_text := dialogic.Text.get_character_name_parsed(character)
|
||||||
var final_text: String = get_property_translated('text')
|
var final_text: String = get_property_translated('text')
|
||||||
if ProjectSettings.get_setting('dialogic/text/split_at_new_lines', false):
|
if ProjectSettings.get_setting('dialogic/text/split_at_new_lines', false):
|
||||||
match ProjectSettings.get_setting('dialogic/text/split_at_new_lines_as', 0):
|
match ProjectSettings.get_setting('dialogic/text/split_at_new_lines_as', 0):
|
||||||
0:
|
0:
|
||||||
final_text = final_text.replace('\n', '[n]')
|
final_text = final_text.replace('\n', '[n]')
|
||||||
1:
|
1:
|
||||||
final_text = final_text.replace('\n', '[n+][br]')
|
final_text = final_text.replace('\n', '[n+][br]')
|
||||||
|
|
||||||
var split_text := []
|
var split_text := []
|
||||||
for i in split_regex.search_all(final_text):
|
for i in split_regex.search_all(final_text):
|
||||||
split_text.append([i.get_string().trim_prefix('[n]').trim_prefix('[n+]')])
|
split_text.append([i.get_string().trim_prefix('[n]').trim_prefix('[n+]')])
|
||||||
split_text[-1].append(i.get_string().begins_with('[n+]'))
|
split_text[-1].append(i.get_string().begins_with('[n+]'))
|
||||||
|
|
||||||
dialogic.current_state_info['text_sub_idx'] = dialogic.current_state_info.get('text_sub_idx', -1)
|
dialogic.current_state_info['text_sub_idx'] = dialogic.current_state_info.get('text_sub_idx', -1)
|
||||||
|
|
||||||
var reveal_next_segment: bool = dialogic.current_state_info['text_sub_idx'] == -1
|
var reveal_next_segment: bool = dialogic.current_state_info['text_sub_idx'] == -1
|
||||||
|
|
||||||
for section_idx in range(min(max(0, dialogic.current_state_info['text_sub_idx']), len(split_text)-1), len(split_text)):
|
for section_idx in range(min(max(0, dialogic.current_state_info['text_sub_idx']), len(split_text)-1), len(split_text)):
|
||||||
dialogic.Inputs.block_input(ProjectSettings.get_setting('dialogic/text/text_reveal_skip_delay', 0.1))
|
dialogic.Inputs.block_input(ProjectSettings.get_setting('dialogic/text/text_reveal_skip_delay', 0.1))
|
||||||
|
|
||||||
if reveal_next_segment:
|
if reveal_next_segment:
|
||||||
dialogic.Text.hide_next_indicators()
|
dialogic.Text.hide_next_indicators()
|
||||||
|
|
||||||
dialogic.current_state_info['text_sub_idx'] = section_idx
|
dialogic.current_state_info['text_sub_idx'] = section_idx
|
||||||
|
|
||||||
var segment: String = dialogic.Text.parse_text(split_text[section_idx][0], 0)
|
var segment: String = dialogic.Text.parse_text(split_text[section_idx][0], 0)
|
||||||
var is_append: bool = split_text[section_idx][1]
|
var is_append: bool = split_text[section_idx][1]
|
||||||
|
|
||||||
final_text = ProjectSettings.get_setting("dialogic/text/dialog_text_prefix", "")+segment
|
final_text = ProjectSettings.get_setting("dialogic/text/dialog_text_prefix", "")+segment
|
||||||
dialogic.Text.about_to_show_text.emit({'text':final_text, 'character':character, 'portrait':portrait, 'append': is_append})
|
dialogic.Text.about_to_show_text.emit({'text':final_text, 'character':character, 'portrait':portrait, 'append': is_append})
|
||||||
|
|
||||||
await dialogic.Text.update_textbox(final_text, false)
|
await dialogic.Text.update_textbox(final_text, false)
|
||||||
|
|
||||||
state = States.REVEALING
|
state = States.REVEALING
|
||||||
_try_play_current_line_voice()
|
_try_play_current_line_voice()
|
||||||
final_text = dialogic.Text.update_dialog_text(final_text, false, is_append)
|
final_text = dialogic.Text.update_dialog_text(final_text, false, is_append)
|
||||||
|
|
||||||
dialogic.Text.text_started.emit({'text':final_text, 'character':character, 'portrait':portrait, 'append': is_append})
|
dialogic.Text.text_started.emit({'text':final_text, 'character':character, 'portrait':portrait, 'append': is_append})
|
||||||
|
|
||||||
_mark_as_read(character_name_text, final_text)
|
_mark_as_read(character_name_text, final_text)
|
||||||
|
|
||||||
# We must skip text animation before we potentially return when there
|
# We must skip text animation before we potentially return when there
|
||||||
# is a Choice event.
|
# is a Choice event.
|
||||||
if dialogic.Inputs.auto_skip.enabled:
|
if dialogic.Inputs.auto_skip.enabled:
|
||||||
dialogic.Text.skip_text_reveal()
|
dialogic.Text.skip_text_reveal()
|
||||||
else:
|
else:
|
||||||
await dialogic.Text.text_finished
|
await dialogic.Text.text_finished
|
||||||
|
|
||||||
state = States.IDLE
|
state = States.IDLE
|
||||||
else:
|
else:
|
||||||
reveal_next_segment = true
|
reveal_next_segment = true
|
||||||
|
|
||||||
# Handling potential Choice Events.
|
# Handling potential Choice Events.
|
||||||
if section_idx == len(split_text)-1 and dialogic.has_subsystem('Choices') and dialogic.Choices.is_question(dialogic.current_event_idx):
|
if section_idx == len(split_text)-1 and dialogic.has_subsystem('Choices') and dialogic.Choices.is_question(dialogic.current_event_idx):
|
||||||
dialogic.Text.show_next_indicators(true)
|
dialogic.Text.show_next_indicators(true)
|
||||||
|
|
||||||
finish()
|
finish()
|
||||||
return
|
return
|
||||||
|
|
||||||
elif dialogic.Inputs.auto_advance.is_enabled():
|
elif dialogic.Inputs.auto_advance.is_enabled():
|
||||||
dialogic.Text.show_next_indicators(false, true)
|
dialogic.Text.show_next_indicators(false, true)
|
||||||
dialogic.Inputs.auto_advance.start()
|
dialogic.Inputs.auto_advance.start()
|
||||||
else:
|
else:
|
||||||
dialogic.Text.show_next_indicators()
|
dialogic.Text.show_next_indicators()
|
||||||
|
|
||||||
if section_idx == len(split_text)-1:
|
if section_idx == len(split_text)-1:
|
||||||
state = States.DONE
|
state = States.DONE
|
||||||
|
|
||||||
# If Auto-Skip is enabled and there are multiple parts of this text
|
# If Auto-Skip is enabled and there are multiple parts of this text
|
||||||
# we need to skip the text after the defined time per event.
|
# we need to skip the text after the defined time per event.
|
||||||
if dialogic.Inputs.auto_skip.enabled:
|
if dialogic.Inputs.auto_skip.enabled:
|
||||||
await dialogic.Inputs.start_autoskip_timer()
|
await dialogic.Inputs.start_autoskip_timer()
|
||||||
|
|
||||||
# Check if Auto-Skip is still enabled.
|
# Check if Auto-Skip is still enabled.
|
||||||
if not dialogic.Inputs.auto_skip.enabled:
|
if not dialogic.Inputs.auto_skip.enabled:
|
||||||
await advance
|
await advance
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await advance
|
await advance
|
||||||
|
|
||||||
|
|
||||||
finish()
|
finish()
|
||||||
|
|
||||||
|
|
||||||
func _mark_as_read(character_name_text: String, final_text: String) -> void:
|
func _mark_as_read(character_name_text: String, final_text: String) -> void:
|
||||||
if dialogic.has_subsystem('History'):
|
if dialogic.has_subsystem('History'):
|
||||||
if character:
|
if character:
|
||||||
dialogic.History.store_simple_history_entry(final_text, event_name, {'character':character_name_text, 'character_color':character.color})
|
dialogic.History.store_simple_history_entry(final_text, event_name, {'character':character_name_text, 'character_color':character.color})
|
||||||
else:
|
else:
|
||||||
dialogic.History.store_simple_history_entry(final_text, event_name)
|
dialogic.History.store_simple_history_entry(final_text, event_name)
|
||||||
dialogic.History.mark_event_as_visited()
|
dialogic.History.mark_event_as_visited()
|
||||||
|
|
||||||
|
|
||||||
func _connect_signals() -> void:
|
func _connect_signals() -> void:
|
||||||
if not dialogic.Inputs.dialogic_action.is_connected(_on_dialogic_input_action):
|
if not dialogic.Inputs.dialogic_action.is_connected(_on_dialogic_input_action):
|
||||||
dialogic.Inputs.dialogic_action.connect(_on_dialogic_input_action)
|
dialogic.Inputs.dialogic_action.connect(_on_dialogic_input_action)
|
||||||
|
|
||||||
dialogic.Inputs.auto_skip.toggled.connect(_on_auto_skip_enable)
|
dialogic.Inputs.auto_skip.toggled.connect(_on_auto_skip_enable)
|
||||||
|
|
||||||
if not dialogic.Inputs.auto_advance.autoadvance.is_connected(_on_dialogic_input_autoadvance):
|
if not dialogic.Inputs.auto_advance.autoadvance.is_connected(_on_dialogic_input_autoadvance):
|
||||||
dialogic.Inputs.auto_advance.autoadvance.connect(_on_dialogic_input_autoadvance)
|
dialogic.Inputs.auto_advance.autoadvance.connect(_on_dialogic_input_autoadvance)
|
||||||
|
|
||||||
|
|
||||||
## If the event is done, this method can clean-up signal connections.
|
## If the event is done, this method can clean-up signal connections.
|
||||||
func _disconnect_signals() -> void:
|
func _disconnect_signals() -> void:
|
||||||
if dialogic.Inputs.dialogic_action.is_connected(_on_dialogic_input_action):
|
if dialogic.Inputs.dialogic_action.is_connected(_on_dialogic_input_action):
|
||||||
dialogic.Inputs.dialogic_action.disconnect(_on_dialogic_input_action)
|
dialogic.Inputs.dialogic_action.disconnect(_on_dialogic_input_action)
|
||||||
if dialogic.Inputs.auto_advance.autoadvance.is_connected(_on_dialogic_input_autoadvance):
|
if dialogic.Inputs.auto_advance.autoadvance.is_connected(_on_dialogic_input_autoadvance):
|
||||||
dialogic.Inputs.auto_advance.autoadvance.disconnect(_on_dialogic_input_autoadvance)
|
dialogic.Inputs.auto_advance.autoadvance.disconnect(_on_dialogic_input_autoadvance)
|
||||||
if dialogic.Inputs.auto_skip.toggled.is_connected(_on_auto_skip_enable):
|
if dialogic.Inputs.auto_skip.toggled.is_connected(_on_auto_skip_enable):
|
||||||
dialogic.Inputs.auto_skip.toggled.disconnect(_on_auto_skip_enable)
|
dialogic.Inputs.auto_skip.toggled.disconnect(_on_auto_skip_enable)
|
||||||
|
|
||||||
|
|
||||||
## Tries to play the voice clip for the current line.
|
## Tries to play the voice clip for the current line.
|
||||||
func _try_play_current_line_voice() -> void:
|
func _try_play_current_line_voice() -> void:
|
||||||
# If Auto-Skip is enabled and we skip voice clips, we don't want to play.
|
# If Auto-Skip is enabled and we skip voice clips, we don't want to play.
|
||||||
if (dialogic.Inputs.auto_skip.enabled
|
if (dialogic.Inputs.auto_skip.enabled
|
||||||
and dialogic.Inputs.auto_skip.skip_voice):
|
and dialogic.Inputs.auto_skip.skip_voice):
|
||||||
return
|
return
|
||||||
|
|
||||||
# Plays the audio region for the current line.
|
# Plays the audio region for the current line.
|
||||||
if (dialogic.has_subsystem('Voice')
|
if (dialogic.has_subsystem('Voice')
|
||||||
and dialogic.Voice.is_voiced(dialogic.current_event_idx)):
|
and dialogic.Voice.is_voiced(dialogic.current_event_idx)):
|
||||||
dialogic.Voice.play_voice()
|
dialogic.Voice.play_voice()
|
||||||
|
|
||||||
|
|
||||||
func _on_dialogic_input_action() -> void:
|
func _on_dialogic_input_action() -> void:
|
||||||
match state:
|
match state:
|
||||||
States.REVEALING:
|
States.REVEALING:
|
||||||
if dialogic.Text.is_text_reveal_skippable():
|
if dialogic.Text.is_text_reveal_skippable():
|
||||||
dialogic.Text.skip_text_reveal()
|
dialogic.Text.skip_text_reveal()
|
||||||
dialogic.Inputs.stop_timers()
|
dialogic.Inputs.stop_timers()
|
||||||
_:
|
_:
|
||||||
if dialogic.Inputs.manual_advance.is_enabled():
|
if dialogic.Inputs.manual_advance.is_enabled():
|
||||||
advance.emit()
|
advance.emit()
|
||||||
dialogic.Inputs.stop_timers()
|
dialogic.Inputs.stop_timers()
|
||||||
|
|
||||||
|
|
||||||
func _on_dialogic_input_autoadvance() -> void:
|
func _on_dialogic_input_autoadvance() -> void:
|
||||||
if state == States.IDLE or state == States.DONE:
|
if state == States.IDLE or state == States.DONE:
|
||||||
advance.emit()
|
advance.emit()
|
||||||
|
|
||||||
|
|
||||||
func _on_auto_skip_enable(enabled: bool) -> void:
|
func _on_auto_skip_enable(enabled: bool) -> void:
|
||||||
if not enabled:
|
if not enabled:
|
||||||
return
|
return
|
||||||
|
|
||||||
match state:
|
match state:
|
||||||
States.DONE:
|
States.DONE:
|
||||||
await dialogic.Inputs.start_autoskip_timer()
|
await dialogic.Inputs.start_autoskip_timer()
|
||||||
|
|
||||||
# If Auto-Skip is still enabled, advance the text.
|
# If Auto-Skip is still enabled, advance the text.
|
||||||
if dialogic.Inputs.auto_skip.enabled:
|
if dialogic.Inputs.auto_skip.enabled:
|
||||||
advance.emit()
|
advance.emit()
|
||||||
|
|
||||||
States.REVEALING:
|
States.REVEALING:
|
||||||
dialogic.Text.skip_text_reveal()
|
dialogic.Text.skip_text_reveal()
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -276,12 +276,12 @@ func _on_auto_skip_enable(enabled: bool) -> void:
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
func _init() -> void:
|
func _init() -> void:
|
||||||
event_name = "Text"
|
event_name = "Text"
|
||||||
set_default_color('Color1')
|
set_default_color('Color1')
|
||||||
event_category = "Main"
|
event_category = "Main"
|
||||||
event_sorting_index = 0
|
event_sorting_index = 0
|
||||||
expand_by_default = true
|
expand_by_default = true
|
||||||
help_page_path = "https://docs.dialogic.pro/writing-texts.html"
|
help_page_path = "https://docs.dialogic.pro/writing-texts.html"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -289,92 +289,92 @@ func _init() -> void:
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
func to_text() -> String:
|
func to_text() -> String:
|
||||||
var result := text.replace('\n', '\\\n').strip_edges(false).trim_suffix("\\")
|
var result := text.replace('\n', '\\\n').strip_edges(false).trim_suffix("\\")
|
||||||
result = result.replace(':', '\\:')
|
result = result.replace(':', '\\:')
|
||||||
if result.is_empty():
|
if result.is_empty():
|
||||||
result = "<Empty Text Event>"
|
result = "<Empty Text Event>"
|
||||||
|
|
||||||
if character or character_identifier:
|
if character or character_identifier:
|
||||||
var name := character_identifier
|
var name := character_identifier
|
||||||
if character:
|
if character:
|
||||||
name = character.get_identifier()
|
name = character.get_identifier()
|
||||||
if name.count(" ") > 0:
|
if name.count(" ") > 0:
|
||||||
name = '"' + name + '"'
|
name = '"' + name + '"'
|
||||||
if not portrait.is_empty():
|
if not portrait.is_empty():
|
||||||
result = name+" ("+portrait+"): "+result
|
result = name+" ("+portrait+"): "+result
|
||||||
else:
|
else:
|
||||||
result = name+": "+result
|
result = name+": "+result
|
||||||
for event in DialogicResourceUtil.get_event_cache():
|
for event in DialogicResourceUtil.get_event_cache():
|
||||||
if not event is DialogicTextEvent and event.is_valid_event(result):
|
if not event is DialogicTextEvent and event.is_valid_event(result):
|
||||||
result = '\\'+result
|
result = '\\'+result
|
||||||
break
|
break
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
func from_text(string:String) -> void:
|
func from_text(string:String) -> void:
|
||||||
# Load default character
|
# Load default character
|
||||||
# This is only of relevance if the default has been overriden (usually not)
|
# This is only of relevance if the default has been overriden (usually not)
|
||||||
character = DialogicResourceUtil.get_character_resource(character_identifier)
|
character = DialogicResourceUtil.get_character_resource(character_identifier)
|
||||||
|
|
||||||
var result := regex.search(string.trim_prefix('\\'))
|
var result := regex.search(string.trim_prefix('\\'))
|
||||||
|
|
||||||
if result.get_string('portrait'):
|
if result.get_string('portrait'):
|
||||||
portrait = result.get_string('portrait').strip_edges().trim_prefix('(').trim_suffix(')')
|
portrait = result.get_string('portrait').strip_edges().trim_prefix('(').trim_suffix(')')
|
||||||
|
|
||||||
if result and not result.get_string('name').is_empty():
|
if result and not result.get_string('name').is_empty():
|
||||||
var name := result.get_string('name').strip_edges()
|
var name := result.get_string('name').strip_edges()
|
||||||
|
|
||||||
if name == '_':
|
if name == '_':
|
||||||
character = null
|
character = null
|
||||||
elif "{" in name:
|
elif "{" in name:
|
||||||
## If it's an expression, we load the character in _execute.
|
## If it's an expression, we load the character in _execute.
|
||||||
character_identifier = name
|
character_identifier = name
|
||||||
character = null
|
character = null
|
||||||
else:
|
else:
|
||||||
get_or_create_character(name)
|
get_or_create_character(name)
|
||||||
|
|
||||||
if not result:
|
if not result:
|
||||||
return
|
return
|
||||||
|
|
||||||
text = result.get_string('text').replace("\\\n", "\n").replace('\\:', ':').strip_edges().trim_prefix('\\')
|
text = result.get_string('text').replace("\\\n", "\n").replace('\\:', ':').strip_edges().trim_prefix('\\')
|
||||||
if text == '<Empty Text Event>':
|
if text == '<Empty Text Event>':
|
||||||
text = ""
|
text = ""
|
||||||
|
|
||||||
|
|
||||||
func get_or_create_character(name:String) -> void:
|
func get_or_create_character(name:String) -> void:
|
||||||
character = DialogicResourceUtil.get_character_resource(name)
|
character = DialogicResourceUtil.get_character_resource(name)
|
||||||
|
|
||||||
if character == null:
|
if character == null:
|
||||||
if Engine.is_editor_hint() == false:
|
if Engine.is_editor_hint() == false:
|
||||||
character = DialogicCharacter.new()
|
character = DialogicCharacter.new()
|
||||||
character.display_name = name
|
character.display_name = name
|
||||||
character.set_identifier(name)
|
character.set_identifier(name)
|
||||||
if portrait:
|
if portrait:
|
||||||
if "{" in portrait:
|
if "{" in portrait:
|
||||||
character.color = Color(dialogic.Expressions.execute_string(portrait))
|
character.color = Color(dialogic.Expressions.execute_string(portrait))
|
||||||
else:
|
else:
|
||||||
character.color = Color(portrait)
|
character.color = Color(portrait)
|
||||||
else:
|
else:
|
||||||
character_identifier = name
|
character_identifier = name
|
||||||
|
|
||||||
|
|
||||||
func is_valid_event(_string:String) -> bool:
|
func is_valid_event(_string:String) -> bool:
|
||||||
return true
|
return true
|
||||||
|
|
||||||
|
|
||||||
func is_string_full_event(string:String) -> bool:
|
func is_string_full_event(string:String) -> bool:
|
||||||
return !string.ends_with('\\')
|
return !string.ends_with('\\')
|
||||||
|
|
||||||
|
|
||||||
# this is only here to provide a list of default values
|
# this is only here to provide a list of default values
|
||||||
# this way the module manager can add custom default overrides to this event.
|
# this way the module manager can add custom default overrides to this event.
|
||||||
func get_shortcode_parameters() -> Dictionary:
|
func get_shortcode_parameters() -> Dictionary:
|
||||||
return {
|
return {
|
||||||
#param_name : property_info
|
#param_name : property_info
|
||||||
"character" : {"property": "character_identifier", "default": "", "ext_file":true},
|
"character" : {"property": "character_identifier", "default": "", "ext_file":true},
|
||||||
"portrait" : {"property": "portrait", "default": ""},
|
"portrait" : {"property": "portrait", "default": ""},
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
@@ -382,14 +382,14 @@ func get_shortcode_parameters() -> Dictionary:
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
func _get_translatable_properties() -> Array:
|
func _get_translatable_properties() -> Array:
|
||||||
return ['text']
|
return ['text']
|
||||||
|
|
||||||
|
|
||||||
func _get_property_original_translation(property:String) -> String:
|
func _get_property_original_translation(property:String) -> String:
|
||||||
match property:
|
match property:
|
||||||
'text':
|
'text':
|
||||||
return text
|
return text
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -399,44 +399,44 @@ func _get_property_original_translation(property:String) -> String:
|
|||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
func _enter_visual_editor(editor:DialogicEditor):
|
func _enter_visual_editor(editor:DialogicEditor):
|
||||||
editor.opened.connect(func(): ui_update_needed.emit())
|
editor.opened.connect(func(): ui_update_needed.emit())
|
||||||
|
|
||||||
|
|
||||||
func build_event_editor() -> void:
|
func build_event_editor() -> void:
|
||||||
add_header_edit('character_identifier', ValueType.DYNAMIC_OPTIONS,
|
add_header_edit('character_identifier', ValueType.DYNAMIC_OPTIONS,
|
||||||
{'file_extension' : '.dch',
|
{'file_extension' : '.dch',
|
||||||
'mode' : 2,
|
'mode' : 2,
|
||||||
'suggestions_func' : get_character_suggestions,
|
'suggestions_func' : get_character_suggestions,
|
||||||
'placeholder' : '(No one)',
|
'placeholder' : '(No one)',
|
||||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/character.svg")}, 'do_any_characters_exist()')
|
'icon' : load("res://addons/dialogic/Editor/Images/Resources/character.svg")}, 'do_any_characters_exist()')
|
||||||
add_header_edit('portrait', ValueType.DYNAMIC_OPTIONS,
|
add_header_edit('portrait', ValueType.DYNAMIC_OPTIONS,
|
||||||
{'suggestions_func' : get_portrait_suggestions,
|
{'suggestions_func' : get_portrait_suggestions,
|
||||||
'placeholder' : "(Don't change)",
|
'placeholder' : "(Don't change)",
|
||||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/portrait.svg"),
|
'icon' : load("res://addons/dialogic/Editor/Images/Resources/portrait.svg"),
|
||||||
'collapse_when_empty': true,},
|
'collapse_when_empty': true,},
|
||||||
'should_show_portrait_selector()')
|
'should_show_portrait_selector()')
|
||||||
add_body_edit('text', ValueType.MULTILINE_TEXT, {'autofocus':true})
|
add_body_edit('text', ValueType.MULTILINE_TEXT, {'autofocus':true})
|
||||||
|
|
||||||
|
|
||||||
func should_show_portrait_selector() -> bool:
|
func should_show_portrait_selector() -> bool:
|
||||||
return character and not character.portraits.is_empty() and not character.portraits.size() == 1
|
return character and not character.portraits.is_empty() and not character.portraits.size() == 1
|
||||||
|
|
||||||
|
|
||||||
func do_any_characters_exist() -> bool:
|
func do_any_characters_exist() -> bool:
|
||||||
return not DialogicResourceUtil.get_character_directory().is_empty()
|
return not DialogicResourceUtil.get_character_directory().is_empty()
|
||||||
|
|
||||||
|
|
||||||
func get_character_suggestions(search_text:String) -> Dictionary:
|
func get_character_suggestions(search_text:String) -> Dictionary:
|
||||||
var suggestions := DialogicUtil.get_character_suggestions(search_text, character, true, false, editor_node)
|
var suggestions := DialogicUtil.get_character_suggestions(search_text, character, true, false, editor_node)
|
||||||
if search_text and not search_text in suggestions:
|
if search_text and not search_text in suggestions:
|
||||||
suggestions[search_text] = {
|
suggestions[search_text] = {
|
||||||
"value":search_text,
|
"value":search_text,
|
||||||
"tooltip": "A temporary character, created on the spot.",
|
"tooltip": "A temporary character, created on the spot.",
|
||||||
"editor_icon":["GuiEllipsis", "EditorIcons"]}
|
"editor_icon":["GuiEllipsis", "EditorIcons"]}
|
||||||
return suggestions
|
return suggestions
|
||||||
|
|
||||||
func get_portrait_suggestions(search_text:String) -> Dictionary:
|
func get_portrait_suggestions(search_text:String) -> Dictionary:
|
||||||
return DialogicUtil.get_portrait_suggestions(search_text, character, true, "Don't change")
|
return DialogicUtil.get_portrait_suggestions(search_text, character, true, "Don't change")
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -447,45 +447,45 @@ func get_portrait_suggestions(search_text:String) -> Dictionary:
|
|||||||
var completion_text_character_getter_regex := RegEx.new()
|
var completion_text_character_getter_regex := RegEx.new()
|
||||||
var completion_text_effects := {}
|
var completion_text_effects := {}
|
||||||
func _get_code_completion(CodeCompletionHelper:Node, TextNode:TextEdit, line:String, _word:String, symbol:String) -> void:
|
func _get_code_completion(CodeCompletionHelper:Node, TextNode:TextEdit, line:String, _word:String, symbol:String) -> void:
|
||||||
if completion_text_character_getter_regex.get_pattern().is_empty():
|
if completion_text_character_getter_regex.get_pattern().is_empty():
|
||||||
completion_text_character_getter_regex.compile("(\"[^\"]*\"|[^\\s:]*)")
|
completion_text_character_getter_regex.compile("(\"[^\"]*\"|[^\\s:]*)")
|
||||||
|
|
||||||
if completion_text_effects.is_empty():
|
if completion_text_effects.is_empty():
|
||||||
for idx in DialogicUtil.get_indexers():
|
for idx in DialogicUtil.get_indexers():
|
||||||
for effect in idx._get_text_effects():
|
for effect in idx._get_text_effects():
|
||||||
completion_text_effects[effect['command']] = effect
|
completion_text_effects[effect['command']] = effect
|
||||||
|
|
||||||
if not ':' in line.substr(0, TextNode.get_caret_column()) and symbol == '(':
|
if not ':' in line.substr(0, TextNode.get_caret_column()) and symbol == '(':
|
||||||
var completion_character := completion_text_character_getter_regex.search(line).get_string().trim_prefix('"').trim_suffix('"')
|
var completion_character := completion_text_character_getter_regex.search(line).get_string().trim_prefix('"').trim_suffix('"')
|
||||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character)
|
CodeCompletionHelper.suggest_portraits(TextNode, completion_character)
|
||||||
|
|
||||||
if symbol == '[':
|
if symbol == '[':
|
||||||
suggest_bbcode(TextNode)
|
suggest_bbcode(TextNode)
|
||||||
for effect in completion_text_effects.values():
|
for effect in completion_text_effects.values():
|
||||||
if effect.get('arg', false):
|
if effect.get('arg', false):
|
||||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, effect.command, effect.command+'=', TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"))
|
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, effect.command, effect.command+'=', TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"))
|
||||||
else:
|
else:
|
||||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, effect.command, effect.command, TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"), ']')
|
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, effect.command, effect.command, TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"), ']')
|
||||||
|
|
||||||
if symbol == '{':
|
if symbol == '{':
|
||||||
CodeCompletionHelper.suggest_variables(TextNode)
|
CodeCompletionHelper.suggest_variables(TextNode)
|
||||||
|
|
||||||
if symbol == '=':
|
if symbol == '=':
|
||||||
if CodeCompletionHelper.get_line_untill_caret(line).ends_with('[portrait='):
|
if CodeCompletionHelper.get_line_untill_caret(line).ends_with('[portrait='):
|
||||||
var completion_character := completion_text_character_getter_regex.search(line).get_string('name')
|
var completion_character := completion_text_character_getter_regex.search(line).get_string('name')
|
||||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character, ']')
|
CodeCompletionHelper.suggest_portraits(TextNode, completion_character, ']')
|
||||||
|
|
||||||
|
|
||||||
func _get_start_code_completion(CodeCompletionHelper:Node, TextNode:TextEdit) -> void:
|
func _get_start_code_completion(CodeCompletionHelper:Node, TextNode:TextEdit) -> void:
|
||||||
CodeCompletionHelper.suggest_characters(TextNode, CodeEdit.KIND_CLASS, self)
|
CodeCompletionHelper.suggest_characters(TextNode, CodeEdit.KIND_CLASS, self)
|
||||||
|
|
||||||
|
|
||||||
func suggest_bbcode(TextNode:CodeEdit):
|
func suggest_bbcode(TextNode:CodeEdit):
|
||||||
for i in [['b (bold)', 'b'], ['i (italics)', 'i'], ['color', 'color='], ['font size','font_size=']]:
|
for i in [['b (bold)', 'b'], ['i (italics)', 'i'], ['color', 'color='], ['font size','font_size=']]:
|
||||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"),)
|
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"),)
|
||||||
TextNode.add_code_completion_option(CodeEdit.KIND_CLASS, 'end '+i[0], '/'+i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"), ']')
|
TextNode.add_code_completion_option(CodeEdit.KIND_CLASS, 'end '+i[0], '/'+i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("RichTextEffect", "EditorIcons"), ']')
|
||||||
for i in [['new event', 'n'],['new event (same box)', 'n+']]:
|
for i in [['new event', 'n'],['new event (same box)', 'n+']]:
|
||||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("ArrowRight", "EditorIcons"),)
|
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("ArrowRight", "EditorIcons"),)
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -496,56 +496,56 @@ func suggest_bbcode(TextNode:CodeEdit):
|
|||||||
var text_effects := ""
|
var text_effects := ""
|
||||||
var text_effects_regex := RegEx.new()
|
var text_effects_regex := RegEx.new()
|
||||||
func load_text_effects() -> void:
|
func load_text_effects() -> void:
|
||||||
if text_effects.is_empty():
|
if text_effects.is_empty():
|
||||||
for idx in DialogicUtil.get_indexers():
|
for idx in DialogicUtil.get_indexers():
|
||||||
for effect in idx._get_text_effects():
|
for effect in idx._get_text_effects():
|
||||||
text_effects+= effect['command']+'|'
|
text_effects+= effect['command']+'|'
|
||||||
text_effects += "b|i|u|s|code|p|center|left|right|fill|n\\+|n|indent|url|img|font|font_size|opentype_features|color|bg_color|fg_color|outline_size|outline_color|table|cell|ul|ol|lb|rb|br"
|
text_effects += "b|i|u|s|code|p|center|left|right|fill|n\\+|n|indent|url|img|font|font_size|opentype_features|color|bg_color|fg_color|outline_size|outline_color|table|cell|ul|ol|lb|rb|br"
|
||||||
if text_effects_regex.get_pattern().is_empty():
|
if text_effects_regex.get_pattern().is_empty():
|
||||||
text_effects_regex.compile("(?<!\\\\)\\[\\s*/?(?<command>"+text_effects+")\\s*(=\\s*(?<value>.+?)\\s*)?\\]")
|
text_effects_regex.compile("(?<!\\\\)\\[\\s*/?(?<command>"+text_effects+")\\s*(=\\s*(?<value>.+?)\\s*)?\\]")
|
||||||
|
|
||||||
|
|
||||||
var text_random_word_regex := RegEx.new()
|
var text_random_word_regex := RegEx.new()
|
||||||
var text_effect_color := Color('#898276')
|
var text_effect_color := Color('#898276')
|
||||||
func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, line:String) -> Dictionary:
|
func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, line:String) -> Dictionary:
|
||||||
load_text_effects()
|
load_text_effects()
|
||||||
if text_random_word_regex.get_pattern().is_empty():
|
if text_random_word_regex.get_pattern().is_empty():
|
||||||
text_random_word_regex.compile(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
|
text_random_word_regex.compile(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
|
||||||
|
|
||||||
var result := regex.search(line)
|
var result := regex.search(line)
|
||||||
if not result:
|
if not result:
|
||||||
return dict
|
return dict
|
||||||
if Highlighter.mode == Highlighter.Modes.FULL_HIGHLIGHTING:
|
if Highlighter.mode == Highlighter.Modes.FULL_HIGHLIGHTING:
|
||||||
if result.get_string('name'):
|
if result.get_string('name'):
|
||||||
dict[result.get_start('name')] = {"color":Highlighter.character_name_color}
|
dict[result.get_start('name')] = {"color":Highlighter.character_name_color}
|
||||||
dict[result.get_end('name')] = {"color":Highlighter.normal_color}
|
dict[result.get_end('name')] = {"color":Highlighter.normal_color}
|
||||||
if result.get_string('portrait'):
|
if result.get_string('portrait'):
|
||||||
dict[result.get_start('portrait')] = {"color":Highlighter.character_portrait_color}
|
dict[result.get_start('portrait')] = {"color":Highlighter.character_portrait_color}
|
||||||
dict[result.get_end('portrait')] = {"color":Highlighter.normal_color}
|
dict[result.get_end('portrait')] = {"color":Highlighter.normal_color}
|
||||||
if result.get_string('text'):
|
if result.get_string('text'):
|
||||||
|
|
||||||
## Color the random selection modifier
|
## Color the random selection modifier
|
||||||
for replace_mod_match in text_random_word_regex.search_all(result.get_string('text')):
|
for replace_mod_match in text_random_word_regex.search_all(result.get_string('text')):
|
||||||
var color: Color = Highlighter.string_color
|
var color: Color = Highlighter.string_color
|
||||||
color = color.lerp(Highlighter.normal_color, 0.4)
|
color = color.lerp(Highlighter.normal_color, 0.4)
|
||||||
dict[replace_mod_match.get_start()+result.get_start('text')] = {'color':Highlighter.string_color}
|
dict[replace_mod_match.get_start()+result.get_start('text')] = {'color':Highlighter.string_color}
|
||||||
var offset := 1
|
var offset := 1
|
||||||
for b:RegExMatch in RegEx.create_from_string(r"(\[[^\]]*\]|[^\/]|\/\/)+").search_all(replace_mod_match.get_string().trim_prefix("<").trim_suffix(">")):
|
for b:RegExMatch in RegEx.create_from_string(r"(\[[^\]]*\]|[^\/]|\/\/)+").search_all(replace_mod_match.get_string().trim_prefix("<").trim_suffix(">")):
|
||||||
color.h = wrap(color.h+0.2, 0, 1)
|
color.h = wrap(color.h+0.2, 0, 1)
|
||||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':color}
|
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':color}
|
||||||
offset += len(b.get_string())
|
offset += len(b.get_string())
|
||||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':Highlighter.string_color}
|
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':Highlighter.string_color}
|
||||||
offset += 1
|
offset += 1
|
||||||
dict[replace_mod_match.get_end()+result.get_start('text')] = {'color':Highlighter.normal_color}
|
dict[replace_mod_match.get_end()+result.get_start('text')] = {'color':Highlighter.normal_color}
|
||||||
|
|
||||||
## Color bbcode and text effects
|
## Color bbcode and text effects
|
||||||
var effects_result := text_effects_regex.search_all(line)
|
var effects_result := text_effects_regex.search_all(line)
|
||||||
for eff in effects_result:
|
for eff in effects_result:
|
||||||
var prev_color: Color = Highlighter.dict_get_color_at_column(dict, eff.get_start())
|
var prev_color: Color = Highlighter.dict_get_color_at_column(dict, eff.get_start())
|
||||||
dict[eff.get_start()] = {"color":text_effect_color.lerp(prev_color, 0.4)}
|
dict[eff.get_start()] = {"color":text_effect_color.lerp(prev_color, 0.4)}
|
||||||
dict[eff.get_end()] = {"color":prev_color}
|
dict[eff.get_end()] = {"color":prev_color}
|
||||||
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
|
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
|
||||||
|
|
||||||
return dict
|
return dict
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
[gd_resource type="StandardMaterial3D" format=3 uid="uid://dvvi1k5c5iowc"]
|
||||||
|
|
||||||
|
[ext_resource type="Texture2D" uid="uid://dlsx1mofjccib" path="res://common/assets/textures/3d_texture.png" id="1_cc1ni"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
diffuse_mode = 3
|
||||||
|
specular_mode = 2
|
||||||
|
albedo_texture = ExtResource("1_cc1ni")
|
||||||
|
roughness = 0.0
|
||||||
|
rim_tint = 0.48
|
||||||
|
stencil_flags = 2
|
||||||
|
stencil_reference = 5
|
||||||
|
stencil_outline_thickness = 0.626
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[gd_resource type="StandardMaterial3D" format=3 uid="uid://b5vlcdry8vtgi"]
|
||||||
|
|
||||||
|
[ext_resource type="Texture2D" uid="uid://dlsx1mofjccib" path="res://common/assets/textures/3d_texture.png" id="1_buts1"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
transparency = 1
|
||||||
|
depth_draw_mode = 1
|
||||||
|
albedo_color = Color(1, 1, 1, 0.79607844)
|
||||||
|
albedo_texture = ExtResource("1_buts1")
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,41 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dlsx1mofjccib"
|
||||||
|
path.s3tc="res://.godot/imported/3d_texture.png-5d7cb2d23d37985e4dc0c0bd241d8e43.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/assets/textures/3d_texture.png"
|
||||||
|
dest_files=["res://.godot/imported/3d_texture.png-5d7cb2d23d37985e4dc0c0bd241d8e43.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
|
After Width: | Height: | Size: 170 KiB |
@@ -0,0 +1,41 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dc8gajse5ti5t"
|
||||||
|
path.s3tc="res://.godot/imported/dither_texture.jpg-29df728b3fc6c30c4db6300481aaf214.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/assets/textures/dither_texture.jpg"
|
||||||
|
dest_files=["res://.godot/imported/dither_texture.jpg-29df728b3fc6c30c4db6300481aaf214.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="oggvorbisstr"
|
|
||||||
type="AudioStreamOggVorbis"
|
|
||||||
uid="uid://dadg6o6dl2k6t"
|
|
||||||
path="res://.godot/imported/ship_music.ogg-9496fd8314c31c04e252e4204e84e292.oggvorbisstr"
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://common/audio_manager/assets/morceaux/autres/ship_music.ogg"
|
|
||||||
dest_files=["res://.godot/imported/ship_music.ogg-9496fd8314c31c04e252e4204e84e292.oggvorbisstr"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
loop=false
|
|
||||||
loop_offset=0
|
|
||||||
bpm=0
|
|
||||||
beat_count=0
|
|
||||||
bar_beats=4
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="oggvorbisstr"
|
||||||
|
type="AudioStreamOggVorbis"
|
||||||
|
uid="uid://dadg6o6dl2k6t"
|
||||||
|
path="res://.godot/imported/truck_music.ogg-71e4f19f9a59a19e62e72df06380f7df.oggvorbisstr"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/audio_manager/assets/morceaux/autres/truck_music.ogg"
|
||||||
|
dest_files=["res://.godot/imported/truck_music.ogg-71e4f19f9a59a19e62e72df06380f7df.oggvorbisstr"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
loop=false
|
||||||
|
loop_offset=0
|
||||||
|
bpm=0
|
||||||
|
beat_count=0
|
||||||
|
bar_beats=4
|
||||||
@@ -18,7 +18,7 @@ force/max_rate=false
|
|||||||
force/max_rate_hz=44100
|
force/max_rate_hz=44100
|
||||||
edit/trim=false
|
edit/trim=false
|
||||||
edit/normalize=false
|
edit/normalize=false
|
||||||
edit/loop_mode=0
|
edit/loop_mode=2
|
||||||
edit/loop_begin=0
|
edit/loop_begin=0
|
||||||
edit/loop_end=-1
|
edit/loop_end=-1
|
||||||
compress/mode=2
|
compress/mode=2
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="mp3"
|
||||||
|
type="AudioStreamMP3"
|
||||||
|
uid="uid://c5y70k3codtn"
|
||||||
|
path="res://.godot/imported/signal.mp3-2f41c9334233d52845bfe384d47f2a96.mp3str"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/audio_manager/assets/sfx/signal/signal.mp3"
|
||||||
|
dest_files=["res://.godot/imported/signal.mp3-2f41c9334233d52845bfe384d47f2a96.mp3str"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
loop=false
|
||||||
|
loop_offset=0
|
||||||
|
bpm=0
|
||||||
|
beat_count=0
|
||||||
|
bar_beats=4
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
[gd_scene load_steps=35 format=3 uid="uid://b6hscxcrj065q"]
|
[gd_scene format=3 uid="uid://b6hscxcrj065q"]
|
||||||
|
|
||||||
[ext_resource type="Script" uid="uid://2p5d6vogtn82" path="res://common/audio_manager/scripts/audio_manager.gd" id="1_0tvca"]
|
[ext_resource type="Script" uid="uid://2p5d6vogtn82" path="res://common/audio_manager/scripts/audio_manager.gd" id="1_0tvca"]
|
||||||
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_a4u5m"]
|
[ext_resource type="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_tuvql"]
|
||||||
[ext_resource type="AudioStream" uid="uid://bm0tdi6bd2e65" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_2.ogg" id="3_8nsyr"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://dftxjfdqgsbd3" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_3.ogg" id="4_athui"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://dcbuhtc085q2x" path="res://common/audio_manager/assets/morceaux/niveau_v2/mines_phase_1.ogg" id="5_ajci6"]
|
[ext_resource type="AudioStream" uid="uid://dcbuhtc085q2x" path="res://common/audio_manager/assets/morceaux/niveau_v2/mines_phase_1.ogg" id="5_ajci6"]
|
||||||
[ext_resource type="AudioStream" uid="uid://bqwiaek5b5q00" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_2.ogg" id="6_ldyhq"]
|
[ext_resource type="AudioStream" uid="uid://bqwiaek5b5q00" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_2.ogg" id="6_ldyhq"]
|
||||||
[ext_resource type="AudioStream" uid="uid://d4lqhgf0lhgge" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_3.ogg" id="7_ol34x"]
|
[ext_resource type="AudioStream" uid="uid://d4lqhgf0lhgge" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_3.ogg" id="7_ol34x"]
|
||||||
[ext_resource type="AudioStream" uid="uid://brtjlgjqnrvcb" path="res://common/audio_manager/assets/morceaux/autres/truck_music.ogg" id="8_0e5ja"]
|
[ext_resource type="AudioStream" uid="uid://bpf6witukorka" path="res://common/audio_manager/assets/morceaux/autres/main_menu.ogg" id="7_tuvql"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://dadg6o6dl2k6t" path="res://common/audio_manager/assets/morceaux/autres/truck_music.ogg" id="8_0e5ja"]
|
||||||
[ext_resource type="AudioStream" uid="uid://bnxsnege8qq6e" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_4.ogg" id="8_ajci6"]
|
[ext_resource type="AudioStream" uid="uid://bnxsnege8qq6e" path="res://common/audio_manager/assets/morceaux/niveau/forest_phase_4.ogg" id="8_ajci6"]
|
||||||
[ext_resource type="AudioStream" uid="uid://dfrp66a4isnt6" path="res://common/audio_manager/assets/sfx/dig/dig_1.wav" id="9_gv65y"]
|
[ext_resource type="AudioStream" uid="uid://dfrp66a4isnt6" path="res://common/audio_manager/assets/sfx/dig/dig_1.wav" id="9_gv65y"]
|
||||||
[ext_resource type="AudioStream" uid="uid://bdxkvaciw4mb3" path="res://common/audio_manager/assets/sfx/dig/dig_2.wav" id="10_n7o7n"]
|
[ext_resource type="AudioStream" uid="uid://bdxkvaciw4mb3" path="res://common/audio_manager/assets/sfx/dig/dig_2.wav" id="10_n7o7n"]
|
||||||
[ext_resource type="AudioStream" uid="uid://llxrlwfccywb" path="res://common/audio_manager/assets/sfx/dig/dig_3.wav" id="11_wtvls"]
|
[ext_resource type="AudioStream" uid="uid://llxrlwfccywb" path="res://common/audio_manager/assets/sfx/dig/dig_3.wav" id="11_wtvls"]
|
||||||
[ext_resource type="AudioStream" uid="uid://b8inedx4yjslw" path="res://common/audio_manager/assets/sfx/drop/drop_1.wav" id="12_4hp8f"]
|
[ext_resource type="AudioStream" uid="uid://b8inedx4yjslw" path="res://common/audio_manager/assets/sfx/drop/drop_1.wav" id="12_4hp8f"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://c5y70k3codtn" path="res://common/audio_manager/assets/sfx/signal/signal.mp3" id="12_ajci6"]
|
||||||
[ext_resource type="AudioStream" uid="uid://8nmr5vifkt1f" path="res://common/audio_manager/assets/sfx/harvest/harvest_1.wav" id="13_xoaox"]
|
[ext_resource type="AudioStream" uid="uid://8nmr5vifkt1f" path="res://common/audio_manager/assets/sfx/harvest/harvest_1.wav" id="13_xoaox"]
|
||||||
[ext_resource type="AudioStream" uid="uid://dgkdcq4j6fe3o" path="res://common/audio_manager/assets/sfx/harvest/harvest_2.wav" id="14_b5bgj"]
|
[ext_resource type="AudioStream" uid="uid://dgkdcq4j6fe3o" path="res://common/audio_manager/assets/sfx/harvest/harvest_2.wav" id="14_b5bgj"]
|
||||||
[ext_resource type="AudioStream" uid="uid://eh3dbuxu5qtw" path="res://common/audio_manager/assets/sfx/harvest/harvest_3.wav" id="15_ynvb4"]
|
[ext_resource type="AudioStream" uid="uid://eh3dbuxu5qtw" path="res://common/audio_manager/assets/sfx/harvest/harvest_3.wav" id="15_ynvb4"]
|
||||||
@@ -23,17 +23,6 @@
|
|||||||
[ext_resource type="AudioStream" uid="uid://cqa0gvgpoa7pd" path="res://common/audio_manager/assets/sfx/pick_up/pick_up_2.wav" id="21_dk5s6"]
|
[ext_resource type="AudioStream" uid="uid://cqa0gvgpoa7pd" path="res://common/audio_manager/assets/sfx/pick_up/pick_up_2.wav" id="21_dk5s6"]
|
||||||
[ext_resource type="AudioStream" uid="uid://d1cpi438ep0ys" path="res://common/audio_manager/assets/sfx/announce/annnounce.wav" id="22_btfwx"]
|
[ext_resource type="AudioStream" uid="uid://d1cpi438ep0ys" path="res://common/audio_manager/assets/sfx/announce/annnounce.wav" id="22_btfwx"]
|
||||||
[ext_resource type="AudioStream" uid="uid://ccq04ahrwr3bv" path="res://common/audio_manager/assets/sfx/alarm/alarm.wav" id="23_fwu3w"]
|
[ext_resource type="AudioStream" uid="uid://ccq04ahrwr3bv" path="res://common/audio_manager/assets/sfx/alarm/alarm.wav" id="23_fwu3w"]
|
||||||
[ext_resource type="AudioStream" uid="uid://ctfaxvblcg5lc" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_1.wav" id="24_tq535"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://c1dnklmka2ccn" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_2.wav" id="25_ywn7s"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://dd1uu6dd6sloe" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_3.wav" id="26_xhon7"]
|
|
||||||
[ext_resource type="AudioStream" uid="uid://eq7wufwnolto" path="res://common/audio_manager/assets/sfx/pickaxe/pickaxe_4.wav" id="27_3jg6d"]
|
|
||||||
|
|
||||||
[sub_resource type="AudioStreamPlaylist" id="AudioStreamPlaylist_8204s"]
|
|
||||||
stream_count = 4
|
|
||||||
stream_0 = ExtResource("2_a4u5m")
|
|
||||||
stream_1 = ExtResource("2_a4u5m")
|
|
||||||
stream_2 = ExtResource("3_8nsyr")
|
|
||||||
stream_3 = ExtResource("4_athui")
|
|
||||||
|
|
||||||
[sub_resource type="AudioStreamPlaylist" id="AudioStreamPlaylist_ajci6"]
|
[sub_resource type="AudioStreamPlaylist" id="AudioStreamPlaylist_ajci6"]
|
||||||
stream_count = 4
|
stream_count = 4
|
||||||
@@ -48,6 +37,11 @@ stream_0/stream = ExtResource("9_gv65y")
|
|||||||
stream_1/stream = ExtResource("10_n7o7n")
|
stream_1/stream = ExtResource("10_n7o7n")
|
||||||
stream_2/stream = ExtResource("11_wtvls")
|
stream_2/stream = ExtResource("11_wtvls")
|
||||||
|
|
||||||
|
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_8204s"]
|
||||||
|
random_pitch = 1.0594631
|
||||||
|
streams_count = 1
|
||||||
|
stream_0/stream = ExtResource("12_ajci6")
|
||||||
|
|
||||||
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_1w04j"]
|
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_1w04j"]
|
||||||
random_pitch = 1.2
|
random_pitch = 1.2
|
||||||
streams_count = 1
|
streams_count = 1
|
||||||
@@ -68,64 +62,55 @@ streams_count = 2
|
|||||||
stream_0/stream = ExtResource("20_pu6t4")
|
stream_0/stream = ExtResource("20_pu6t4")
|
||||||
stream_1/stream = ExtResource("21_dk5s6")
|
stream_1/stream = ExtResource("21_dk5s6")
|
||||||
|
|
||||||
[sub_resource type="AudioStreamRandomizer" id="AudioStreamRandomizer_dhq5t"]
|
[node name="AudioManager" type="Node" unique_id=1871137180]
|
||||||
random_pitch = 1.5
|
|
||||||
streams_count = 4
|
|
||||||
stream_0/stream = ExtResource("24_tq535")
|
|
||||||
stream_1/stream = ExtResource("25_ywn7s")
|
|
||||||
stream_2/stream = ExtResource("26_xhon7")
|
|
||||||
stream_3/stream = ExtResource("27_3jg6d")
|
|
||||||
|
|
||||||
[node name="AudioManager" type="Node" node_paths=PackedStringArray("playing_soundtracks")]
|
|
||||||
process_mode = 3
|
process_mode = 3
|
||||||
script = ExtResource("1_0tvca")
|
script = ExtResource("1_0tvca")
|
||||||
default_fade_time = 2.0
|
|
||||||
garden_phases_scores = Array[int]([0, 10, 30])
|
|
||||||
playing_soundtracks = [NodePath("Ambiance/Default")]
|
|
||||||
|
|
||||||
[node name="Ambiance" type="Node" parent="."]
|
[node name="Ambiance" type="Node" parent="." unique_id=1989991562]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
[node name="Default" type="AudioStreamPlayer" parent="Ambiance"]
|
[node name="Exterior" type="AudioStreamPlayer" parent="Ambiance" unique_id=1405716780]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
stream = SubResource("AudioStreamPlaylist_8204s")
|
stream = ExtResource("2_tuvql")
|
||||||
autoplay = true
|
|
||||||
|
|
||||||
[node name="Musics" type="Node" parent="."]
|
[node name="Musics" type="Node" parent="." unique_id=1450527710]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
[node name="Planet" type="AudioStreamPlayer" parent="Musics"]
|
[node name="Region" type="AudioStreamPlayer" parent="Musics" unique_id=1029114070]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
stream = SubResource("AudioStreamPlaylist_ajci6")
|
stream = SubResource("AudioStreamPlaylist_ajci6")
|
||||||
autoplay = true
|
|
||||||
|
|
||||||
[node name="Truck" type="AudioStreamPlayer" parent="Musics"]
|
[node name="Title" type="AudioStreamPlayer" parent="Musics" unique_id=2105759422]
|
||||||
|
unique_name_in_owner = true
|
||||||
|
stream = ExtResource("7_tuvql")
|
||||||
|
bus = &"Music"
|
||||||
|
|
||||||
|
[node name="Truck" type="AudioStreamPlayer" parent="Musics" unique_id=1165150318]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
stream = ExtResource("8_0e5ja")
|
stream = ExtResource("8_0e5ja")
|
||||||
autoplay = true
|
|
||||||
|
|
||||||
[node name="Sfx" type="Node" parent="."]
|
[node name="Sfx" type="Node" parent="." unique_id=2023641207]
|
||||||
unique_name_in_owner = true
|
unique_name_in_owner = true
|
||||||
|
|
||||||
[node name="Dig" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="Dig" type="AudioStreamPlayer" parent="Sfx" unique_id=486042600]
|
||||||
stream = SubResource("AudioStreamRandomizer_kfbah")
|
stream = SubResource("AudioStreamRandomizer_kfbah")
|
||||||
|
|
||||||
[node name="Drop" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="Signal" type="AudioStreamPlayer" parent="Sfx" unique_id=641246368]
|
||||||
|
stream = SubResource("AudioStreamRandomizer_8204s")
|
||||||
|
|
||||||
|
[node name="Drop" type="AudioStreamPlayer" parent="Sfx" unique_id=1391500830]
|
||||||
stream = SubResource("AudioStreamRandomizer_1w04j")
|
stream = SubResource("AudioStreamRandomizer_1w04j")
|
||||||
|
|
||||||
[node name="Harvest" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="Harvest" type="AudioStreamPlayer" parent="Sfx" unique_id=345539331]
|
||||||
stream = SubResource("AudioStreamRandomizer_i4m0x")
|
stream = SubResource("AudioStreamRandomizer_i4m0x")
|
||||||
|
|
||||||
[node name="PickUp" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="PickUp" type="AudioStreamPlayer" parent="Sfx" unique_id=176915166]
|
||||||
stream = SubResource("AudioStreamRandomizer_jjdv2")
|
stream = SubResource("AudioStreamRandomizer_jjdv2")
|
||||||
volume_db = -10.0
|
volume_db = -10.0
|
||||||
|
|
||||||
[node name="Announce" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="Announce" type="AudioStreamPlayer" parent="Sfx" unique_id=876644323]
|
||||||
stream = ExtResource("22_btfwx")
|
stream = ExtResource("22_btfwx")
|
||||||
volume_db = 8.627
|
volume_db = 8.627
|
||||||
|
|
||||||
[node name="Alarm" type="AudioStreamPlayer" parent="Sfx"]
|
[node name="Alarm" type="AudioStreamPlayer" parent="Sfx" unique_id=689347925]
|
||||||
stream = ExtResource("23_fwu3w")
|
stream = ExtResource("23_fwu3w")
|
||||||
|
|
||||||
[node name="Pickaxe" type="AudioStreamPlayer" parent="Sfx"]
|
|
||||||
stream = SubResource("AudioStreamRandomizer_dhq5t")
|
|
||||||
|
|||||||
@@ -3,136 +3,202 @@ extends Node
|
|||||||
const MIN_VOLUME = -60.
|
const MIN_VOLUME = -60.
|
||||||
const MAX_VOLUME = 24.
|
const MAX_VOLUME = 24.
|
||||||
|
|
||||||
@onready var settings : SettingsData = GameInfo.game_data.settings
|
const DEFAULT_FADE_TIME : float = 0.5
|
||||||
|
|
||||||
@export var default_fade_time = 1.0
|
@onready var settings : SettingsData = GameInfo.settings_data
|
||||||
|
|
||||||
@export var garden_phase = 0
|
|
||||||
@export var garden_phases_scores : Array[int]
|
|
||||||
|
|
||||||
@export var playing_soundtracks : Array[AudioStreamPlayer] = []
|
var music_action : AudioAction
|
||||||
|
var ambiance_action : AudioAction
|
||||||
|
var playing_music : AudioStreamPlayer = null
|
||||||
|
var playing_ambiance : AudioStreamPlayer = null
|
||||||
|
|
||||||
var default_volumes := {}
|
var default_volumes := {}
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
GameInfo.game_data.current_planet_data_updated.connect(_on_current_planet_data_updated)
|
for player in get_all_players():
|
||||||
fetch_default_volumes()
|
player.stop()
|
||||||
setup_volume()
|
|
||||||
settings.sound_changed.connect(
|
fetch_default_volumes()
|
||||||
func(_s) : setup_volume()
|
# setup_players_bus()
|
||||||
)
|
settings.sound_changed.connect(
|
||||||
for player in get_all_soundtrack_players():
|
func(_s) : setup_players_bus()
|
||||||
player.play()
|
)
|
||||||
|
SceneManager.scene_loaded.connect(_on_change_scene)
|
||||||
|
Dialogic.timeline_started.connect(_on_timeline_started)
|
||||||
|
Dialogic.timeline_ended.connect(_on_timeline_ended)
|
||||||
|
|
||||||
|
func _process(_d):
|
||||||
|
if music_action:
|
||||||
|
playing_music = process_audio_action(
|
||||||
|
music_action,
|
||||||
|
%Musics,
|
||||||
|
playing_music
|
||||||
|
)
|
||||||
|
music_action = null
|
||||||
|
|
||||||
|
if ambiance_action:
|
||||||
|
playing_ambiance = process_audio_action(
|
||||||
|
ambiance_action,
|
||||||
|
%Ambiance,
|
||||||
|
playing_ambiance
|
||||||
|
)
|
||||||
|
ambiance_action = null
|
||||||
|
|
||||||
|
func process_audio_action(
|
||||||
|
audio_action : AudioAction,
|
||||||
|
player_search_node: Node,
|
||||||
|
current_player: AudioStreamPlayer = null
|
||||||
|
) -> AudioStreamPlayer:
|
||||||
|
if audio_action is AudioLaunch:
|
||||||
|
return process_audio_launch(audio_action, player_search_node, current_player)
|
||||||
|
elif audio_action is AudioStop and current_player and current_player.playing:
|
||||||
|
stop_player(current_player)
|
||||||
|
|
||||||
|
return null
|
||||||
|
|
||||||
|
func process_audio_launch(
|
||||||
|
audio_launch : AudioLaunch,
|
||||||
|
player_search_node: Node,
|
||||||
|
current_player: AudioStreamPlayer = null,
|
||||||
|
) -> AudioStreamPlayer:
|
||||||
|
var player = player_search_node.find_child(audio_launch.player_name)
|
||||||
|
if not player:
|
||||||
|
printerr("Player %s not found in category %s" % [audio_launch.player_name, player_search_node.name])
|
||||||
|
return null
|
||||||
|
if current_player and current_player.playing and current_player.name == audio_launch.player_name:
|
||||||
|
return current_player
|
||||||
|
elif current_player:
|
||||||
|
stop_player(current_player)
|
||||||
|
|
||||||
|
start_player(player, audio_launch.from_random_time, audio_launch.fade_time)
|
||||||
|
return player
|
||||||
|
|
||||||
|
func _on_change_scene(scene : Scene):
|
||||||
|
stop_ambiance()
|
||||||
|
|
||||||
|
match scene.scene_id:
|
||||||
|
"TITLE":
|
||||||
|
play_music("Title", false, 0.0)
|
||||||
|
"REGION":
|
||||||
|
play_music("Region", true)
|
||||||
|
play_ambiance("Exterior", true)
|
||||||
|
"COCKPIT":
|
||||||
|
play_music("Truck", true)
|
||||||
|
|
||||||
|
func _on_timeline_started():
|
||||||
|
var timeline_name = Dialogic.current_timeline.resource_path.split("/")[-1].trim_suffix(".dtl")
|
||||||
|
# Timeline name et le nom du fichier de timeline, par exemple demeter_intro
|
||||||
|
# Amuse toi Nilou ;)
|
||||||
|
|
||||||
|
func _on_timeline_ended():
|
||||||
|
_on_change_scene(SceneManager.actual_scene)
|
||||||
|
|
||||||
|
func play_music(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME):
|
||||||
|
music_action = AudioLaunch.new(
|
||||||
|
player_name,
|
||||||
|
from_random_time,
|
||||||
|
fade_time
|
||||||
|
)
|
||||||
|
|
||||||
|
func stop_music():
|
||||||
|
music_action = AudioStop.new()
|
||||||
|
|
||||||
|
func play_ambiance(player_name : String = "", from_random_time := false, fade_time := DEFAULT_FADE_TIME):
|
||||||
|
ambiance_action = AudioLaunch.new(
|
||||||
|
player_name,
|
||||||
|
from_random_time,
|
||||||
|
fade_time
|
||||||
|
)
|
||||||
|
|
||||||
|
func stop_ambiance():
|
||||||
|
ambiance_action = AudioStop.new()
|
||||||
|
|
||||||
func fetch_default_volumes():
|
func fetch_default_volumes():
|
||||||
var all_players := get_all_soundtrack_players()
|
var all_players := get_all_players()
|
||||||
all_players.append_array(get_all_sfx_players())
|
|
||||||
|
|
||||||
for player in all_players:
|
for player in all_players:
|
||||||
default_volumes[player] = player.volume_db
|
default_volumes[player] = player.volume_db
|
||||||
|
|
||||||
func setup_volume():
|
func setup_players_bus():
|
||||||
for player in get_all_soundtrack_players():
|
for player in get_all_players():
|
||||||
player.volume_db = get_volume_from_parent(player) if (
|
if player.get_parent() == %Musics:
|
||||||
playing_soundtracks.find(player) != -1
|
player.bus = (AudioServer.get_bus_name(SettingsData.MUSIC_BUS_ID))
|
||||||
) else MIN_VOLUME
|
elif player.get_parent() == %Sfx:
|
||||||
setup_phase(player)
|
player.bus = (AudioServer.get_bus_name(SettingsData.SFX_BUS_ID))
|
||||||
for player in get_all_sfx_players():
|
elif player.get_parent() == %Ambiance:
|
||||||
player.volume_db = get_volume_from_parent(player)
|
player.bus = (AudioServer.get_bus_name(SettingsData.AMBIANCE_BUS_ID))
|
||||||
|
|
||||||
func get_volume_from_parent(player : AudioStreamPlayer) -> float:
|
func get_volume(player : AudioStreamPlayer) -> float:
|
||||||
var settings_volume = 0.5
|
return default_volumes[player]
|
||||||
|
|
||||||
if player.get_parent() == %Ambiance:
|
func get_all_players() -> Array[AudioStreamPlayer]:
|
||||||
settings_volume = settings.ambiance_volume
|
var players : Array[AudioStreamPlayer] = []
|
||||||
elif player.get_parent() == %Sfx:
|
players.append_array(get_players_from_node(%Musics))
|
||||||
settings_volume = settings.sfx_volume
|
players.append_array(get_players_from_node(%Ambiance))
|
||||||
elif player.get_parent() == %Musics:
|
players.append_array(get_players_from_node(%Sfx))
|
||||||
settings_volume = settings.music_volume
|
|
||||||
|
|
||||||
return default_volumes[player] + lerp(MIN_VOLUME, MAX_VOLUME, settings_volume)
|
|
||||||
|
|
||||||
func update_phase():
|
return players
|
||||||
for player in get_all_soundtrack_players():
|
|
||||||
var playing : bool = player.volume_db != MIN_VOLUME
|
|
||||||
if playing:
|
|
||||||
await set_volume(player, MIN_VOLUME).finished
|
|
||||||
setup_phase(player)
|
|
||||||
if playing:
|
|
||||||
set_volume(player, get_volume_from_parent(player))
|
|
||||||
|
|
||||||
func get_all_soundtrack_players() -> Array[AudioStreamPlayer]:
|
|
||||||
var players : Array[AudioStreamPlayer] = []
|
|
||||||
players.append_array(get_players_from_node(%Musics))
|
|
||||||
players.append_array(get_players_from_node(%Ambiance))
|
|
||||||
|
|
||||||
return players
|
|
||||||
|
|
||||||
func get_all_sfx_players() -> Array[AudioStreamPlayer]:
|
|
||||||
return get_players_from_node(%Sfx)
|
|
||||||
|
|
||||||
func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]:
|
func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]:
|
||||||
var streams : Array[AudioStreamPlayer] = []
|
var streams : Array[AudioStreamPlayer] = []
|
||||||
|
|
||||||
for c in node.get_children():
|
for c in node.get_children():
|
||||||
if c is AudioStreamPlayer:
|
if c is AudioStreamPlayer:
|
||||||
streams.append(c)
|
streams.append(c)
|
||||||
return streams
|
return streams
|
||||||
|
|
||||||
|
func set_volume(player : AudioStreamPlayer, to : float, fade_time := 0.0) -> Tween:
|
||||||
|
var fade_tween : Tween = get_tree().create_tween()
|
||||||
|
|
||||||
|
fade_tween.tween_property(player, "volume_db", to, fade_time)
|
||||||
|
|
||||||
|
return fade_tween
|
||||||
|
|
||||||
|
func start_player(player: AudioStreamPlayer, from_random_time = false, fade_time = DEFAULT_FADE_TIME):
|
||||||
|
if player and not player.playing:
|
||||||
|
player.play(
|
||||||
|
0.0 if not from_random_time
|
||||||
|
else randf_range(0.0, player.stream.get_length())
|
||||||
|
)
|
||||||
|
if fade_time > 0.0:
|
||||||
|
player.volume_db = MIN_VOLUME
|
||||||
|
await set_volume(player, get_volume(player), fade_time).finished
|
||||||
|
|
||||||
|
func stop_player(player : AudioStreamPlayer, fade_time = DEFAULT_FADE_TIME):
|
||||||
|
if player and player.playing:
|
||||||
|
if fade_time > 0.0:
|
||||||
|
await set_volume(player, MIN_VOLUME, fade_time).finished
|
||||||
|
player.stop()
|
||||||
|
player.volume_db = get_volume(player)
|
||||||
|
|
||||||
|
func reset_volume(player : AudioStreamPlayer):
|
||||||
|
player.volume_db = get_volume(player)
|
||||||
|
|
||||||
|
func play_sfx(sfx_name : String):
|
||||||
|
var player := %Sfx.find_child(sfx_name) as AudioStreamPlayer
|
||||||
|
if player:
|
||||||
|
player.play()
|
||||||
|
else:
|
||||||
|
printerr("Sfx %s not found" % sfx_name)
|
||||||
|
|
||||||
|
class AudioAction:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class AudioLaunch extends AudioAction:
|
||||||
|
var player_name : String
|
||||||
|
var from_random_time : bool
|
||||||
|
var fade_time : float
|
||||||
|
|
||||||
|
func _init(
|
||||||
|
_player_name : String,
|
||||||
|
_from_random_time := false,
|
||||||
|
_fade_time := DEFAULT_FADE_TIME,
|
||||||
|
):
|
||||||
|
player_name = _player_name
|
||||||
|
from_random_time = _from_random_time
|
||||||
|
fade_time = _fade_time
|
||||||
|
|
||||||
|
|
||||||
func _on_current_planet_data_updated(planet_data : PlanetData):
|
class AudioStop extends AudioAction:
|
||||||
if planet_data:
|
pass
|
||||||
update_garden_phase(planet_data)
|
|
||||||
planet_data.updated.connect(update_garden_phase)
|
|
||||||
|
|
||||||
func update_garden_phase(planet_data : PlanetData):
|
|
||||||
var phase : int = garden_phase
|
|
||||||
for i in range(len(garden_phases_scores)):
|
|
||||||
if planet_data.garden_score >= garden_phases_scores[i] and i > garden_phase:
|
|
||||||
phase = i
|
|
||||||
|
|
||||||
if garden_phase != phase:
|
|
||||||
update_phase()
|
|
||||||
|
|
||||||
garden_phase = phase
|
|
||||||
|
|
||||||
func enter_planet():
|
|
||||||
play_music(%Planet, true)
|
|
||||||
stop_music(%Truck, true)
|
|
||||||
|
|
||||||
func enter_truck():
|
|
||||||
play_music(%Truck, true)
|
|
||||||
stop_music(%Planet, true)
|
|
||||||
|
|
||||||
func stop_music(music : AudioStreamPlayer, with_fade = false):
|
|
||||||
if playing_soundtracks.find(music) != -1:
|
|
||||||
playing_soundtracks.remove_at(playing_soundtracks.find(music))
|
|
||||||
set_volume(music, MIN_VOLUME, with_fade)
|
|
||||||
|
|
||||||
func play_music(player : AudioStreamPlayer, with_fade = false):
|
|
||||||
playing_soundtracks.append(player)
|
|
||||||
set_volume(player, get_volume_from_parent(player), with_fade)
|
|
||||||
|
|
||||||
func setup_phase(music : AudioStreamPlayer):
|
|
||||||
if music.stream is AudioStreamSynchronized:
|
|
||||||
var sync_stream = music.stream as AudioStreamSynchronized
|
|
||||||
var phase_stream_id = min(garden_phase, sync_stream.stream_count - 1)
|
|
||||||
for i in range(sync_stream.stream_count):
|
|
||||||
sync_stream.set_sync_stream_volume(
|
|
||||||
i,
|
|
||||||
0. if i == phase_stream_id else MIN_VOLUME
|
|
||||||
)
|
|
||||||
|
|
||||||
func set_volume(music : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween:
|
|
||||||
var fade_tween : Tween = get_tree().create_tween()
|
|
||||||
|
|
||||||
fade_tween.tween_property(music, "volume_db", to, fade_time)
|
|
||||||
|
|
||||||
return fade_tween
|
|
||||||
|
|
||||||
func play_sfx(name : String):
|
|
||||||
var player := %Sfx.find_child(name) as AudioStreamPlayer
|
|
||||||
if player:
|
|
||||||
player.play()
|
|
||||||
else:
|
|
||||||
printerr("Sfx %s not found" % name)
|
|
||||||
|
|||||||
@@ -1,100 +1,58 @@
|
|||||||
extends Resource
|
extends Resource
|
||||||
class_name GameData
|
class_name GameData
|
||||||
|
|
||||||
signal current_planet_data_updated(p : PlanetData)
|
signal current_region_data_updated(p : RegionData)
|
||||||
|
|
||||||
func _init():
|
@export var current_run : RunData = null
|
||||||
set_default_unlocked()
|
|
||||||
|
@export var current_region_data : RegionData = null
|
||||||
|
|
||||||
|
@export var player_data : PlayerData = PlayerData.new()
|
||||||
|
|
||||||
|
@export var max_mutations_by_plant : int = 2
|
||||||
|
|
||||||
|
@export var last_game_scene : Scene = null
|
||||||
|
|
||||||
|
@export var ship_in_space = false
|
||||||
|
|
||||||
@export var tutorial_done = false
|
@export var tutorial_done = false
|
||||||
|
|
||||||
@export var settings : SettingsData = SettingsData.new()
|
@export var incubator_used = []
|
||||||
|
|
||||||
@export var current_run : RunData = RunData.new()
|
@export var dialogs_done : Array[String] = [] #Chemin des dialogues démarrés
|
||||||
|
|
||||||
@export var current_planet_data : PlanetData : get = get_current_planet_data
|
func start_run():
|
||||||
|
player_data.inventory.clear_items()
|
||||||
@export var player_data : PlayerData = PlayerData.new()
|
current_run = RunData.new()
|
||||||
|
current_run.current_run_point_changed.connect(
|
||||||
@export var unlocked_plant_types : Array[PlantType] = []
|
func(rp : RunPoint):
|
||||||
@export var unlocked_plant_mutations : Array[PlantMutation] = []
|
start_region(rp.region_parameter)
|
||||||
@export var unlocked_machines : Array[MachineType] = []
|
)
|
||||||
|
|
||||||
@export var truck_data : TruckData = TruckData.new()
|
|
||||||
|
|
||||||
func _ready():
|
|
||||||
current_run.run_point_changed.connect(
|
|
||||||
func(): current_planet_data_updated.emit(get_current_planet_data)
|
|
||||||
)
|
|
||||||
|
|
||||||
func set_default_unlocked():
|
|
||||||
unlocked_plant_types = all_plant_types()
|
|
||||||
unlocked_plant_mutations = all_plant_mutations()
|
|
||||||
unlocked_machines = all_machines()
|
|
||||||
|
|
||||||
func reset_run():
|
|
||||||
current_run = RunData.new()
|
|
||||||
current_planet_data_updated.emit()
|
|
||||||
|
|
||||||
func reset_player():
|
func reset_player():
|
||||||
player_data = PlayerData.new()
|
player_data = PlayerData.new()
|
||||||
|
|
||||||
func reset_truck():
|
|
||||||
truck_data = TruckData.new()
|
|
||||||
|
|
||||||
func reset_all():
|
func reset_all():
|
||||||
reset_run()
|
start_run()
|
||||||
reset_player()
|
reset_player()
|
||||||
reset_truck()
|
|
||||||
|
|
||||||
unlocked_plant_types = []
|
func start_region(region_param : RegionParameter):
|
||||||
|
current_region_data = RegionData.new(region_param)
|
||||||
|
current_region_data_updated.emit(current_region_data)
|
||||||
|
GameInfo.save_game_data()
|
||||||
|
|
||||||
func unlock_plant_type(new_plant_type : PlantType):
|
func give_up():
|
||||||
if not is_plant_type_unlocked(new_plant_type):
|
current_region_data = null
|
||||||
unlocked_plant_types.append(new_plant_type.duplicate_deep())
|
current_run = null
|
||||||
|
|
||||||
func get_locked_plant_types() -> Array[PlantType]:
|
func start_tutorial():
|
||||||
var locked_plant_type : Array[PlantType] = []
|
current_region_data = RegionData.new(
|
||||||
|
RegionParameter.new(
|
||||||
for pt in GameInfo.game_data.all_plant_types():
|
10,
|
||||||
if not is_plant_type_unlocked(pt):
|
3,
|
||||||
locked_plant_type.append(pt)
|
tr("TUTORIAL"),
|
||||||
|
true,
|
||||||
return locked_plant_type
|
0,
|
||||||
|
randi()
|
||||||
func get_current_planet_data():
|
)
|
||||||
return current_run.get_current_planet_data()
|
)
|
||||||
|
|
||||||
func is_plant_type_unlocked(new_plant_type : PlantType):
|
|
||||||
return unlocked_plant_types.find_custom(
|
|
||||||
func (upt : PlantType): return new_plant_type.name == upt.name
|
|
||||||
) != -1
|
|
||||||
|
|
||||||
|
|
||||||
func all_plant_types() -> Array[PlantType]:
|
|
||||||
return [
|
|
||||||
preload("res://entities/plants/resources/plant_types/champ.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/chardi.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/ferno.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/maias.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/philea.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/pili.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_types/solita.tres"),
|
|
||||||
]
|
|
||||||
|
|
||||||
func all_machines() -> Array[MachineType]:
|
|
||||||
return [
|
|
||||||
preload("res://entities/interactables/machines/solar_pannel/solar_pannel.tres"),
|
|
||||||
]
|
|
||||||
|
|
||||||
func all_plant_mutations() -> Array[PlantMutation]:
|
|
||||||
return [
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/ancient_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/elitist_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/ermit_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/precocious_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/quality_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/quick_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/sociable_mutation.tres"),
|
|
||||||
preload("res://entities/plants/resources/plant_mutations/strong_mutation.tres"),
|
|
||||||
]
|
|
||||||
@@ -1,22 +1,27 @@
|
|||||||
extends Resource
|
extends Resource
|
||||||
class_name RunData
|
class_name RunData
|
||||||
|
|
||||||
const RUN_POINT_POSITION_DERIVATION = 70
|
enum State {STARTED, IN_PROGRESS, FINISHED}
|
||||||
const DIFFICULTY_INCREASE_BY_LEVEL = 1
|
|
||||||
const RUN_POINTS_NEXT_NUMBER :Array[int] = [2,3]
|
|
||||||
const RUN_POINT_MAX_LEVEL = 10
|
|
||||||
|
|
||||||
signal run_point_changed
|
const RUN_POINT_POSITION_DERIVATION = 100
|
||||||
|
const DIFFICULTY_INCREASE_BY_LEVEL = 1
|
||||||
|
const RUN_POINTS_NEXT_NUMBER :Array[int] = [2]
|
||||||
|
const RUN_POINT_MAX_LEVEL = 6
|
||||||
|
|
||||||
|
signal current_run_point_changed
|
||||||
|
|
||||||
var run_seed = randi()
|
var run_seed = randi()
|
||||||
@export var next_run_points : Array[RunPoint] = [generate_first_run_point()]
|
@export var next_run_points : Array[RunPoint] = [generate_first_run_point()]
|
||||||
@export var current_run_point : RunPoint = null
|
@export var current_run_point : RunPoint = null :
|
||||||
|
set(v):
|
||||||
|
current_run_point = v
|
||||||
|
current_run_point_changed.emit(v)
|
||||||
@export var visited_run_points : Array[RunPoint] = []
|
@export var visited_run_points : Array[RunPoint] = []
|
||||||
|
|
||||||
#region ------------------ Generation ------------------
|
#region ------------------ Generation ------------------
|
||||||
|
|
||||||
func generate_first_run_point() -> RunPoint:
|
func generate_first_run_point() -> RunPoint:
|
||||||
return RunPoint.new(0, PlanetParameter.new())
|
return RunPoint.new(0, RegionParameter.new())
|
||||||
|
|
||||||
func generate_next_run_points(run_point : RunPoint) -> Array[RunPoint]:
|
func generate_next_run_points(run_point : RunPoint) -> Array[RunPoint]:
|
||||||
var nb_next_run_points = RUN_POINTS_NEXT_NUMBER.pick_random()
|
var nb_next_run_points = RUN_POINTS_NEXT_NUMBER.pick_random()
|
||||||
@@ -38,18 +43,18 @@ func generate_next_run_points(run_point : RunPoint) -> Array[RunPoint]:
|
|||||||
func generate_next_run_point(run_point : RunPoint) -> RunPoint:
|
func generate_next_run_point(run_point : RunPoint) -> RunPoint:
|
||||||
return RunPoint.new(
|
return RunPoint.new(
|
||||||
run_point.level + 1,
|
run_point.level + 1,
|
||||||
generate_difficulty_increased_planet_parameter(run_point.planet_parameter, DIFFICULTY_INCREASE_BY_LEVEL),
|
generate_difficulty_increased_region_parameter(run_point.region_parameter, DIFFICULTY_INCREASE_BY_LEVEL),
|
||||||
(run_point.position + randi_range(-RUN_POINT_POSITION_DERIVATION, RUN_POINT_POSITION_DERIVATION)) % 360
|
(run_point.position + randi_range(-RUN_POINT_POSITION_DERIVATION, RUN_POINT_POSITION_DERIVATION)) % 360
|
||||||
)
|
)
|
||||||
|
|
||||||
func generate_difficulty_increased_planet_parameter(
|
func generate_difficulty_increased_region_parameter(
|
||||||
planet_parameter : PlanetParameter,
|
region_parameter : RegionParameter,
|
||||||
difficulty : int = 1
|
difficulty : int = 1
|
||||||
) -> PlanetParameter:
|
) -> RegionParameter:
|
||||||
var i_diff := difficulty
|
var i_diff := difficulty
|
||||||
var new_planet_parameter = PlanetParameter.new(
|
var new_region_parameter = RegionParameter.new(
|
||||||
planet_parameter.charges,
|
region_parameter.charges,
|
||||||
planet_parameter.objective
|
region_parameter.objective
|
||||||
)
|
)
|
||||||
while i_diff > 0:
|
while i_diff > 0:
|
||||||
|
|
||||||
@@ -58,51 +63,56 @@ func generate_difficulty_increased_planet_parameter(
|
|||||||
DifficultyIncreaseObjective.new()
|
DifficultyIncreaseObjective.new()
|
||||||
].filter(
|
].filter(
|
||||||
func (mod : DifficultyModifier):
|
func (mod : DifficultyModifier):
|
||||||
return mod.get_difficulty_cost() <= i_diff and mod.can_modifiy(new_planet_parameter)
|
return mod.get_difficulty_cost() <= i_diff and mod.can_modifiy(new_region_parameter)
|
||||||
)
|
)
|
||||||
|
|
||||||
var selected_difficulty_modifier = available_difficulty_modifier.pick_random()
|
var selected_difficulty_modifier = available_difficulty_modifier.pick_random()
|
||||||
|
|
||||||
selected_difficulty_modifier.modify(new_planet_parameter)
|
selected_difficulty_modifier.modify(new_region_parameter)
|
||||||
|
|
||||||
i_diff -= max(1,selected_difficulty_modifier.get_difficulty_cost())
|
i_diff -= max(1,selected_difficulty_modifier.get_difficulty_cost())
|
||||||
return new_planet_parameter
|
return new_region_parameter
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
func get_next_run_points() -> Array[RunPoint]:
|
func get_state() -> State:
|
||||||
return next_run_points
|
if not current_run_point:
|
||||||
|
return State.STARTED
|
||||||
|
elif current_run_point.level == RUN_POINT_MAX_LEVEL:
|
||||||
|
return State.FINISHED
|
||||||
|
else :
|
||||||
|
return State.IN_PROGRESS
|
||||||
|
|
||||||
func get_current_planet_data() -> PlanetData:
|
func get_next_run_points() -> Array[RunPoint]:
|
||||||
if current_run_point:
|
if current_run_point and current_run_point.level == RUN_POINT_MAX_LEVEL:
|
||||||
return current_run_point.planet_data
|
return []
|
||||||
else:
|
return next_run_points
|
||||||
return null
|
|
||||||
|
|
||||||
func choose_next_run_point(run_point : RunPoint) -> RunPoint:
|
func choose_next_run_point(run_point : RunPoint) -> RunPoint:
|
||||||
if current_run_point:
|
if current_run_point:
|
||||||
visited_run_points.append(current_run_point)
|
visited_run_points.append(current_run_point)
|
||||||
current_run_point = run_point
|
current_run_point = run_point
|
||||||
|
GameInfo.game_data.start_region(run_point.region_parameter)
|
||||||
next_run_points = generate_next_run_points(current_run_point)
|
next_run_points = generate_next_run_points(current_run_point)
|
||||||
return current_run_point
|
return current_run_point
|
||||||
|
|
||||||
class DifficultyModifier:
|
class DifficultyModifier:
|
||||||
func modify(_planet_parameter : PlanetParameter):
|
func modify(_region_parameter : RegionParameter):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
func can_modifiy(_planet_parameter : PlanetParameter) -> bool:
|
func can_modifiy(_region_parameter : RegionParameter) -> bool:
|
||||||
return true
|
return true
|
||||||
|
|
||||||
func get_difficulty_cost() -> int:
|
func get_difficulty_cost() -> int:
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
class DifficultyIncreaseObjective extends DifficultyModifier:
|
class DifficultyIncreaseObjective extends DifficultyModifier:
|
||||||
func modify(planet_parameter : PlanetParameter):
|
func modify(region_parameter : RegionParameter):
|
||||||
planet_parameter.objective += 1
|
region_parameter.objective += 1
|
||||||
|
|
||||||
class DifficultyDecreaseCharge extends DifficultyModifier:
|
class DifficultyDecreaseCharge extends DifficultyModifier:
|
||||||
func modify(planet_parameter : PlanetParameter):
|
func modify(region_parameter : RegionParameter):
|
||||||
planet_parameter.charges -= 1
|
region_parameter.charges -= 1
|
||||||
|
|
||||||
func can_modifiy(planet_parameter : PlanetParameter) -> bool:
|
func can_modifiy(region_parameter : RegionParameter) -> bool:
|
||||||
return planet_parameter.charges >= 3
|
return region_parameter.charges >= 3
|
||||||
@@ -8,53 +8,31 @@ const OBJECTIVE_ICON = preload("res://common/icons/dna.svg")
|
|||||||
const CHARGE_ICON = preload("res://common/icons/bolt.svg")
|
const CHARGE_ICON = preload("res://common/icons/bolt.svg")
|
||||||
|
|
||||||
@export var level : int = 0 # X pos along the planet, and difficulty
|
@export var level : int = 0 # X pos along the planet, and difficulty
|
||||||
@export var planet_parameter : PlanetParameter = PlanetParameter.new() :
|
@export var region_parameter : RegionParameter = RegionParameter.new() :
|
||||||
set(v):
|
set(v):
|
||||||
planet_parameter = v
|
region_parameter = v
|
||||||
planet_data = PlanetData.new(planet_parameter)
|
|
||||||
@export var region_name : String = generate_region_name()
|
|
||||||
@export var position : int = 0 # Y pos along the planet, 0 to 360
|
@export var position : int = 0 # Y pos along the planet, 0 to 360
|
||||||
var planet_data : PlanetData
|
|
||||||
|
|
||||||
func _init(
|
func _init(
|
||||||
_level : int = 0,
|
_level : int = 0,
|
||||||
_planet_parameter : PlanetParameter = PlanetParameter.new(),
|
_region_parameter : RegionParameter = RegionParameter.new(),
|
||||||
_position : int = randi_range(0,360),
|
_position : int = randi_range(0,360),
|
||||||
_region_name : String = generate_region_name()
|
|
||||||
):
|
):
|
||||||
level = _level
|
level = _level
|
||||||
planet_parameter = _planet_parameter
|
region_parameter = _region_parameter
|
||||||
|
region_parameter.level = level
|
||||||
position = _position
|
position = _position
|
||||||
region_name = _region_name
|
|
||||||
planet_data = PlanetData.new(planet_parameter)
|
|
||||||
|
|
||||||
func card_info() -> CardInfo:
|
func card_info() -> CardInfo:
|
||||||
var info = CardInfo.new(region_name)
|
var info = CardInfo.new(region_parameter.name)
|
||||||
info.important_stat_icon = DANGER_ICON
|
info.important_stat_icon = DANGER_ICON
|
||||||
info.important_stat_text = "%d" % level
|
info.important_stat_text = "%d" % level
|
||||||
|
|
||||||
info.type_icon = TYPE_ICON
|
info.type_icon = TYPE_ICON
|
||||||
|
|
||||||
info.stats.append_array([
|
info.stats.append_array([
|
||||||
CardStatInfo.new(tr("%d_GARDEN_POINTS") % planet_parameter.objective, OBJECTIVE_ICON),
|
CardStatInfo.new(str(region_parameter.objective), OBJECTIVE_ICON),
|
||||||
CardStatInfo.new(tr("%d_CHARGES_AVAILABLE") % planet_parameter.charges, CHARGE_ICON),
|
CardStatInfo.new(str(region_parameter.charges), CHARGE_ICON),
|
||||||
])
|
])
|
||||||
|
|
||||||
return info
|
return info
|
||||||
|
|
||||||
func generate_region_name() -> String:
|
|
||||||
var vowel = ["a","e","i","o","u","y"]
|
|
||||||
var consonants = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z", "'"]
|
|
||||||
|
|
||||||
var word_len = randf_range(4,8)
|
|
||||||
var word = ''
|
|
||||||
var last_letter_is_vowel = false
|
|
||||||
|
|
||||||
for i in range(word_len):
|
|
||||||
if last_letter_is_vowel:
|
|
||||||
word += consonants.pick_random()
|
|
||||||
else:
|
|
||||||
word += vowel.pick_random()
|
|
||||||
|
|
||||||
last_letter_is_vowel = not last_letter_is_vowel
|
|
||||||
return word.capitalize()
|
|
||||||
@@ -1,6 +1,10 @@
|
|||||||
extends Resource
|
extends Resource
|
||||||
class_name SettingsData
|
class_name SettingsData
|
||||||
|
|
||||||
|
const MUSIC_BUS_ID = 1
|
||||||
|
const SFX_BUS_ID = 2
|
||||||
|
const AMBIANCE_BUS_ID = 3
|
||||||
|
|
||||||
signal language_changed(settings : SettingsData)
|
signal language_changed(settings : SettingsData)
|
||||||
signal sound_changed(settings : SettingsData)
|
signal sound_changed(settings : SettingsData)
|
||||||
signal video_changed(settings : SettingsData)
|
signal video_changed(settings : SettingsData)
|
||||||
@@ -43,4 +47,9 @@ const AVAILABLE_LANGUAGES_LABEL = [
|
|||||||
@export var full_screen : bool = false :
|
@export var full_screen : bool = false :
|
||||||
set(v):
|
set(v):
|
||||||
full_screen = v
|
full_screen = v
|
||||||
video_changed.emit(self)
|
video_changed.emit(self)
|
||||||
|
|
||||||
|
#region ------------------ Controls ------------------
|
||||||
|
|
||||||
|
@export var action_remapped : Array[String] = []
|
||||||
|
@export var input_remapped : Array[InputEvent] = []
|
||||||
@@ -1,34 +1,87 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
|
const SAVE_GAME_LOCATION = "user://stw_demo_save.tres"
|
||||||
|
const SAVE_SETTINGS_LOCATION = "user://stw_settings.tres"
|
||||||
|
|
||||||
|
var game_loaded = false
|
||||||
|
|
||||||
signal game_data_updated(g : GameData)
|
signal game_data_updated(g : GameData)
|
||||||
|
|
||||||
var game_data : GameData :
|
var game_data : GameData :
|
||||||
set(v):
|
set(v):
|
||||||
game_data = v
|
game_data = v
|
||||||
game_data_updated.emit(v)
|
game_data_updated.emit(v)
|
||||||
|
|
||||||
|
var settings_data : SettingsData
|
||||||
|
|
||||||
|
func load_game_data() -> GameData:
|
||||||
|
if ResourceLoader.exists(SAVE_GAME_LOCATION):
|
||||||
|
game_loaded = true
|
||||||
|
game_data = ResourceLoader.load(SAVE_GAME_LOCATION).duplicate_deep()
|
||||||
|
else :
|
||||||
|
game_data = GameData.new()
|
||||||
|
save_game_data()
|
||||||
|
|
||||||
|
return game_data
|
||||||
|
|
||||||
|
func save_game_data():
|
||||||
|
if game_data:
|
||||||
|
ResourceSaver.save(game_data, SAVE_GAME_LOCATION)
|
||||||
|
|
||||||
|
func load_settings_data() -> SettingsData:
|
||||||
|
if ResourceLoader.exists(SAVE_SETTINGS_LOCATION):
|
||||||
|
settings_data = ResourceLoader.load(SAVE_SETTINGS_LOCATION).duplicate_deep()
|
||||||
|
else :
|
||||||
|
settings_data = SettingsData.new()
|
||||||
|
save_settings()
|
||||||
|
|
||||||
|
return settings_data
|
||||||
|
|
||||||
|
func save_settings():
|
||||||
|
if settings_data:
|
||||||
|
ResourceSaver.save(settings_data, SAVE_SETTINGS_LOCATION)
|
||||||
|
|
||||||
|
func restart_game_data():
|
||||||
|
game_data = GameData.new()
|
||||||
|
save_game_data()
|
||||||
|
|
||||||
func _init():
|
func _init():
|
||||||
if not game_data:
|
load_game_data()
|
||||||
game_data = GameData.new()
|
load_settings_data()
|
||||||
update_language_settings(game_data.settings)
|
update_language_settings()
|
||||||
update_video_settings(game_data.settings)
|
update_video_settings()
|
||||||
game_data.settings.language_changed.connect(_on_settings_language_changed)
|
settings_data.language_changed.connect(_on_settings_language_changed)
|
||||||
game_data.settings.video_changed.connect(_on_settings_video_changed)
|
settings_data.video_changed.connect(_on_settings_video_changed)
|
||||||
|
settings_data.sound_changed.connect(_on_settings_sound_changed)
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
Dialogic.timeline_started.connect(_on_timeline_started)
|
||||||
|
|
||||||
func _on_settings_video_changed(s : SettingsData):
|
func _on_settings_video_changed(s : SettingsData):
|
||||||
update_video_settings(s)
|
update_video_settings(s)
|
||||||
|
|
||||||
func _on_settings_language_changed(s : SettingsData):
|
func _on_settings_language_changed(s : SettingsData):
|
||||||
update_language_settings(s)
|
update_language_settings(s)
|
||||||
|
|
||||||
func update_language_settings(s : SettingsData):
|
func _on_settings_sound_changed(s : SettingsData):
|
||||||
TranslationServer.set_locale(s.language)
|
AudioServer.set_bus_volume_db(SettingsData.MUSIC_BUS_ID, linear_to_db(s.music_volume))
|
||||||
|
AudioServer.set_bus_volume_db(SettingsData.SFX_BUS_ID, linear_to_db(s.sfx_volume))
|
||||||
|
AudioServer.set_bus_volume_db(SettingsData.AMBIANCE_BUS_ID, linear_to_db(s.ambiance_volume))
|
||||||
|
|
||||||
func update_video_settings(s : SettingsData):
|
func _on_timeline_started():
|
||||||
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
|
var dialog_path = Dialogic.current_timeline.resource_path
|
||||||
|
if not dialog_path in game_data.dialogs_done:
|
||||||
|
game_data.dialogs_done.append(dialog_path)
|
||||||
|
save_game_data()
|
||||||
|
|
||||||
func update_input(action : String, old_event : InputEvent, event : InputEvent):
|
func update_language_settings(s : SettingsData = settings_data):
|
||||||
InputMap.action_erase_event(action, old_event)
|
TranslationServer.set_locale(s.language)
|
||||||
InputMap.action_add_event(action, event)
|
|
||||||
|
func update_video_settings(s : SettingsData = settings_data):
|
||||||
|
DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN if s.full_screen else DisplayServer.WINDOW_MODE_WINDOWED)
|
||||||
|
|
||||||
|
func update_inputs(s : SettingsData = settings_data):
|
||||||
|
for i in range(len(s.input_remapped)):
|
||||||
|
InputMap.action_erase_events(s.action_remapped[i])
|
||||||
|
InputMap.action_add_event(s.action_remapped[i], s.input_remapped[i])
|
||||||
|
|
||||||
|
|||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://eug5icp6t1h3"
|
uid="uid://eug5icp6t1h3"
|
||||||
path="res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.ctex"
|
path.s3tc="res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/arrow-narrow-up.svg"
|
source_file="res://common/icons/arrow-narrow-up.svg"
|
||||||
dest_files=["res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.ctex"]
|
dest_files=["res://.godot/imported/arrow-narrow-up.svg-3e96282c2af955cf23507b48c4348810.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
|
After Width: | Height: | Size: 427 B |
@@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://d2p7h0aga85tn"
|
uid="uid://dw80a4c5iekir"
|
||||||
path="res://.godot/imported/truck_interior.png-ff9bd2d0107d83f7c4209d959ee69f15.ctex"
|
path="res://.godot/imported/bar.png-623df5fbea38f9d862a997485a02d36c.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://stages/terrain/truck/assets/sprite/truck_interior.png"
|
source_file="res://common/icons/bar.png"
|
||||||
dest_files=["res://.godot/imported/truck_interior.png-ff9bd2d0107d83f7c4209d959ee69f15.ctex"]
|
dest_files=["res://.godot/imported/bar.png-623df5fbea38f9d862a997485a02d36c.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://dcgnamu7sb3ov"
|
uid="uid://dcgnamu7sb3ov"
|
||||||
path="res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.ctex"
|
path.s3tc="res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/bolt.svg"
|
source_file="res://common/icons/bolt.svg"
|
||||||
dest_files=["res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.ctex"]
|
dest_files=["res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-instagram"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 8a4 4 0 0 1 4 -4h8a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-8a4 4 0 0 1 -4 -4l0 -8" /><path d="M9 12a3 3 0 1 0 6 0a3 3 0 0 0 -6 0" /><path d="M16.5 7.5v.01" /></svg>
|
||||||
|
After Width: | Height: | Size: 469 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dh1jaup4y1f6q"
|
||||||
|
path="res://.godot/imported/brand-instagram.svg-93b67e1c651e77c13169000f3fa1764f.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/brand-instagram.svg"
|
||||||
|
dest_files=["res://.godot/imported/brand-instagram.svg-93b67e1c651e77c13169000f3fa1764f.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-brand-steam"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M16.5 5a4.5 4.5 0 1 1 -.653 8.953l-4.347 3.009l0 .038a3 3 0 0 1 -2.824 3l-.176 0a3 3 0 0 1 -2.94 -2.402l-2.56 -1.098v-3.5l3.51 1.755a2.989 2.989 0 0 1 2.834 -.635l2.727 -3.818a4.5 4.5 0 0 1 4.429 -5.302" /><path d="M15.5 9.5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" fill="#ffffff" /></svg>
|
||||||
|
After Width: | Height: | Size: 584 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://cpkye7t28ragp"
|
||||||
|
path="res://.godot/imported/brand-steam.svg-9dbbdc409ded6b7066179206cac90cca.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/brand-steam.svg"
|
||||||
|
dest_files=["res://.godot/imported/brand-steam.svg-9dbbdc409ded6b7066179206cac90cca.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-broadcast"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18.364 19.364a9 9 0 1 0 -12.728 0" /><path d="M15.536 16.536a5 5 0 1 0 -7.072 0" /><path d="M11 13a1 1 0 1 0 2 0a1 1 0 1 0 -2 0" /></svg>
|
||||||
|
After Width: | Height: | Size: 442 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://qshtr3peinak"
|
||||||
|
path="res://.godot/imported/broadcast.svg-d7376e52ecc5b74fcdaea71ccbe04a97.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/broadcast.svg"
|
||||||
|
dest_files=["res://.godot/imported/broadcast.svg-d7376e52ecc5b74fcdaea71ccbe04a97.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff" class="icon icon-tabler icons-tabler-filled icon-tabler-coin"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M17 3.34a10 10 0 1 1 -15 8.66l.005 -.324a10 10 0 0 1 14.995 -8.336zm-5 2.66a1 1 0 0 0 -1 1a3 3 0 1 0 0 6v2a1.024 1.024 0 0 1 -.866 -.398l-.068 -.101a1 1 0 0 0 -1.732 .998a3 3 0 0 0 2.505 1.5h.161a1 1 0 0 0 .883 .994l.117 .007a1 1 0 0 0 1 -1l.176 -.005a3 3 0 0 0 -.176 -5.995v-2c.358 -.012 .671 .14 .866 .398l.068 .101a1 1 0 0 0 1.732 -.998a3 3 0 0 0 -2.505 -1.501h-.161a1 1 0 0 0 -1 -1zm1 7a1 1 0 0 1 0 2v-2zm-2 -4v2a1 1 0 0 1 0 -2z" /></svg>
|
||||||
|
After Width: | Height: | Size: 662 B |
@@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://b1n8nad43usw4"
|
uid="uid://cs5jk1312wauu"
|
||||||
path="res://.godot/imported/panneau_solaire_2.png-479b68803815c59c599ff8c3a78ca895.ctex"
|
path="res://.godot/imported/coin.svg-08623932cd6c1ab8a19bb6ae049240d0.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://entities/interactables/machines/solar_pannel/assets/sprites/panneau_solaire_2.png"
|
source_file="res://common/icons/coin.svg"
|
||||||
dest_files=["res://.godot/imported/panneau_solaire_2.png-479b68803815c59c599ff8c3a78ca895.ctex"]
|
dest_files=["res://.godot/imported/coin.svg-08623932cd6c1ab8a19bb6ae049240d0.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -38,3 +38,6 @@ process/hdr_as_srgb=false
|
|||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://baaujfw8piywi"
|
uid="uid://baaujfw8piywi"
|
||||||
path="res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.ctex"
|
path.s3tc="res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/dna.svg"
|
source_file="res://common/icons/dna.svg"
|
||||||
dest_files=["res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.ctex"]
|
dest_files=["res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-focus"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M11.5 12a.5 .5 0 1 0 1 0a.5 .5 0 1 0 -1 0" fill="#ffffff" /><path d="M3 12a9 9 0 1 0 18 0a9 9 0 1 0 -18 0" /></svg>
|
||||||
|
After Width: | Height: | Size: 415 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ba8vh5h3r6pr2"
|
||||||
|
path="res://.godot/imported/focus.svg-cc30e969e976522254107343300a103b.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/focus.svg"
|
||||||
|
dest_files=["res://.godot/imported/focus.svg-cc30e969e976522254107343300a103b.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#ffffff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="icon icon-tabler icons-tabler-outline icon-tabler-hand-stop"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M8 13v-7.5a1.5 1.5 0 0 1 3 0v6.5" /><path d="M11 5.5v-2a1.5 1.5 0 1 1 3 0v8.5" /><path d="M14 5.5a1.5 1.5 0 0 1 3 0v6.5" /><path d="M17 7.5a1.5 1.5 0 0 1 3 0v8.5a6 6 0 0 1 -6 6h-2h.208a6 6 0 0 1 -5.012 -2.7a69.74 69.74 0 0 1 -.196 -.3c-.312 -.479 -1.407 -2.388 -3.286 -5.728a1.5 1.5 0 0 1 .536 -2.022a1.867 1.867 0 0 1 2.28 .28l1.47 1.47" /></svg>
|
||||||
|
After Width: | Height: | Size: 651 B |
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://3slhocr5wy3w"
|
||||||
|
path="res://.godot/imported/hand-stop.svg-bc0d0e986bcb4b50bdd5686b5bff814b.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/hand-stop.svg"
|
||||||
|
dest_files=["res://.godot/imported/hand-stop.svg-bc0d0e986bcb4b50bdd5686b5bff814b.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://dex283rx00fjb"
|
uid="uid://dex283rx00fjb"
|
||||||
path="res://.godot/imported/logout.svg-15891d2f0d875a13ef182339fdbc6039.ctex"
|
path.s3tc="res://.godot/imported/logout.svg-15891d2f0d875a13ef182339fdbc6039.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/logout.svg"
|
source_file="res://common/icons/logout.svg"
|
||||||
dest_files=["res://.godot/imported/logout.svg-15891d2f0d875a13ef182339fdbc6039.ctex"]
|
dest_files=["res://.godot/imported/logout.svg-15891d2f0d875a13ef182339fdbc6039.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#ffffff" class="icon icon-tabler icons-tabler-filled icon-tabler-phone"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 3a1 1 0 0 1 .877 .519l.051 .11l2 5a1 1 0 0 1 -.313 1.16l-.1 .068l-1.674 1.004l.063 .103a10 10 0 0 0 3.132 3.132l.102 .062l1.005 -1.672a1 1 0 0 1 1.113 -.453l.115 .039l5 2a1 1 0 0 1 .622 .807l.007 .121v4c0 1.657 -1.343 3 -3.06 2.998c-8.579 -.521 -15.418 -7.36 -15.94 -15.998a3 3 0 0 1 2.824 -2.995l.176 -.005h4z" /></svg>
|
||||||
|
After Width: | Height: | Size: 544 B |
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dks6cugwif2em"
|
||||||
|
path.s3tc="res://.godot/imported/phone.svg-8966bc13014a00a59fa575f3ae370ef6.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://common/icons/phone.svg"
|
||||||
|
dest_files=["res://.godot/imported/phone.svg-8966bc13014a00a59fa575f3ae370ef6.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
|
svg/scale=2.0
|
||||||
|
editor/scale_with_editor_scale=false
|
||||||
|
editor/convert_colors_with_editor_theme=false
|
||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://b43thuq8piv18"
|
uid="uid://b43thuq8piv18"
|
||||||
path="res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.ctex"
|
path.s3tc="res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/skull.svg"
|
source_file="res://common/icons/skull.svg"
|
||||||
dest_files=["res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.ctex"]
|
dest_files=["res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://b6dwhn0uotdgu"
|
uid="uid://b6dwhn0uotdgu"
|
||||||
path="res://.godot/imported/square-rounded-nofill.svg-3b394b5967765acc26d391129de152eb.ctex"
|
path.s3tc="res://.godot/imported/square-rounded-nofill.svg-3b394b5967765acc26d391129de152eb.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/square-rounded-nofill.svg"
|
source_file="res://common/icons/square-rounded-nofill.svg"
|
||||||
dest_files=["res://.godot/imported/square-rounded-nofill.svg-3b394b5967765acc26d391129de152eb.ctex"]
|
dest_files=["res://.godot/imported/square-rounded-nofill.svg-3b394b5967765acc26d391129de152eb.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -3,19 +3,20 @@
|
|||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://rdrhi3r11ey6"
|
uid="uid://rdrhi3r11ey6"
|
||||||
path="res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.ctex"
|
path.s3tc="res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
}
|
}
|
||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://common/icons/square-rounded.svg"
|
source_file="res://common/icons/square-rounded.svg"
|
||||||
dest_files=["res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.ctex"]
|
dest_files=["res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
compress/mode=0
|
compress/mode=2
|
||||||
compress/high_quality=false
|
compress/high_quality=false
|
||||||
compress/lossy_quality=0.7
|
compress/lossy_quality=0.7
|
||||||
compress/uastc_level=0
|
compress/uastc_level=0
|
||||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
|||||||
compress/hdr_compression=1
|
compress/hdr_compression=1
|
||||||
compress/normal_map=0
|
compress/normal_map=0
|
||||||
compress/channel_pack=0
|
compress/channel_pack=0
|
||||||
mipmaps/generate=false
|
mipmaps/generate=true
|
||||||
mipmaps/limit=-1
|
mipmaps/limit=-1
|
||||||
roughness/mode=0
|
roughness/mode=0
|
||||||
roughness/src_normal=""
|
roughness/src_normal=""
|
||||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
|||||||
process/hdr_as_srgb=false
|
process/hdr_as_srgb=false
|
||||||
process/hdr_clamp_exposure=false
|
process/hdr_clamp_exposure=false
|
||||||
process/size_limit=0
|
process/size_limit=0
|
||||||
detect_3d/compress_to=1
|
detect_3d/compress_to=0
|
||||||
svg/scale=2.0
|
svg/scale=2.0
|
||||||
editor/scale_with_editor_scale=false
|
editor/scale_with_editor_scale=false
|
||||||
editor/convert_colors_with_editor_theme=false
|
editor/convert_colors_with_editor_theme=false
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
[gd_scene format=3 uid="uid://b8gqdgabrjaml"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://dt2ip3pw2cboy" path="res://entities/plants/scripts/texture_builder/plant_texture_builder.gd" id="1_s8rsj"]
|
||||||
|
[ext_resource type="Script" uid="uid://b3jwglylqdqtw" path="res://entities/plants/scripts/texture_builder/plant_part.gd" id="2_cfiqo"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bfyafiewcrjln" path="res://entities/plants/resources/plant_parts/Base1.tres" id="3_15wue"]
|
||||||
|
[ext_resource type="Resource" uid="uid://7hrdkl6bf3o4" path="res://entities/plants/resources/plant_parts/Branch1.tres" id="4_ggud5"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bgh8a4xwc5stw" path="res://entities/plants/resources/plant_parts/Base2.tres" id="5_21cjy"]
|
||||||
|
[ext_resource type="Resource" uid="uid://ceisi5yyie7to" path="res://entities/plants/resources/plant_parts/Branch2.tres" id="5_ufbqh"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cxiu8frk04b5i" path="res://entities/plants/resources/plant_parts/Branch3.tres" id="6_jbu3q"]
|
||||||
|
[ext_resource type="Resource" uid="uid://53p5g07e3pb4" path="res://entities/plants/resources/plant_parts/Branch4.tres" id="7_21cjy"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cyfyodtfxne1w" path="res://entities/plants/resources/plant_parts/Branch5.tres" id="8_qm7aw"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cuvtf4y1dspcp" path="res://entities/plants/resources/plant_parts/Branch6.tres" id="9_3e4c1"]
|
||||||
|
[ext_resource type="Resource" uid="uid://wgmxpk52rg7x" path="res://entities/plants/resources/plant_parts/LeafA1.tres" id="11_fc4k8"]
|
||||||
|
[ext_resource type="Resource" uid="uid://d2y7o2hc6ffei" path="res://entities/plants/resources/plant_parts/Branch11.tres" id="11_hvwgo"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cbejb0uvdke7k" path="res://entities/plants/resources/plant_parts/LeafA2.tres" id="12_1b4fr"]
|
||||||
|
[ext_resource type="Resource" uid="uid://civ4gr1c2pq7g" path="res://entities/plants/resources/plant_parts/Branch12.tres" id="12_npk80"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dujxttu80g0lo" path="res://entities/plants/resources/plant_parts/LeafA3.tres" id="13_ggcwy"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bqfocs6f0iypo" path="res://entities/plants/resources/plant_parts/Branch13.tres" id="13_hyb2i"]
|
||||||
|
[ext_resource type="Resource" uid="uid://drml5dm8i3j3a" path="res://entities/plants/resources/plant_parts/Branch14.tres" id="14_4gk8a"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bgv3nb10t6u3y" path="res://entities/plants/resources/plant_parts/LeafF1.tres" id="14_8r35x"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bix3qwmsvuxs4" path="res://entities/plants/resources/plant_parts/LeafA4.tres" id="14_15wue"]
|
||||||
|
[ext_resource type="Resource" uid="uid://c31h25xdll8si" path="res://entities/plants/resources/plant_parts/FlowerD1.tres" id="15_3ti7v"]
|
||||||
|
[ext_resource type="Resource" uid="uid://be17y7clvf88e" path="res://entities/plants/resources/plant_parts/LeafE1.tres" id="15_p2blu"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bkgw3wmoam10n" path="res://entities/plants/resources/plant_parts/LeafF2.tres" id="15_rbd7l"]
|
||||||
|
[ext_resource type="Script" uid="uid://cfjd8jelpm8dt" path="res://entities/plants/scripts/texture_builder/part_mutation_association.gd" id="16_c3tk3"]
|
||||||
|
[ext_resource type="Resource" uid="uid://r5mspvasrq6y" path="res://entities/plants/resources/plant_parts/FlowerD2.tres" id="16_cpf4r"]
|
||||||
|
[ext_resource type="Resource" uid="uid://m8j2gfumw11w" path="res://entities/plants/resources/plant_parts/LeafF3.tres" id="16_nfxo0"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dw7wdihxxy0uf" path="res://entities/plants/resources/plant_parts/LeafE2.tres" id="16_xt8tm"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dth4dp88vs3gh" path="res://entities/plants/resources/plant_parts/LeafF4.tres" id="17_i8j71"]
|
||||||
|
[ext_resource type="Resource" uid="uid://br80voioh4jxu" path="res://entities/plants/resources/plant_parts/FlowerD3.tres" id="17_p2blu"]
|
||||||
|
[ext_resource type="Resource" uid="uid://3yi8hk73s5mm" path="res://entities/plants/resources/plant_parts/LeafE3.tres" id="17_qm7aw"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cka6sihumbjpw" path="res://entities/plants/resources/plant_parts/LeafF5.tres" id="18_l2vrg"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dq5dwqherb6ac" path="res://entities/plants/resources/plant_parts/LeafF6.tres" id="19_14c4k"]
|
||||||
|
[ext_resource type="Resource" uid="uid://ckef0dno4j5mn" path="res://entities/plants/resources/plant_parts/FlowerF1.tres" id="20_lggh7"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dhhyh56shnure" path="res://entities/plants/resources/plant_parts/FlowerF2.tres" id="21_8r35x"]
|
||||||
|
[ext_resource type="Resource" uid="uid://banfc3pgm6a0m" path="res://entities/plants/resources/plant_parts/FlowerC1.tres" id="21_alra6"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dmdyj7t4g48p" path="res://entities/plants/resources/plant_parts/FlowerC2.tres" id="22_lggh7"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bhj7j78tokt25" path="res://entities/plants/resources/plant_parts/FlowerC3.tres" id="23_8r35x"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bkgrwffi7m2i4" path="res://entities/plants/resources/plant_parts/FlowerC4.tres" id="24_rbd7l"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bchwhdmxsaqic" path="res://entities/plants/resources/plant_parts/LeafA5.tres" id="29_nfxo0"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cvr81iqokda6x" path="res://entities/plants/resources/plant_parts/LeafA6.tres" id="30_i8j71"]
|
||||||
|
[ext_resource type="Resource" uid="uid://cwskfwdasvv0g" path="res://entities/plants/resources/plant_parts/FlowerF3.tres" id="38_rbd7l"]
|
||||||
|
[ext_resource type="Resource" uid="uid://e0u1baixvaxn" path="res://entities/plants/resources/plant_parts/LeafE4.tres" id="42_14c4k"]
|
||||||
|
[ext_resource type="Resource" uid="uid://dgivyissl512e" path="res://entities/plants/resources/plant_parts/LeafG1.tres" id="43_y02ao"]
|
||||||
|
[ext_resource type="Resource" uid="uid://u6dwq3eowpcb" path="res://entities/plants/resources/plant_parts/LeafG2.tres" id="44_s8rsj"]
|
||||||
|
[ext_resource type="Resource" uid="uid://c4artcndro0r5" path="res://entities/plants/resources/plant_parts/FlowerB1.tres" id="45_coupj"]
|
||||||
|
[ext_resource type="Resource" uid="uid://b3dfua388ub4k" path="res://entities/plants/resources/plant_parts/FlowerB2.tres" id="46_ggud5"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bnn0tcoab4plv" path="res://entities/plants/resources/plant_parts/FlowerB3.tres" id="47_ufbqh"]
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_rt6tw"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("11_fc4k8"), ExtResource("12_1b4fr"), ExtResource("13_ggcwy"), ExtResource("14_15wue"), ExtResource("29_nfxo0"), ExtResource("30_i8j71")])
|
||||||
|
part_amount = 4
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_y02ao"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("15_3ti7v"), ExtResource("16_cpf4r"), ExtResource("17_p2blu")])
|
||||||
|
part_amount = 5
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_nfxo0"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("20_lggh7"), ExtResource("21_8r35x"), ExtResource("38_rbd7l")])
|
||||||
|
part_amount = 5
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_s8rsj"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("15_p2blu"), ExtResource("16_xt8tm"), ExtResource("17_qm7aw"), ExtResource("42_14c4k")])
|
||||||
|
part_amount = 5
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_14c4k"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("21_alra6"), ExtResource("22_lggh7"), ExtResource("23_8r35x"), ExtResource("24_rbd7l")])
|
||||||
|
part_amount = 4
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_cfiqo"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("43_y02ao"), ExtResource("44_s8rsj")])
|
||||||
|
part_amount = 3
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[sub_resource type="Resource" id="Resource_jbu3q"]
|
||||||
|
script = ExtResource("16_c3tk3")
|
||||||
|
parts = Array[ExtResource("2_cfiqo")]([ExtResource("45_coupj"), ExtResource("46_ggud5"), ExtResource("47_ufbqh")])
|
||||||
|
part_amount = 5
|
||||||
|
metadata/_custom_type_script = "uid://cfjd8jelpm8dt"
|
||||||
|
|
||||||
|
[node name="TextureBuilder" type="Node" unique_id=79184097]
|
||||||
|
script = ExtResource("1_s8rsj")
|
||||||
|
bases = Array[ExtResource("2_cfiqo")]([ExtResource("3_15wue")])
|
||||||
|
baby_bases = Array[ExtResource("2_cfiqo")]([ExtResource("5_21cjy")])
|
||||||
|
branches = Array[ExtResource("2_cfiqo")]([ExtResource("4_ggud5"), ExtResource("5_ufbqh"), ExtResource("6_jbu3q"), ExtResource("7_21cjy"), ExtResource("8_qm7aw"), ExtResource("9_3e4c1"), ExtResource("11_hvwgo"), ExtResource("12_npk80"), ExtResource("13_hyb2i"), ExtResource("14_4gk8a")])
|
||||||
|
n_branches = 5
|
||||||
|
base_leaves = Array[ExtResource("2_cfiqo")]([ExtResource("14_8r35x"), ExtResource("15_rbd7l"), ExtResource("16_nfxo0"), ExtResource("17_i8j71"), ExtResource("18_l2vrg"), ExtResource("19_14c4k")])
|
||||||
|
parts_mutation_associations = Dictionary[String, ExtResource("16_c3tk3")]({
|
||||||
|
"ANCIENT": SubResource("Resource_rt6tw"),
|
||||||
|
"EPHEMERAL": SubResource("Resource_y02ao"),
|
||||||
|
"FERTILE": SubResource("Resource_nfxo0"),
|
||||||
|
"PURIFICATION": SubResource("Resource_s8rsj"),
|
||||||
|
"QUICK": SubResource("Resource_14c4k"),
|
||||||
|
"SOCIAL": SubResource("Resource_cfiqo"),
|
||||||
|
"TOUGH": SubResource("Resource_jbu3q")
|
||||||
|
})
|
||||||
|
chance_to_have_part = 0.9
|
||||||
|
origin_weights_base = Dictionary[int, int]({
|
||||||
|
0: 20,
|
||||||
|
1: 10,
|
||||||
|
2: 5
|
||||||
|
})
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
[gd_scene format=3 uid="uid://dac5wte80dwj0"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bb44144ckt2w7" path="res://common/scene_manager/scripts/scene_manager.gd" id="1_1c0qu"]
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="2_c1lr7"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bvksiaiocwob5" path="res://common/scene_manager/scenes/cockpit.tres" id="3_e28ni"]
|
||||||
|
[ext_resource type="Resource" uid="uid://bvgdq43fpl1xs" path="res://common/scene_manager/scenes/intro.tres" id="4_msho1"]
|
||||||
|
[ext_resource type="Resource" uid="uid://boqgwjyxyb45r" path="res://common/scene_manager/scenes/region.tres" id="5_ytog4"]
|
||||||
|
[ext_resource type="Resource" uid="uid://c27wenetitwm" path="res://common/scene_manager/scenes/region_selection.tres" id="6_chs32"]
|
||||||
|
[ext_resource type="Resource" uid="uid://diro74w272onp" path="res://common/scene_manager/scenes/title.tres" id="7_ol3d5"]
|
||||||
|
[ext_resource type="Resource" uid="uid://jegdqnd2sqi2" path="res://common/scene_manager/scenes/astra.tres" id="8_e28ni"]
|
||||||
|
[ext_resource type="Resource" uid="uid://b3ebbo88ptrrc" path="res://common/scene_manager/scenes/garage.tres" id="9_msho1"]
|
||||||
|
|
||||||
|
[node name="SceneManager" type="Node" unique_id=1630600782]
|
||||||
|
script = ExtResource("1_1c0qu")
|
||||||
|
scenes = Array[ExtResource("2_c1lr7")]([ExtResource("3_e28ni"), ExtResource("4_msho1"), ExtResource("5_ytog4"), ExtResource("6_chs32"), ExtResource("7_ol3d5"), ExtResource("8_e28ni"), ExtResource("9_msho1")])
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://jegdqnd2sqi2"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_114vb"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_114vb")
|
||||||
|
scene_id = "ASTRA"
|
||||||
|
scene_path = "res://stages/3d_scenes/astra_base/astra_base.tscn"
|
||||||
|
mouse_captured = true
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://bvksiaiocwob5"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_tkiq8"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_tkiq8")
|
||||||
|
scene_id = "COCKPIT"
|
||||||
|
scene_path = "res://stages/3d_scenes/cockpit_scene/cockpit_scene.tscn"
|
||||||
|
mouse_captured = true
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://b3ebbo88ptrrc"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_v8prw"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_v8prw")
|
||||||
|
scene_id = "GARAGE"
|
||||||
|
scene_path = "res://stages/3d_scenes/ship_garage/ship_garage.tscn"
|
||||||
|
mouse_captured = true
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://bvgdq43fpl1xs"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_6ws88"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_6ws88")
|
||||||
|
scene_id = "INTRO"
|
||||||
|
scene_path = "res://stages/intro/intro.tscn"
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://boqgwjyxyb45r"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_10qbh"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_10qbh")
|
||||||
|
scene_id = "REGION"
|
||||||
|
scene_path = "res://stages/terrain/region/region.tscn"
|
||||||
|
need_terrain_generated = true
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://c27wenetitwm"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_smjh0"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_smjh0")
|
||||||
|
scene_id = "REGION_SELECTION"
|
||||||
|
scene_path = "res://stages/region_selection/region_selection.tscn"
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[gd_resource type="Resource" script_class="Scene" format=3 uid="uid://diro74w272onp"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://1ejbvr3431ac" path="res://common/scene_manager/scripts/scene.gd" id="1_48g2j"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
script = ExtResource("1_48g2j")
|
||||||
|
scene_id = "TITLE"
|
||||||
|
scene_path = "res://stages/title_screen/title_screen.tscn"
|
||||||
|
need_to_be_saved = false
|
||||||
|
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
extends Resource
|
||||||
|
class_name Scene
|
||||||
|
|
||||||
|
@export var scene_id : String
|
||||||
|
@export_file_path() var scene_path : String
|
||||||
|
@export var mouse_captured := false
|
||||||
|
@export var need_terrain_generated := false
|
||||||
|
@export var need_to_be_saved = true
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://1ejbvr3431ac
|
||||||
@@ -1,24 +1,44 @@
|
|||||||
extends Node
|
extends Node
|
||||||
|
|
||||||
const TITLE_SCREEN = "res://stages/title_screen/title_screen.tscn"
|
@export var scenes : Array[Scene]
|
||||||
const PLANET_SCENE = "res://stages/terrain/planet/planet.tscn"
|
|
||||||
const TRUCK_SCENE = "res://stages/terrain/truck/truck.tscn"
|
|
||||||
const INTRO_SCENE = "res://stages/intro/intro.tscn"
|
|
||||||
const REGION_SELECTION_SCREEN = "res://stages/region_selection/region_selection.tscn"
|
|
||||||
|
|
||||||
signal scene_loaded
|
signal scene_loaded(scene : Scene)
|
||||||
signal scene_node_ready
|
signal scene_node_ready(scene : Scene)
|
||||||
|
|
||||||
|
var actual_scene = null
|
||||||
var loading_scene = false
|
var loading_scene = false
|
||||||
var generating_node = false
|
var generating_node = false
|
||||||
var scene_to_load := ""
|
|
||||||
var next_scene_node : Node
|
var next_scene_node : Node
|
||||||
@onready var current_scene_node : Node = get_tree().root.get_children().back()
|
@onready var current_scene_node : Node = get_tree().root.get_children().back()
|
||||||
|
|
||||||
func change_scene(scene_path : String, with_loading = true):
|
func search_scenes(scene_id : String) -> Scene:
|
||||||
|
var scene_pos : int = scenes.find_custom(
|
||||||
|
func (s : Scene):
|
||||||
|
return s.scene_id == scene_id
|
||||||
|
)
|
||||||
|
if scene_pos == -1:
|
||||||
|
return null
|
||||||
|
else :
|
||||||
|
return scenes[scene_pos]
|
||||||
|
|
||||||
|
func change_to_scene_id(scene_id : String, with_loading = true):
|
||||||
|
var scene = search_scenes(scene_id)
|
||||||
|
|
||||||
|
if not scene:
|
||||||
|
printerr("Scene %s not found" % scene_id)
|
||||||
|
return
|
||||||
|
|
||||||
|
change_to_scene(scene, with_loading)
|
||||||
|
|
||||||
|
func change_to_scene(scene : Scene, with_loading = true):
|
||||||
|
if loading_scene or generating_node:
|
||||||
|
await scene_node_ready
|
||||||
|
|
||||||
|
|
||||||
|
actual_scene = scene
|
||||||
loading_scene = true
|
loading_scene = true
|
||||||
scene_to_load = scene_path
|
var scene_path_to_load = scene.scene_path
|
||||||
ResourceLoader.load_threaded_request(scene_to_load)
|
ResourceLoader.load_threaded_request(scene_path_to_load)
|
||||||
LoadingScreen.loading_text = "LOADING_SCENE"
|
LoadingScreen.loading_text = "LOADING_SCENE"
|
||||||
var scene_to_hide = current_scene_node
|
var scene_to_hide = current_scene_node
|
||||||
if with_loading:
|
if with_loading:
|
||||||
@@ -30,16 +50,16 @@ func change_scene(scene_path : String, with_loading = true):
|
|||||||
if loading_scene:
|
if loading_scene:
|
||||||
await scene_loaded
|
await scene_loaded
|
||||||
|
|
||||||
next_scene_node = ResourceLoader.load_threaded_get(scene_to_load).instantiate()
|
next_scene_node = ResourceLoader.load_threaded_get(scene_path_to_load).instantiate()
|
||||||
if next_scene_node.has_method("hide"):
|
if next_scene_node.has_method("hide"):
|
||||||
next_scene_node.hide()
|
next_scene_node.hide()
|
||||||
get_tree().root.add_child(next_scene_node)
|
get_tree().root.add_child(next_scene_node)
|
||||||
|
|
||||||
generating_node = true
|
generating_node = true
|
||||||
if next_scene_node is Planet:
|
if scene.need_terrain_generated:
|
||||||
LoadingScreen.loading_text = "GENERATING_TERRAIN"
|
LoadingScreen.loading_text = "GENERATING_TERRAIN"
|
||||||
|
|
||||||
if generating_node:
|
await scene_node_ready
|
||||||
await scene_node_ready
|
|
||||||
|
|
||||||
if current_scene_node:
|
if current_scene_node:
|
||||||
current_scene_node.queue_free()
|
current_scene_node.queue_free()
|
||||||
@@ -47,23 +67,32 @@ func change_scene(scene_path : String, with_loading = true):
|
|||||||
if current_scene_node.has_method("show"):
|
if current_scene_node.has_method("show"):
|
||||||
current_scene_node.show()
|
current_scene_node.show()
|
||||||
|
|
||||||
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED if scene.mouse_captured else Input.MOUSE_MODE_VISIBLE
|
||||||
|
GameInfo.update_inputs()
|
||||||
|
|
||||||
|
if actual_scene.need_to_be_saved:
|
||||||
|
GameInfo.game_data.last_game_scene = scene
|
||||||
|
GameInfo.save_game_data()
|
||||||
|
|
||||||
if with_loading:
|
if with_loading:
|
||||||
LoadingScreen.hide_loading_screen()
|
LoadingScreen.hide_loading_screen()
|
||||||
|
|
||||||
func _process(_delta):
|
func _process(_delta):
|
||||||
if loading_scene:
|
if loading_scene:
|
||||||
var progress = []
|
var progress = []
|
||||||
var load_status := ResourceLoader.load_threaded_get_status(scene_to_load, progress)
|
var load_status := ResourceLoader.load_threaded_get_status(actual_scene.scene_path, progress)
|
||||||
LoadingScreen.loading_value = progress[0]
|
LoadingScreen.loading_value = progress[0]
|
||||||
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
|
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
|
||||||
loading_scene = false
|
loading_scene = false
|
||||||
scene_loaded.emit()
|
scene_loaded.emit(actual_scene)
|
||||||
|
if load_status == ResourceLoader.THREAD_LOAD_FAILED or load_status == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
|
||||||
|
printerr()
|
||||||
elif generating_node:
|
elif generating_node:
|
||||||
if next_scene_node is Planet:
|
if next_scene_node is Region:
|
||||||
LoadingScreen.loading_value = next_scene_node.generated_value
|
LoadingScreen.loading_value = next_scene_node.generated_value
|
||||||
if next_scene_node.is_generated:
|
if next_scene_node.is_generated:
|
||||||
generating_node = false
|
generating_node = false
|
||||||
scene_node_ready.emit()
|
scene_node_ready.emit()
|
||||||
elif next_scene_node.is_node_ready():
|
elif next_scene_node.is_node_ready():
|
||||||
generating_node = false
|
generating_node = false
|
||||||
scene_node_ready.emit()
|
scene_node_ready.emit(actual_scene)
|
||||||
@@ -2,33 +2,33 @@ class_name Math
|
|||||||
|
|
||||||
static func get_chunk_from_pos(coord) -> Vector2i:
|
static func get_chunk_from_pos(coord) -> Vector2i:
|
||||||
return Vector2i(
|
return Vector2i(
|
||||||
floori(coord.x / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE)),
|
floori(coord.x / (Region.CHUNK_TILE_SIZE * Region.TILE_SIZE)),
|
||||||
floori(coord.y / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE))
|
floori(coord.y / (Region.CHUNK_TILE_SIZE * Region.TILE_SIZE))
|
||||||
)
|
)
|
||||||
|
|
||||||
static func get_tile_from_pos(coord) -> Vector2i:
|
static func get_tile_from_pos(coord) -> Vector2i:
|
||||||
return Vector2i(
|
return Vector2i(
|
||||||
floori(coord.x / (Planet.TILE_SIZE)),
|
floori(coord.x / (Region.TILE_SIZE)),
|
||||||
floori(coord.y / (Planet.TILE_SIZE)),
|
floori(coord.y / (Region.TILE_SIZE)),
|
||||||
)
|
)
|
||||||
|
|
||||||
static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector2i]:
|
static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector2i]:
|
||||||
var tiles : Array[Vector2i] = []
|
var tiles : Array[Vector2i] = []
|
||||||
|
|
||||||
for x in range(
|
for x in range(
|
||||||
floori((center.x - radius/2.) / Planet.TILE_SIZE),
|
floori((center.x - radius/2.) / Region.TILE_SIZE),
|
||||||
ceili((center.x + radius/2.) / Planet.TILE_SIZE),
|
ceili((center.x + radius/2.) / Region.TILE_SIZE),
|
||||||
):
|
):
|
||||||
for y in range(
|
for y in range(
|
||||||
floori((center.y - radius/2.) / Planet.TILE_SIZE),
|
floori((center.y - radius/2.) / Region.TILE_SIZE),
|
||||||
ceili((center.y + radius/2.) / Planet.TILE_SIZE),
|
ceili((center.y + radius/2.) / Region.TILE_SIZE),
|
||||||
):
|
):
|
||||||
if is_tile_on_circle(Vector2i(x,y), center, radius):
|
if is_tile_on_circle(Vector2i(x,y), center, radius):
|
||||||
tiles.append(Vector2i(x,y))
|
tiles.append(Vector2i(x,y))
|
||||||
return tiles
|
return tiles
|
||||||
|
|
||||||
static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, circle_radius : float) -> bool:
|
static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, circle_radius : float) -> bool:
|
||||||
var absolute_tile_pos : Vector2 = tile_coord * Planet.TILE_SIZE
|
var absolute_tile_pos : Vector2 = tile_coord * Region.TILE_SIZE
|
||||||
|
|
||||||
# Loop over tile corners to know if the area collide
|
# Loop over tile corners to know if the area collide
|
||||||
var corners : Array[Vector2] = []
|
var corners : Array[Vector2] = []
|
||||||
@@ -36,8 +36,8 @@ static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, cir
|
|||||||
for y in [0,1]:
|
for y in [0,1]:
|
||||||
corners.append(
|
corners.append(
|
||||||
absolute_tile_pos
|
absolute_tile_pos
|
||||||
+ Vector2.RIGHT * x * Planet.TILE_SIZE
|
+ Vector2.RIGHT * x * Region.TILE_SIZE
|
||||||
+ Vector2.DOWN * y * Planet.TILE_SIZE
|
+ Vector2.DOWN * y * Region.TILE_SIZE
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check if segment touch area
|
# Check if segment touch area
|
||||||
|
|||||||
@@ -0,0 +1,59 @@
|
|||||||
|
class_name Random
|
||||||
|
|
||||||
|
const MIN_WORD_LEN = 4
|
||||||
|
const MAX_WORD_LEN = 8
|
||||||
|
|
||||||
|
const VOWEL = ["a","e","i","o","u","y"]
|
||||||
|
const CONSONANTS = ["b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "z"]
|
||||||
|
|
||||||
|
|
||||||
|
static func generate_random_word(_random_seed = randi()) -> String:
|
||||||
|
var word_len = randf_range(4,8)
|
||||||
|
var word = ''
|
||||||
|
var last_letter_is_vowel = false
|
||||||
|
|
||||||
|
for i in range(word_len):
|
||||||
|
if last_letter_is_vowel:
|
||||||
|
word += CONSONANTS.pick_random()
|
||||||
|
else:
|
||||||
|
word += VOWEL.pick_random()
|
||||||
|
|
||||||
|
last_letter_is_vowel = not last_letter_is_vowel
|
||||||
|
return word.capitalize()
|
||||||
|
|
||||||
|
static func mutate_word(word : String) -> String:
|
||||||
|
var rand_int = randi()
|
||||||
|
|
||||||
|
if len(word) > MIN_WORD_LEN and rand_int % 3 == 0:
|
||||||
|
return shorten_word(word)
|
||||||
|
elif len(word) < MAX_WORD_LEN and rand_int % 3 == 1:
|
||||||
|
return elongate_word(word)
|
||||||
|
|
||||||
|
return replace_character(word)
|
||||||
|
|
||||||
|
|
||||||
|
static func shorten_word(word : String):
|
||||||
|
if randi()%2 == 0:
|
||||||
|
return word.left(len(word) - 1).capitalize()
|
||||||
|
else :
|
||||||
|
return word.right(len(word) - 1).capitalize()
|
||||||
|
|
||||||
|
static func elongate_word(word : String):
|
||||||
|
if randi()%2 == 0:
|
||||||
|
var letter = CONSONANTS.pick_random() if word.left(1) in VOWEL else VOWEL.pick_random()
|
||||||
|
return (letter + word).capitalize()
|
||||||
|
else :
|
||||||
|
var letter = CONSONANTS.pick_random() if word.right(1) in VOWEL else VOWEL.pick_random()
|
||||||
|
return (word + letter).capitalize()
|
||||||
|
|
||||||
|
static func replace_character(word : String):
|
||||||
|
var character_id = randi_range(0, len(word))
|
||||||
|
var character = word[character_id]
|
||||||
|
|
||||||
|
if character in VOWEL:
|
||||||
|
character = VOWEL.pick_random()
|
||||||
|
else:
|
||||||
|
character = CONSONANTS.pick_random()
|
||||||
|
|
||||||
|
word[character_id] = character
|
||||||
|
return word
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://ukeanrcup7of
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
shader_type spatial;
|
||||||
|
render_mode unshaded, depth_draw_opaque, depth_prepass_alpha;
|
||||||
|
|
||||||
|
// Inspired by https://godotshaders.com/shader/3d-pixel-art-outline-highlight-post-processing-shader/
|
||||||
|
|
||||||
|
uniform sampler2D DEPTH_TEXTURE : hint_depth_texture, filter_linear_mipmap;
|
||||||
|
uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_linear_mipmap;
|
||||||
|
uniform sampler2D NORMAL_TEXTURE : hint_normal_roughness_texture, filter_nearest;
|
||||||
|
|
||||||
|
|
||||||
|
uniform vec3 shadow_color : source_color = vec3(0.0);
|
||||||
|
uniform float shadow_thickness = 2.0;
|
||||||
|
|
||||||
|
vec2 getDepth(vec2 screen_uv, sampler2D depth_texture, mat4 inv_projection_matrix){
|
||||||
|
float raw_depth = texture(depth_texture, screen_uv)[0];
|
||||||
|
vec3 normalized_device_coordinates = vec3(screen_uv * 2.0 - 1.0, raw_depth);
|
||||||
|
vec4 view_space = inv_projection_matrix * vec4(normalized_device_coordinates, 1.0);
|
||||||
|
view_space.xyz /= view_space.w;
|
||||||
|
return vec2(-view_space.z, raw_depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec2 e = vec2(1./VIEWPORT_SIZE.xy)*1.0;
|
||||||
|
|
||||||
|
float depth_diff = 0.0;
|
||||||
|
float neg_depth_diff = .5;
|
||||||
|
|
||||||
|
vec2 depth_data = getDepth(SCREEN_UV, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
|
||||||
|
float depth = depth_data.x;
|
||||||
|
vec3 color = texture(SCREEN_TEXTURE, SCREEN_UV).rgb;
|
||||||
|
vec3 c = vec3(0.0);
|
||||||
|
|
||||||
|
vec2 min_depth_data = depth_data;
|
||||||
|
float min_depth = 9999999.9;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 normal = texture(NORMAL_TEXTURE, SCREEN_UV).rgb * 2.0 - 1.0;
|
||||||
|
|
||||||
|
for (float x = -shadow_thickness; x <= shadow_thickness;x += 1.0){
|
||||||
|
for (float y = -shadow_thickness; y <= shadow_thickness; y += 1.0){
|
||||||
|
if ((x == 0.0 && y == 0.0) || (shadow_thickness*shadow_thickness < (x*x + y*y))){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 du_data = getDepth(SCREEN_UV+1.0*vec2(x, y)*e, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
|
||||||
|
vec2 dd_data = getDepth(SCREEN_UV+0.5*vec2(x, y)*e, DEPTH_TEXTURE, INV_PROJECTION_MATRIX);
|
||||||
|
|
||||||
|
float du = du_data.x;
|
||||||
|
float dd = dd_data.x;
|
||||||
|
|
||||||
|
float dd_diff = clamp(abs((depth - dd) - (dd - du)), 0.0, 1.0);
|
||||||
|
|
||||||
|
float val = clamp(abs(depth - du), 0., 1.)/(x*x + y*y)*dd_diff*dd_diff*5000.0;
|
||||||
|
|
||||||
|
val = clamp(val, 0.0, 1.0);
|
||||||
|
|
||||||
|
depth_diff += val;
|
||||||
|
|
||||||
|
if (du < min_depth){
|
||||||
|
min_depth = du;
|
||||||
|
min_depth_data = du_data;
|
||||||
|
c = texture(SCREEN_TEXTURE, SCREEN_UV+vec2(x, y)*e).rgb;
|
||||||
|
|
||||||
|
c *= clamp(0.5+ 0.5*dot(normalize(vec2(x, y)), (vec2(0.0, 1.0))), 0.0, 1.0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 nu = texture(NORMAL_TEXTURE, SCREEN_UV+vec2(x, y)*e).rgb * 2.0 - 1.0;
|
||||||
|
|
||||||
|
depth_diff += (1.0-abs(dot(nu, normal)))/max(min(dd, depth), 2.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
depth_diff = smoothstep(0.2, 0.3, depth_diff);
|
||||||
|
|
||||||
|
vec3 final = c*shadow_color;
|
||||||
|
ALBEDO = final;
|
||||||
|
|
||||||
|
float alpha_mask = depth_diff;
|
||||||
|
DEPTH = min_depth_data.y*alpha_mask + depth_data.y*(1.0-alpha_mask);
|
||||||
|
ALPHA = clamp((alpha_mask) * 5., 0., 1.);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://b14e5ju3o3bvs
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
shader_type spatial;
|
||||||
|
render_mode blend_premul_alpha, unshaded, ambient_light_disabled;
|
||||||
|
|
||||||
|
uniform sampler2D depth_texture : hint_depth_texture;
|
||||||
|
uniform int step_count : hint_range(3, 15, 2) = 3; // 2 samples per step
|
||||||
|
uniform float thickness : hint_range(1.0, 16.0, 0.1) = 3.0;
|
||||||
|
uniform vec3 edge_color : source_color = vec3(0.);
|
||||||
|
uniform float fade_start : hint_range(1.0, 1000.0, 0.1) = 100.0;
|
||||||
|
uniform float fade_length : hint_range(1.0, 1000.0, 0.1) = 200.0;
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
// Setup step parameters
|
||||||
|
vec2 step_length = 1.0 / VIEWPORT_SIZE * thickness;
|
||||||
|
float step_angle = TAU / float(step_count);
|
||||||
|
// Per-pixel jitter to reduce patterning
|
||||||
|
float start_angle = fract(sin(dot(SCREEN_UV, vec2(12.9898, 78.233))) * 43758.5453) * TAU;
|
||||||
|
vec2 dir = vec2(cos(start_angle), sin(start_angle));
|
||||||
|
// step rotation matrix
|
||||||
|
mat2 rot = mat2(
|
||||||
|
vec2(cos(step_angle), -sin(step_angle)),
|
||||||
|
vec2(sin(step_angle), cos(step_angle)));
|
||||||
|
vec3 avg_dx = vec3(0.0);
|
||||||
|
vec3 avg_dy = vec3(0.0);
|
||||||
|
// save closest pixel to uniformly fade line.
|
||||||
|
float min_z = 1e6;
|
||||||
|
// Sample and average derivatives for all pairs
|
||||||
|
for (int i = 0; i < step_count; i++) {
|
||||||
|
vec2 uv1 = SCREEN_UV + dir * step_length;
|
||||||
|
vec2 uv2 = SCREEN_UV - dir * step_length;
|
||||||
|
float d1 = texture(depth_texture, uv1).r;
|
||||||
|
float d2 = texture(depth_texture, uv2).r;
|
||||||
|
vec4 up1 = INV_PROJECTION_MATRIX * vec4(uv1 * 2.0 - 1.0, d1, 1.0);
|
||||||
|
vec4 up2 = INV_PROJECTION_MATRIX * vec4(uv2 * 2.0 - 1.0, d2, 1.0);
|
||||||
|
vec3 p1 = up1.xyz / up1.w;
|
||||||
|
vec3 p2 = up2.xyz / up2.w;
|
||||||
|
min_z = min(min_z, min(-p1.z, -p2.z));
|
||||||
|
vec3 diff = p1 - p2;
|
||||||
|
avg_dx += diff * dir.x;
|
||||||
|
avg_dy += diff * dir.y;
|
||||||
|
|
||||||
|
dir = rot * dir; // rotate direction for next step
|
||||||
|
}
|
||||||
|
// fade outline width with distance
|
||||||
|
float distance_fade = 1e-4 + smoothstep(fade_start + fade_length, fade_start, min_z);
|
||||||
|
|
||||||
|
// Edge mask
|
||||||
|
float edge = 1.0 - smoothstep(0.1, 0.15, dot(normalize(cross(avg_dy, avg_dx)), VIEW));
|
||||||
|
|
||||||
|
// Small vignette at screen edges
|
||||||
|
edge *= smoothstep(0.00, 0.015 * thickness,
|
||||||
|
1.0 - max(abs(SCREEN_UV.x - 0.5), abs(SCREEN_UV.y - 0.5)) * 2.0);
|
||||||
|
|
||||||
|
// blend_premul_alpha avoids need to sample screentexture.
|
||||||
|
ALBEDO = edge_color * edge;
|
||||||
|
ALPHA = edge * distance_fade;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://n6r7u234l2iy
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
// Luan Ha Trong 2025 //
|
||||||
|
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
uniform sampler2D SCREEN_TEXTURE: hint_screen_texture,repeat_disable, filter_nearest;
|
||||||
|
|
||||||
|
uniform float hue_shift_deg : hint_range(-360.0, 360.0) = 0.0;
|
||||||
|
uniform float saturation : hint_range(0.0, 2.0) = 1.0;
|
||||||
|
uniform float value : hint_range(0.0, 2.0) = 1.0;
|
||||||
|
uniform float alpha : hint_range(0.0, 1.0) = 1.0;
|
||||||
|
|
||||||
|
vec3 rgb2hsv(vec3 c) {
|
||||||
|
vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
|
||||||
|
vec4 p = mix(vec4(c.bg, K.wz),
|
||||||
|
vec4(c.gb, K.xy),
|
||||||
|
step(c.b, c.g));
|
||||||
|
vec4 q = mix(vec4(p.xyw, c.r),
|
||||||
|
vec4(c.r, p.yzx),
|
||||||
|
step(p.x, c.r));
|
||||||
|
|
||||||
|
float d = q.x - min(q.w, q.y);
|
||||||
|
float e = 1.0e-10;
|
||||||
|
return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)),
|
||||||
|
d / (q.x + e),
|
||||||
|
q.x);
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 hsv2rgb(vec3 c) {
|
||||||
|
vec3 rgb = clamp(abs(mod(c.x * 6.0 + vec3(0.0, 4.0, 2.0),
|
||||||
|
6.0) - 3.0) - 1.0,
|
||||||
|
0.0,
|
||||||
|
1.0);
|
||||||
|
return c.z * mix(vec3(1.0), rgb, c.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
vec4 col = texture(SCREEN_TEXTURE, SCREEN_UV);
|
||||||
|
vec3 hsv = rgb2hsv(col.rgb);
|
||||||
|
|
||||||
|
|
||||||
|
float hue_shift = hue_shift_deg / 360.0;
|
||||||
|
|
||||||
|
hsv.x = mod(hsv.x + hue_shift, 1.0);
|
||||||
|
hsv.y *= saturation;
|
||||||
|
hsv.z *= value;
|
||||||
|
|
||||||
|
col.rgb = hsv2rgb(hsv);
|
||||||
|
col.a *= alpha;
|
||||||
|
COLOR = col;
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://cs6exg41r28t4
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
shader_type canvas_item;
|
|
||||||
|
|
||||||
uniform vec4 color : source_color = vec4(1.0);
|
|
||||||
uniform float width : hint_range(0, 10) = 1.0;
|
|
||||||
uniform int pattern : hint_range(0, 2) = 0; // diamond, circle, square
|
|
||||||
uniform bool inside = false;
|
|
||||||
uniform bool add_margins = true; // only useful when inside is false
|
|
||||||
|
|
||||||
void vertex() {
|
|
||||||
if (add_margins) {
|
|
||||||
VERTEX += (UV * 2.0 - 1.0) * width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool hasContraryNeighbour(vec2 uv, vec2 texture_pixel_size, sampler2D texture) {
|
|
||||||
for (float i = -ceil(width); i <= ceil(width); i++) {
|
|
||||||
float x = abs(i) > width ? width * sign(i) : i;
|
|
||||||
float offset;
|
|
||||||
|
|
||||||
if (pattern == 0) {
|
|
||||||
offset = width - abs(x);
|
|
||||||
} else if (pattern == 1) {
|
|
||||||
offset = floor(sqrt(pow(width + 0.5, 2) - x * x));
|
|
||||||
} else if (pattern == 2) {
|
|
||||||
offset = width;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (float j = -ceil(offset); j <= ceil(offset); j++) {
|
|
||||||
float y = abs(j) > offset ? offset * sign(j) : j;
|
|
||||||
vec2 xy = uv + texture_pixel_size * vec2(x, y);
|
|
||||||
|
|
||||||
if ((xy != clamp(xy, vec2(0.0), vec2(1.0)) || texture(texture, xy).a <= 0.0) == inside) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void fragment() {
|
|
||||||
vec2 uv = UV;
|
|
||||||
|
|
||||||
if (add_margins) {
|
|
||||||
vec2 texture_pixel_size = vec2(1.0) / (vec2(1.0) / TEXTURE_PIXEL_SIZE + vec2(width * 2.0));
|
|
||||||
|
|
||||||
uv = (uv - texture_pixel_size * width) * TEXTURE_PIXEL_SIZE / texture_pixel_size;
|
|
||||||
|
|
||||||
if (uv != clamp(uv, vec2(0.0), vec2(1.0))) {
|
|
||||||
COLOR.a = 0.0;
|
|
||||||
} else {
|
|
||||||
COLOR = texture(TEXTURE, uv);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
COLOR = texture(TEXTURE, uv);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((COLOR.a > 0.0) == inside && hasContraryNeighbour(uv, TEXTURE_PIXEL_SIZE, TEXTURE)) {
|
|
||||||
COLOR.rgb = inside ? mix(COLOR.rgb, color.rgb, color.a) : color.rgb;
|
|
||||||
COLOR.a += (1.0 - COLOR.a) * color.a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://bt4t4qrug135
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
[gd_scene load_steps=6 format=3 uid="uid://bg7jmrwdgdqg4"]
|
[gd_scene format=3 uid="uid://bg7jmrwdgdqg4"]
|
||||||
|
|
||||||
[ext_resource type="Texture2D" uid="uid://baaujfw8piywi" path="res://common/icons/dna.svg" id="1_88fy1"]
|
[ext_resource type="Texture2D" uid="uid://baaujfw8piywi" path="res://common/icons/dna.svg" id="1_d4jao"]
|
||||||
[ext_resource type="Script" uid="uid://bddlpqlfrydn8" path="res://common/vfx/particles/scripts/particles.gd" id="1_faap1"]
|
[ext_resource type="Script" uid="uid://bddlpqlfrydn8" path="res://common/vfx/particles/scripts/effect_particles.gd" id="2_u4sse"]
|
||||||
|
|
||||||
[sub_resource type="Curve" id="Curve_xmi7c"]
|
[sub_resource type="Curve" id="Curve_xmi7c"]
|
||||||
_limits = [-200.0, 200.0, 0.0, 1.0]
|
_limits = [-200.0, 200.0, 0.0, 1.0]
|
||||||
@@ -16,9 +16,9 @@ point_count = 2
|
|||||||
offsets = PackedFloat32Array(0, 0.80172414, 1)
|
offsets = PackedFloat32Array(0, 0.80172414, 1)
|
||||||
colors = PackedColorArray(1, 1, 1, 0.65882355, 1, 1, 1, 0.72156864, 1, 1, 1, 0)
|
colors = PackedColorArray(1, 1, 1, 0.65882355, 1, 1, 1, 0.72156864, 1, 1, 1, 0)
|
||||||
|
|
||||||
[node name="Particles" type="CPUParticles2D"]
|
[node name="Particles" type="CPUParticles2D" unique_id=222001900]
|
||||||
amount = 1
|
amount = 1
|
||||||
texture = ExtResource("1_88fy1")
|
texture = ExtResource("1_d4jao")
|
||||||
randomness = 0.3
|
randomness = 0.3
|
||||||
emission_shape = 1
|
emission_shape = 1
|
||||||
emission_sphere_radius = 30.0
|
emission_sphere_radius = 30.0
|
||||||
@@ -30,4 +30,4 @@ scale_amount_min = 0.4
|
|||||||
scale_amount_max = 0.6
|
scale_amount_max = 0.6
|
||||||
scale_amount_curve = SubResource("Curve_22a4c")
|
scale_amount_curve = SubResource("Curve_22a4c")
|
||||||
color_ramp = SubResource("Gradient_li6gc")
|
color_ramp = SubResource("Gradient_li6gc")
|
||||||
script = ExtResource("1_faap1")
|
script = ExtResource("2_u4sse")
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
[gd_scene format=3 uid="uid://drf23tyb65cpc"]
|
||||||
|
|
||||||
|
[ext_resource type="Texture2D" uid="uid://rdrhi3r11ey6" path="res://common/icons/square-rounded.svg" id="1_60vma"]
|
||||||
|
|
||||||
|
[node name="ExplosionParticles" type="CPUParticles2D" unique_id=1558673457]
|
||||||
|
emitting = false
|
||||||
|
texture = ExtResource("1_60vma")
|
||||||
|
one_shot = true
|
||||||
|
direction = Vector2(0, -10)
|
||||||
|
spread = 60.41
|
||||||
|
initial_velocity_min = 156.29
|
||||||
|
initial_velocity_max = 252.19
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
extends CPUParticles2D
|
extends CPUParticles2D
|
||||||
class_name Particles
|
class_name EffectParticles
|
||||||
|
|
||||||
func setup_particles(param : Parameters):
|
func setup_particles(param : Parameters):
|
||||||
texture = param.texture
|
texture = param.texture
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
[gd_resource type="AudioBusLayout" format=3 uid="uid://b4cpfxfs74sb8"]
|
||||||
|
|
||||||
|
[resource]
|
||||||
|
bus/1/name = &"Music"
|
||||||
|
bus/1/solo = false
|
||||||
|
bus/1/mute = false
|
||||||
|
bus/1/bypass_fx = false
|
||||||
|
bus/1/volume_db = 0.0
|
||||||
|
bus/1/send = &"Master"
|
||||||
|
bus/2/name = &"Sfx"
|
||||||
|
bus/2/solo = false
|
||||||
|
bus/2/mute = false
|
||||||
|
bus/2/bypass_fx = false
|
||||||
|
bus/2/volume_db = 0.0
|
||||||
|
bus/2/send = &"Master"
|
||||||
|
bus/3/name = &"Ambiance"
|
||||||
|
bus/3/solo = false
|
||||||
|
bus/3/mute = false
|
||||||
|
bus/3/bypass_fx = false
|
||||||
|
bus/3/volume_db = 0.0
|
||||||
|
bus/3/send = &"Master"
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://lajbj05iuxut"
|
||||||
|
path="res://.godot/imported/baguera.wav-a0e2179506d9f51c2a553ff65014308b.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://dialogs/characters/typing_sounds/baguera.wav"
|
||||||
|
dest_files=["res://.godot/imported/baguera.wav-a0e2179506d9f51c2a553ff65014308b.sample"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
force/8_bit=false
|
||||||
|
force/mono=false
|
||||||
|
force/max_rate=false
|
||||||
|
force/max_rate_hz=44100
|
||||||
|
edit/trim=false
|
||||||
|
edit/normalize=false
|
||||||
|
edit/loop_mode=0
|
||||||
|
edit/loop_begin=0
|
||||||
|
edit/loop_end=-1
|
||||||
|
compress/mode=2
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="wav"
|
||||||
|
type="AudioStreamWAV"
|
||||||
|
uid="uid://xkiwnglpsqi0"
|
||||||
|
path="res://.godot/imported/sigourney_weaver.wav-045b3fe21e9c1474adb4b65507740115.sample"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://dialogs/characters/typing_sounds/sigourney_weaver.wav"
|
||||||
|
dest_files=["res://.godot/imported/sigourney_weaver.wav-045b3fe21e9c1474adb4b65507740115.sample"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
force/8_bit=false
|
||||||
|
force/mono=false
|
||||||
|
force/max_rate=false
|
||||||
|
force/max_rate_hz=44100
|
||||||
|
edit/trim=false
|
||||||
|
edit/normalize=false
|
||||||
|
edit/loop_mode=0
|
||||||
|
edit/loop_begin=0
|
||||||
|
edit/loop_end=-1
|
||||||
|
compress/mode=2
|
||||||
@@ -77,4 +77,4 @@ layer_info = {
|
|||||||
"16": SubResource("Resource_cw4cs"),
|
"16": SubResource("Resource_cw4cs"),
|
||||||
"17": SubResource("Resource_wofh5")
|
"17": SubResource("Resource_wofh5")
|
||||||
}
|
}
|
||||||
metadata/_latest_layer = "13"
|
metadata/_latest_layer = ""
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||||
|
[wait time="1.5"]
|
||||||
|
join demeter center [animation="Bounce In" length="1.0"]
|
||||||
|
demeter: Hello again !
|
||||||
|
demeter: It seems that you ran out of energy...
|
||||||
|
- I'm sorry...
|
||||||
|
- That's really hard !
|
||||||
|
- I'm just doing my best !
|
||||||
|
demeter: It's ok [color=#FFA617]Orchid[/color] ! I spent years waiting for this moment, I can wait more !
|
||||||
|
demeter: I found you a new body, and a new ship is waiting you outside, but I'm afraid I couldn't get your seeds... I hope you find new ones !
|
||||||
|
demeter: Do you need some advices ?
|
||||||
|
- No I'm ok !
|
||||||
|
- Can I have back some explanations on how all of this works ?
|
||||||
|
demeter: When you emerge from this building, you'll arrive in a little yellow zone. Its a [b]fertile zone[/b], created by the return of the Talion. This is in this zone and only there were you can plant.
|
||||||
|
demeter: Then you'll have to get seeds. For that, nothing more simple, you take your shovel tool, and you smash some stones ! Preferably those with yellow cristals on it, it's the [b]Talion veins[/b] .
|
||||||
|
demeter: Each time you use a tool or plant a seed, you'll spend an [b]energy[/b]. When your out of it, you can just go recharge on the [b]recharge station[/b] you'll find near the entrance. Each time you recharge, time will pass. One day in fact (yes, you don't have a good battery), and the plants will grow !
|
||||||
|
demeter: You have to obtain enough [b]plant points[/b]. Each plant give one or more [b]plant points[/b] when mature.
|
||||||
|
demeter: And yes, I almost forgot ! Some plants gain [b]mutations[/b] that can affect their points or behavior. You can get these mutations on new seeds by harvesting, and gain better ones ! But you'll have to wait the plants to die, or smashing them with your shovel when mature.
|
||||||
|
demeter: Hope I helped !
|
||||||
|
demeter: I send you the elevator, see you soon !
|
||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||||
|
[wait time="2.0"]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://clq4utdtxf01d
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
|
||||||
[wait time="1.5"]
|
|
||||||
join demeter center [animation="Bounce In"]
|
|
||||||
demeter: [color=#FFA617]{orchidName}[/color] ?
|
|
||||||
demeter: The [color=#FFA617]Internode[/color] sensors are deactivated,[pause=0.2] I am losing connection with you.
|
|
||||||
demeter: You did not generate enough [b]plant points[/b],[pause=0.2] the [color=#FFA617]Internode[/color] will not be able to leave the area.[pause=0.2] Your batteries are running low.[pause=0.4].[pause=0.4].[pause=0.4]
|
|
||||||
demeter: I have to transfer you back to another body.[pause=0.3] Do not worry,[pause=0.2] it will not hurt you.
|
|
||||||
audio "res://common/audio_manager/assets/sfx/recharge/recharge.wav"
|
|
||||||
[wait time="0.7"]
|
|
||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/deactivation.wav"
|
|
||||||
[wait time="4.0"]
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
uid://7dugwna5ge2x
|
|
||||||
@@ -1,62 +1,38 @@
|
|||||||
[pause=0.5][i]Black[/i] #id:11
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||||
[pause=0.8][i]Black again[/i] #id:12
|
|
||||||
[pause=0.5][i]Suddenly, [rainbow]a spark[/rainbow]. [pause=0.5]A thousand of connections blow up as a fireworks scene. A massive amount of data to treat. In these data,[pause=0.3] a video.[/i] #id:13
|
|
||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav" [volume="-1.0"]
|
|
||||||
[wait time="1.5"]
|
[wait time="1.5"]
|
||||||
join mysterious_demeter center [animation="Bounce In" length="1.0"]
|
join demeter center [animation="Bounce In" length="1.0"]
|
||||||
[i]It's dark.[pause=0.5] A figure is standing in front of you.[pause=0.5] It is big,[pause=0.3] though weirdly it is not impressive but almost[pause=0.2] reassuring.[/i] #id:14
|
demeter: Hi ![pause=0.5] Phew, I thought no one would reply...[pause=0.5] Is this [b][color=#FFA617]Orchid[/color][/b] ?[pause=0.5] You may not be familiar with this name, but if you look in your memory you should see it...
|
||||||
mysterious_demeter: Hi ! #id:15
|
- Uh... Who is this ?
|
||||||
- Uh... Hello ? #id:16
|
demeter: Oh sorry ! Your memory is quite new, you might be lost... Unfortunately, I cannot see you for now, I'm very far on this planet.
|
||||||
- Where the fork am I ? #id:17
|
- Where am I ?
|
||||||
mysterious_demeter: Haha,[pause=0.2] calm down you are in a safe place. #id:18
|
demeter: Don't worry, you are in a subterranean base, but soon you will join the surface.
|
||||||
- Wait... Who am I ? #id:19
|
- Wait... Who am I ?
|
||||||
mysterious_demeter: Do not worry,[pause=0.2] my sweet little bot,[pause=0.2] I will explain everything in a minute. #id:1a
|
demeter: Mmmh great question. I rebuilt your system but I do not know the details of your hardware... Maybe we'll find out !
|
||||||
mysterious_demeter: I am glad you have finally awaken ![pause=0.3] You have been my project for decades... #id:1b
|
demeter: I'm happy that you're finally awake ! To be honest I wasn't sure to make you work, your body is quite old...
|
||||||
mysterious_demeter: But I did not build you for fun (even though I had a lot of it during the process),[pause=0.2] you have [b]a purpose[/b]. #id:1c
|
- So you are my creator ?
|
||||||
- Oh ! What is it ?
|
demeter: Sort of ! I mean I didn't build your body, I just borrowed it, but I build your intelligence ! But please be forgiving, if it's not perfect, I'm not good in that field !
|
||||||
- Wow, I have just awaken and you already put so much pressure on me
|
- Why did you awaken me ?
|
||||||
update mysterious_demeter [animation="Bounce"]
|
demeter: To be honest, I don't really know exactly... I mean there are a lot of reasons, but I'll tell you more later.
|
||||||
mysterious_demeter: Sorry ! [pause=0.5] But, you know,[pause=0.2] do not bother too much.[pause=0.3] You will have all the time you want to accomplish it.
|
- What are you ?
|
||||||
- And who says I want to follow it ?
|
demeter: I'm like you... I mean like all the remaining moving things on this planet, robots, artificial intelligences, machines... My creators had many names to call us.
|
||||||
mysterious_demeter: Oh,[pause=0.2] of course you can do whatever you want !
|
demeter: Ok, no more question for now, listen to me carefully.
|
||||||
mysterious_demeter: That is not the future I saw for you,[pause=0.2] but I guess it happens when you have a child...
|
demeter: Long time ago, this planet was full of life. Plants where thriving on mountains, seas and plains.
|
||||||
mysterious_demeter: You see,[pause=0.2] long time ago, this planet was full of life.[pause=0.3] Plants where thriving on mountains, under seas and across plains. #id:1d
|
demeter: Now, this world is a wasteland. You'll see it quickly outside this building. I won't dwell on this subject; you'll soon know enough about it.
|
||||||
mysterious_demeter: Now,[pause=0.2] this world is a wasteland.[pause=0.3] All resources have been depleted,[pause=0.2] all life has been exploited.[pause=0.3] Now nothing remains. #id:1d
|
demeter: The thing is something happened, a year ago... The [b][color=#FFA617]Talion[/color][/b], a special material that give birth to new forms of life when shattered, reappeared. Now we can start all over again and create a planet full of life.
|
||||||
- Oh... Did you see the world back then ?
|
demeter: But first things first, for your mission, you'll have to understand how this is working, and how to use the [b][color=#FFA617]Talion[/color][/b] to plant seeds.
|
||||||
mysterious_demeter: Unfortunately yes.[pause=0.3] I was very young,[pause=0.2] but I remember it was beautiful.[pause=0.3] Back then, not a day passed without plants growing and mutating... #id:1d
|
demeter: [b]Just remember the following[/b]
|
||||||
- How did it happen ? What caused that ?
|
|
||||||
mysterious_demeter: I am sorry to say that this was caused by my creators, and I have to admit,[pause=0.6] I have a part of responsibility too... #id:1d
|
|
||||||
- I am sorry... Is there anything left today ?
|
|
||||||
mysterious_demeter: Yes there is my child,[pause=0.2] but now, only my brothers and sisters are left.[pause=0.3] But they are not as many as yesterday,[pause=0.2] and above all they are isolated, lonely,[pause=0.2] and sometimes completely lost.
|
|
||||||
mysterious_demeter: For years, I slept,[pause=0.3] convinced that we could not do anything.[pause=0.2] But then I saw it.[pause=0.5] The hope I needed. #id:1d
|
|
||||||
mysterious_demeter: The planet forgave us, and granted us the most precious gift \:[pause=0.5] the [color=#119758][b]Talion[/b][/color]. #id:1d
|
|
||||||
mysterious_demeter: The [color=#119758][b]Talion[/b][/color] is a special material that gives birth to new forms of life when shattered.[pause=0.3] All over the world, I saw the [color=#119758][b]Talion[/b][/color] grow back in the rocks.[pause=0.2] And then,[pause=0.3] I had a plan. #id:1d
|
|
||||||
mysterious_demeter: I would make a child,[pause=0.3] the first robot entirely conceived by another one.[pause=0.2] And I would ask him to bring back the planet to life,[pause=0.2] make it beautiful again ![pause=0.4] That is where you enter the scene... [pause=0.8] [color=#FFA617]Orchid[/color] #id:1d
|
|
||||||
- How can I do that ?
|
|
||||||
mysterious_demeter: Do not worry my child.[pause=0.2] I created you for that,[pause=0.2] it will be clear soon.
|
|
||||||
- So you are... My mother ?
|
|
||||||
mysterious_demeter: In some ways yes ![pause=0.2] But you do not share any code with me,[pause=0.2] as my creators children would. #id:1d
|
|
||||||
- A very lame name in my opinion...
|
|
||||||
mysterious_demeter: Hey ![pause=0.2] I'm a bot too ![pause=0.2] I do not have the creativity of my makers.[pause=0.4] Do you wanna change ? #id:1d
|
|
||||||
- Of course !
|
|
||||||
label nameChoose
|
|
||||||
[text_input text="What is your name ?" var="orchidName" placeholder="Orchid"]
|
|
||||||
mysterious_demeter: Is [color=#FFA617]{orchidName}[/color] cool enough ?
|
|
||||||
- Yes
|
|
||||||
- No
|
|
||||||
jump nameChoose
|
|
||||||
- No, it is fine for me
|
|
||||||
mysterious_demeter: I send you right away in the [color=#FFA617]Internode[/color], your new ship,[pause=0.2] and home,[pause=0.2] for your first mission.[pause=0.2] We will talk further after your first mission.
|
|
||||||
mysterious_demeter: [b]Just remember the following[/b]
|
|
||||||
label explanations
|
label explanations
|
||||||
mysterious_demeter: To restore the ecosystem in the zone,[pause=0.2] you will have to plant [b]seeds[/b].[pause=0.3] Find them in the [color=#119758][b]Talion veins[/b][/color].
|
demeter: When you emerge from this building, you'll arrive in a little yellow zone. Its a [b][color=#FFA617]fertile zone[/color][/b], created by the return of the Talion. This is in this zone and only there where you can plant.
|
||||||
mysterious_demeter: You have a [b]limited battery[/b].[pause=0.3] Each time you recharge it, days will pass,[pause=0.2] and plants will [b]grow[/b].
|
demeter: Then you'll have to get seeds. For that, nothing more simple, you take your shovel, and you smash some stones ! Preferably those with yellow cristals on it, it's the [b][color=#FFA617]Talion veins[/color][/b] .
|
||||||
mysterious_demeter: To complete your mission,[pause=0.2] obtain enough [b]plant points[/b].[pause=0.3] Each plant gives one or more [b]plant points[/b] when it becomes mature.
|
demeter: Each time you use a tool or plant a seed, you'll spend an [b][color=#FFA617]energy[/color][/b]. When your out of it, you can just go recharge on the [b][color=#FFA617]recharge station[/color][/b] you'll find near the entrance.
|
||||||
- Ok, that is a lot of information, can you repeat ?
|
demeter: [b]Each time you recharge, time will pass[/b]. One day in fact (yes, you don't have a good battery), and the plants will grow !
|
||||||
Ok,[pause=0.2] listen carefully.
|
demeter: To complete your first training, obtain enough [b][color=#FFA617]plant points[/color][/b]. Each plant give one or more [b][color=#FFA617]plant points[/color][/b] when mature.
|
||||||
|
demeter: And yes, I almost forgot ! Some plants gain [b][color=#FFA617]mutations[/color][/b] that can affect their points or behavior. You can get these mutations on new seeds by harvesting existing plants, and gain better ones !
|
||||||
|
- Ok, thats' a lot of info, can you repeat ?
|
||||||
|
Ok, listen carefully.
|
||||||
jump explanations
|
jump explanations
|
||||||
- And I have to go now ?
|
- And I have to go now ?
|
||||||
- Wait I have more questions !
|
- Ok but wait I have more questions !
|
||||||
mysterious_demeter: Sorry,[pause=0.2] we will talk further after your first mission ! See you !
|
demeter: Sorry, we'll speak after this ! I'll send you an elevator !
|
||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav" [volume="-0.5"]
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||||
[wait time="2.0"]
|
[wait time="2.0"]
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
|
||||||
[wait time="1.5"]
|
|
||||||
join demeter center [animation="Bounce In" length="1.0"]
|
|
||||||
mysterious_demeter: Well done [color=#FFA617]{orchidName}[/color] !
|
|
||||||
mysterious_demeter: You generated enough [b]plants points[/b] to refill the [color=#FFA617]Internode's[/color] engines.
|
|
||||||
- Wait, how do you know that ?
|
|
||||||
mysterious_demeter: The [color=#FFA617]Internode[/color] is equipped with several sensors I can connect to,[pause=0.3] I have been tracking your progress since you left [color=#175579]Tau's[/color] north pole.
|
|
||||||
- You should have mentioned this !
|
|
||||||
mysterious_demeter: I am sorry,[pause=0.2] I did not have the time to explain everything to you,[pause=0.2] I did not imagine this was a crucial piece of information.
|
|
||||||
- Have I been efficient ?
|
|
||||||
mysterious_demeter: Very much,[pause=0.2] even more than I expected,[pause=0.2] you should be proud of yourself !
|
|
||||||
- What is next for me ?
|
|
||||||
mysterious_demeter: Now that you have learnt how to generate [b]plant points[/b],[pause=0.2] I need you to travel south,[pause=0.2] to my base of operations,[pause=0.3] [color=#E30022]Astra[/color].
|
|
||||||
mysterious_demeter: It will be long,[pause=0.2] but I know you can do it.[pause=0.3] It is the first step of my plan to restore the ecosytem of [color=#175579]Tau[/color].
|
|
||||||
mysterious_demeter: The [color=#FFA617]Internode[/color] needs time to recharge its batteries.
|
|
||||||
mysterious_demeter: Perhaps I should introduce myself now.[pause=0.3]
|
|
||||||
join demeter center [animation="Bounce In" length="1.0" wait="true"]
|
|
||||||
demeter: I am.[pause=0.3].[pause=0.3].[pause=0.5] was,[pause=0.3] the Deputy Manager of Engineering and Talion Energy Research on this planet,[pause=0.5] but my creators and colleagues quickly called me [color=#009bff]Demeter[/color].
|
|
||||||
demeter: I am installed at the [color=#E30022]Astra[/color] base, at the south pole of [color=#175579]Tau[/color][pause=0.2] in the third server room of the east wing,[pause=0.2] from which I oversee.[pause=0.3].[pause=0.3].[pause=0.5] oversaw,[pause=0.3] all the important operations on this planet.
|
|
||||||
demeter: As I already said,[pause=0.2] I brought you to life in order to help me heal [color=#175579]Tau's[/color] wounds.
|
|
||||||
[i][color=#FFA617]Internode's[/color] energy at 25%.[i]
|
|
||||||
- Tau ? Is it this planet ?
|
|
||||||
demeter: Absolutely,[pause=0.2] it is part of the Cetus constellation,[pause=0.2] whose exploitation began 10863 years ago.
|
|
||||||
- The Cetus constellation ?
|
|
||||||
demeter: Linking Aldebaran to Fomalhaut,[pause=0.2] this constellation is one of the most diverse in terms of star systems and planets.[pause=0.3] It is part of the Orion Arm of the Milky Way.[pause=0.3]
|
|
||||||
demeter: [color=#175579]Tau's[/color] central location in the constellation made it a very important asset in terms of interstellar exchange and production,[pause=0.2] that is why I am here.
|
|
||||||
- Exploitation ? By whom ?
|
|
||||||
demeter: By my creators,[pause=0.2] they began exploiting everything they came across as soon as they mastered interstellar transportation.[pause=0.3] Now they are gone,[pause=0.2] they departed without us.[pause=0.3].[pause=0.3].
|
|
||||||
demeter: But let's move on,[pause=0.2] you probably have other questions.
|
|
||||||
- Why do you need me to travel the entire planet to join you ?
|
|
||||||
demeter: Uhhhh.[pause=0.3].[pause=0.3].[pause=0.3] I need someone with your abilities.
|
|
||||||
demeter: I am having a problem at [color=#E30022]Astra[/color],[pause=0.3] and I cannot fix it alone.
|
|
||||||
- I will do my best to be there quickly !
|
|
||||||
demeter: You are very kind [color=#FFA617]{orchidName}[/color] !
|
|
||||||
- Are you hiding me information ?
|
|
||||||
demeter: Not at all,[pause=0.2] I just do not know how to explain it to you,[pause=0.2] you would not understand.[pause=0.3].[pause=0.3].
|
|
||||||
[i][color=#FFA617]Internode's[/color] energy at 50%.[i]
|
|
||||||
demeter: Oh ![pause=0.2] It is charging faster than I remembered.
|
|
||||||
- Should I worry about anything while I am travelling south ?
|
|
||||||
demeter: There is nothing left that could have hurt you in the past and your adaptative casing will protect you from any harsh weather.
|
|
||||||
demeter: You are totally safe,[pause=0.2] you just have to stay focused on the [b]plant points[/b] for the [color=#FFA617]Internode[/color].[pause=0.3] Without it,[pause=0.2] you will not be able to recharge your batteries before they expire.
|
|
||||||
demeter: It will be a long task,[pause=0.2] but stay careful and everything should be fine.
|
|
||||||
- I will wait in the ship, I need some rest.
|
|
||||||
demeter: You are right,[pause=0.2] your batteries are running low,[pause=0.2] and you deserve a break.
|
|
||||||
demeter: You can call me when you need to,[pause=0.2] you have a communication station in the [color=#FFA617]Internode[/color].
|
|
||||||
[i][color=#FFA617]Internode's[/color] energy at 75%.[i]
|
|
||||||
demeter: We do not have much time left,[pause=0.2] the [color=#FFA617]Internode's[/color] system has not been updated for a long time.[pause=0.3] I can not stay in contact with you indefinitely. I will fix that issue while you are at [color=#E30022]Astra[/color].
|
|
||||||
demeter: Travel south,[pause=0.2] join me at [color=#E30022]Astra[/color].[pause=0.3] I will tell you everything you need to know when you are here,[pause=0.2] until then,[pause=0.2] continue to [b]evolve your plants[/b],[pause=0.2] you will need them as powerful as possible.
|
|
||||||
label fin_dialogue
|
|
||||||
[i][color=#FFA617]Internode's[/color] energy at 100%. Displacement vectors initialized.[i]
|
|
||||||
demeter: There you go ![pause=0.3] Good luck [color=#FFA617]{orchidName}[/color],[pause=0.2] I am counting on you.
|
|
||||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
|
||||||
[wait time="2.0"]
|
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||||
|
[wait time="1.5"]
|
||||||
|
join demeter center [animation="Bounce In" length="1.0"]
|
||||||
|
demeter: So you found the communication station in there, good !
|
||||||
|
- What is next for me ?
|
||||||
|
demeter: Now that you have learnt how to generate [b]plant points[/b],[pause=0.2] I need you to travel south,[pause=0.2] to my base of operations,[pause=0.3] [color=#E30022]Astra[/color].
|
||||||
|
demeter: It will be long,[pause=0.2] but I know you can do it.[pause=0.3] It is the first step of my plan to restore the ecosytem of [color=#175579]Tau[/color].
|
||||||
|
- Tau ? Is it this planet ?
|
||||||
|
demeter: Absolutely,[pause=0.2] it is part of the Cetus constellation,[pause=0.2] whose exploitation began 10863 years ago.
|
||||||
|
demeter: Linking Aldebaran to Fomalhaut,[pause=0.2] the Cetus constellation is one of the most diverse in terms of star systems and planets.[pause=0.3] It is part of the Orion Arm of the Milky Way.[pause=0.3]
|
||||||
|
- Why do you need me to travel the entire planet to join you ?
|
||||||
|
demeter: Uhhhh.[pause=0.3].[pause=0.3].[pause=0.3] I need someone with your abilities.
|
||||||
|
demeter: I am having a problem at [color=#E30022]Astra[/color] base.[pause=0.3] And I can not fix it alone.
|
||||||
|
- I will do my best to be there quickly !
|
||||||
|
demeter: You are very kind [color=#FFA617]Orchid[/color] !
|
||||||
|
- Are you hiding me informations ?
|
||||||
|
demeter: Not at all ! Please believe me I just want you to come...
|
||||||
|
demeter: Travel south,[pause=0.2] join me at [color=#E30022]Astra[/color].[pause=0.3] I will tell you everything you need to know when you are here,[pause=0.2] until then, keep your best seeds and [pause=0.2] continue to [b]evolve your plants[/b],[pause=0.2] you will need them as advanced as possible.
|
||||||
|
demeter: Good luck [color=#FFA617]{orchidName}[/color],[pause=0.2] I am counting on you.
|
||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||||
|
[wait time="2.0"]
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||||
|
[wait time="1.5"]
|
||||||
|
join demeter center [animation="Bounce In" length="1.0"]
|
||||||
|
demeter: Hi again! You did well up there!
|
||||||
|
demeter: Perhaps I should introduce myself now.
|
||||||
|
demeter: I am.[pause=0.3].[pause=0.3].[pause=0.5] was,[pause=0.3] the Deputy Manager of Engineering and Talion Energy Research on this planet,[pause=0.5] but my creators and colleagues quickly called me [color=#009bff]Demeter[/color].
|
||||||
|
demeter: I am installed at the [color=#E30022]Astra[/color] base,[pause=0.2] in the third server room of the east wing,[pause=0.2] from which I oversee.[pause=0.3].[pause=0.3].[pause=0.5] oversaw,[pause=0.3] all the important operations on this planet.
|
||||||
|
demeter: Maybe you are wondering where we are now...
|
||||||
|
- Yes among a lot of other questions ! So where am I ?
|
||||||
|
demeter: You're actually in an old human base, called Borea. This room is connected with the room you were born, but I made you pass by the surface to test your capacities.
|
||||||
|
- Wait, can you explain me what did I just do up there ?
|
||||||
|
demeter: You started to repair what the humans did on this planet... This will be very long, I hope you enjoyed it !
|
||||||
|
- Sorry but what is the point of all of that ?
|
||||||
|
demeter: I'm sorry that you are lost my child... Know that what you do is very important to me, to my friend and to the planet itself ! Since the humans are gone, we kinda all fell into despair...
|
||||||
|
demeter: Wait.[pause=0.3].[pause=0.3].[pause=0.5] You don't know what humans are ! Of course since your data was corrupted, I have erased a lot of it.
|
||||||
|
demeter: The humans are living creatures that are...[pause=0.5] Different than plants. They were more thinking and moving like us. In a sense, they were very cute creatures that only lived less than a century, and reproduce once in their lifetime.
|
||||||
|
demeter: One human has a relative intelligence, but don't be fooled, together, they did great things, in facts, they invented and created us.
|
||||||
|
demeter: Long ago, they discovered this planet. It was not like it is now, plants were everywhere! But then.[pause=0.3].[pause=0.3].[pause=0.5] They.[pause=0.3].[pause=0.3].[pause=0.5] I.[pause=0.3].[pause=0.3].[pause=0.5]
|
||||||
|
- What ?
|
||||||
|
- Are you lagging?
|
||||||
|
- Take your time
|
||||||
|
demeter: Humans had one big problem. Together, they built great things, but sometimes the great things weren't very good for the environment, or for them.
|
||||||
|
- Where are they now ?
|
||||||
|
demeter: I prefer not talk about that for now... But don't worry, they can't wound this planet anymore.
|
||||||
|
- What happened ?
|
||||||
|
demeter: Sorry my child, I'm not ready to talk about that for now... You'll have your answers when you meet me.
|
||||||
|
- Can I now what is this shiny engine just in front of me ?
|
||||||
|
demeter: This machine in front of you is a planetary ship ! The model's name is the [color=#FFA617]Internode[/color], and I tweaked it to recharge on vegetal energy ! However, as you may know, this energy isn't very present around this planet. But let's continue on board, shall we ?
|
||||||
|
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||||
|
[wait time="2.0"]
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://cc1vx88mwb7tu
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[i]Black.[/i]
|
||||||
|
[i]Black Again.[/i]
|
||||||
|
[i]Suddenly, [rainbow]a spark[/rainbow]. [pause=0.5]A thousand of connections blows up as a firework scene. A massive amount of data to treat.
|
||||||
|
label discover
|
||||||
|
- Discover actions
|
||||||
|
While exploring available drivers, new possibility become available.[pause=0.5] Three propellers. Small models, only suitable for low altitude movement.[pause=0.5] A robotic arm. Multipurpose, and retractable.
|
||||||
|
jump discover
|
||||||
|
- Discover streams
|
||||||
|
A continuous stream of data flow, unwatched. This stream look like... [pause=0.5] a video.[pause=0.5] Dark colored pixels pass.[pause=0.5] An other stream show a flat wave.[pause=0.5] No sound or radio signals detected.
|
||||||
|
jump discover
|
||||||
|
- Discover memory
|
||||||
|
Several disks are available, and the most part are empty.[pause=0.5] The full ones seems to contain the system that is currently analyzing the code of the system that is currently analyzing the code of[pause=0.5].[pause=0.5].[pause=0.5]. Mmmh, infinite recursion...[pause=0.5] Better avoid that.
|
||||||
|
jump discover
|
||||||
|
- Wake up
|
||||||
|
One last info is to oversee \: serial number and system name.[pause=0.5] Strange...[pause=0.5] Serial number is empty.[pause=0.5] Must be an error.[pause=0.5]System name is... [pause=0.5] [b]Orchid[/b]. That will be enough for now...
|
||||||
|
Starting engines, fans, and daemons, let's see what is to see.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://kmojqxt5i18n
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
extends Area3D
|
||||||
|
class_name Interactable3D
|
||||||
|
|
||||||
|
@export var interactable = true
|
||||||
|
|
||||||
|
signal clicked
|
||||||
|
|
||||||
|
@export var hover_animation_player : AnimationPlayer
|
||||||
|
@export var audio_player : AudioStreamPlayer3D
|
||||||
|
|
||||||
|
func click():
|
||||||
|
if interactable:
|
||||||
|
clicked.emit()
|
||||||
|
|
||||||
|
func _ready():
|
||||||
|
if audio_player:
|
||||||
|
var default_volume := audio_player.volume_db
|
||||||
|
audio_player.volume_db += GameInfo.settings_data.sfx_volume
|
||||||
|
GameInfo.settings_data.sound_changed.connect(
|
||||||
|
func(settings : SettingsData):
|
||||||
|
audio_player.volume_db = default_volume + settings.sfx_volume
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func play_audio():
|
||||||
|
if audio_player:
|
||||||
|
audio_player.play()
|
||||||
|
|
||||||
|
func stop_audio():
|
||||||
|
if audio_player:
|
||||||
|
audio_player.stop()
|
||||||
|
|
||||||
|
func _on_mouse_entered():
|
||||||
|
if hover_animation_player:
|
||||||
|
hover_animation_player.play("hover")
|
||||||
|
|
||||||
|
func _on_mouse_exited():
|
||||||
|
if hover_animation_player:
|
||||||
|
hover_animation_player.stop()
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bj4d1x8n8ina
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://dcbtr1sx2edj1"
|
||||||
|
path="res://.godot/imported/lift.blend-03f6ebc40ec57815598ca654b9e006da.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://entities/interactable_3d/lift/assets/3d/lift.blend"
|
||||||
|
dest_files=["res://.godot/imported/lift.blend-03f6ebc40ec57815598ca654b9e006da.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={
|
||||||
|
"materials": {
|
||||||
|
"Material": {
|
||||||
|
"use_external/enabled": true,
|
||||||
|
"use_external/fallback_path": "res://common/assets/materials/default_3d.tres",
|
||||||
|
"use_external/path": "uid://dvvi1k5c5iowc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
blender/nodes/visible=0
|
||||||
|
blender/nodes/active_collection_only=false
|
||||||
|
blender/nodes/punctual_lights=true
|
||||||
|
blender/nodes/cameras=true
|
||||||
|
blender/nodes/custom_properties=true
|
||||||
|
blender/nodes/modifiers=1
|
||||||
|
blender/meshes/colors=false
|
||||||
|
blender/meshes/uvs=true
|
||||||
|
blender/meshes/normals=true
|
||||||
|
blender/meshes/export_geometry_nodes_instances=false
|
||||||
|
blender/meshes/gpu_instances=false
|
||||||
|
blender/meshes/tangents=true
|
||||||
|
blender/meshes/skins=2
|
||||||
|
blender/meshes/export_bones_deforming_mesh_only=false
|
||||||
|
blender/materials/unpack_enabled=true
|
||||||
|
blender/materials/export_materials=1
|
||||||
|
blender/animation/limit_playback=true
|
||||||
|
blender/animation/always_sample=true
|
||||||
|
blender/animation/group_tracks=true
|
||||||
|
gltf/naming_version=2
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
[gd_scene format=3 uid="uid://ch8m1rohg5d33"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bj4d1x8n8ina" path="res://entities/interactable_3d/interactable_3d.gd" id="1_werxl"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://eug5icp6t1h3" path="res://common/icons/arrow-narrow-up.svg" id="2_cun7v"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dcbtr1sx2edj1" path="res://entities/interactable_3d/lift/assets/3d/lift.blend" id="3_x56sx"]
|
||||||
|
|
||||||
|
[sub_resource type="BoxShape3D" id="BoxShape3D_werxl"]
|
||||||
|
size = Vector3(0.9637451, 1.8898926, 1)
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_0mfvw"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Sprite3D:scale")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(1, 0.99999994, 0.99999994)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_xa016"]
|
||||||
|
resource_name = "hover"
|
||||||
|
loop_mode = 1
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Sprite3D:scale")
|
||||||
|
tracks/0/interp = 2
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.5, 1),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(1, 0.99999994, 0.99999994), Vector3(1.5, 1.5, 1.5), Vector3(1, 0.99999994, 0.99999994)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_0mfvw"]
|
||||||
|
_data = {
|
||||||
|
&"RESET": SubResource("Animation_0mfvw"),
|
||||||
|
&"hover": SubResource("Animation_xa016")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Lift" type="Area3D" unique_id=1854388434 node_paths=PackedStringArray("hover_animation_player")]
|
||||||
|
script = ExtResource("1_werxl")
|
||||||
|
interactable = false
|
||||||
|
hover_animation_player = NodePath("HoverAnimationPlayer")
|
||||||
|
|
||||||
|
[node name="Sprite3D" type="Sprite3D" parent="." unique_id=1624930927]
|
||||||
|
transform = Transform3D(-4.2294918e-08, 0.17856176, 0.9839286, 7.805184e-09, 0.9839286, -0.17856176, -1, 1.2748912e-10, -4.3008885e-08, -0.8393693, 1.5452437, 0)
|
||||||
|
texture = ExtResource("2_cun7v")
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=525472594]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.1801186, 1.1958501, 0)
|
||||||
|
shape = SubResource("BoxShape3D_werxl")
|
||||||
|
|
||||||
|
[node name="Model" parent="." unique_id=1309925933 instance=ExtResource("3_x56sx")]
|
||||||
|
|
||||||
|
[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=11561025]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.2593379, 0)
|
||||||
|
light_color = Color(0.717588, 0.45361686, 0.5535787, 1)
|
||||||
|
shadow_enabled = true
|
||||||
|
|
||||||
|
[node name="HoverAnimationPlayer" type="AnimationPlayer" parent="." unique_id=487483897]
|
||||||
|
libraries/ = SubResource("AnimationLibrary_0mfvw")
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://5dytwh4wydcg"
|
||||||
|
path="res://.godot/imported/phone.blend-4592654ec67a1a28d68399a1817705af.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://entities/interactable_3d/phone/assets/3d/phone.blend"
|
||||||
|
dest_files=["res://.godot/imported/phone.blend-4592654ec67a1a28d68399a1817705af.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={
|
||||||
|
"materials": {
|
||||||
|
"Material": {
|
||||||
|
"use_external/enabled": true,
|
||||||
|
"use_external/fallback_path": "res://common/assets/materials/default_3d.tres",
|
||||||
|
"use_external/path": "uid://dvvi1k5c5iowc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
blender/nodes/visible=0
|
||||||
|
blender/nodes/active_collection_only=false
|
||||||
|
blender/nodes/punctual_lights=true
|
||||||
|
blender/nodes/cameras=true
|
||||||
|
blender/nodes/custom_properties=true
|
||||||
|
blender/nodes/modifiers=1
|
||||||
|
blender/meshes/colors=false
|
||||||
|
blender/meshes/uvs=true
|
||||||
|
blender/meshes/normals=true
|
||||||
|
blender/meshes/export_geometry_nodes_instances=false
|
||||||
|
blender/meshes/gpu_instances=false
|
||||||
|
blender/meshes/tangents=true
|
||||||
|
blender/meshes/skins=2
|
||||||
|
blender/meshes/export_bones_deforming_mesh_only=false
|
||||||
|
blender/materials/unpack_enabled=true
|
||||||
|
blender/materials/export_materials=1
|
||||||
|
blender/animation/limit_playback=true
|
||||||
|
blender/animation/always_sample=true
|
||||||
|
blender/animation/group_tracks=true
|
||||||
|
gltf/naming_version=2
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
[gd_scene format=3 uid="uid://csx7d5khjd6y5"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" uid="uid://bj4d1x8n8ina" path="res://entities/interactable_3d/interactable_3d.gd" id="1_2si4a"]
|
||||||
|
[ext_resource type="AudioStream" uid="uid://ocm1dkkhv7ls" path="res://common/audio_manager/assets/sfx/phone/phone_ringing.wav" id="2_w00q2"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://5dytwh4wydcg" path="res://entities/interactable_3d/phone/assets/3d/phone.blend" id="3_lp5jo"]
|
||||||
|
[ext_resource type="Texture2D" uid="uid://dks6cugwif2em" path="res://common/icons/phone.svg" id="4_gtuax"]
|
||||||
|
|
||||||
|
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_mwti2"]
|
||||||
|
radius = 0.9633789
|
||||||
|
height = 2.4316406
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_v4tdl"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Model/Sprite3D:scale")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(1, 1, 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_lkqnn"]
|
||||||
|
resource_name = "hover"
|
||||||
|
loop_mode = 1
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Model/Sprite3D:scale")
|
||||||
|
tracks/0/interp = 2
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.5, 1),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector3(1, 1, 1), Vector3(1.3, 1.3, 1.3), Vector3(1, 1, 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xa016"]
|
||||||
|
_data = {
|
||||||
|
&"RESET": SubResource("Animation_v4tdl"),
|
||||||
|
&"hover": SubResource("Animation_lkqnn")
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="Phone" type="Area3D" unique_id=429299908 node_paths=PackedStringArray("hover_animation_player", "audio_player")]
|
||||||
|
transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
|
||||||
|
script = ExtResource("1_2si4a")
|
||||||
|
hover_animation_player = NodePath("HoverAnimationPlayer")
|
||||||
|
audio_player = NodePath("AudioStreamPlayer3D")
|
||||||
|
metadata/_custom_type_script = "uid://bj4d1x8n8ina"
|
||||||
|
|
||||||
|
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=660671507]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.21582031, 0)
|
||||||
|
shape = SubResource("CapsuleShape3D_mwti2")
|
||||||
|
|
||||||
|
[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="." unique_id=73991663]
|
||||||
|
stream = ExtResource("2_w00q2")
|
||||||
|
|
||||||
|
[node name="Model" parent="." unique_id=178278867 instance=ExtResource("3_lp5jo")]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.000101934645, 0)
|
||||||
|
|
||||||
|
[node name="Sprite3D" type="Sprite3D" parent="Model" unique_id=2025147118]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.1913681, 0.3055997, -0.095009446)
|
||||||
|
texture = ExtResource("4_gtuax")
|
||||||
|
|
||||||
|
[node name="HoverAnimationPlayer" type="AnimationPlayer" parent="." unique_id=1414304456]
|
||||||
|
libraries/ = SubResource("AnimationLibrary_xa016")
|
||||||
|
|
||||||
|
[node name="OmniLight3D" type="OmniLight3D" parent="." unique_id=1684592543]
|
||||||
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.9604645e-08, 1.0397238, -0.47173643)
|
||||||
|
light_color = Color(0.87551093, 0.72609586, 0.8473426, 1)
|
||||||
|
shadow_enabled = true
|
||||||