Compare commits
41 Commits
96d1a4f4dd
...
plant-buil
| 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 |
5
.gitignore
vendored
@@ -18,4 +18,7 @@ mono_crash.*.json
|
||||
|
||||
.vscode
|
||||
|
||||
.export/
|
||||
.export/
|
||||
|
||||
stw_demo_save.tres
|
||||
stw_settings.tres
|
||||
@@ -3,20 +3,21 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cl03vrbj5wsjk"
|
||||
path="res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.ctex"
|
||||
path.s3tc="res://.godot/imported/expand-icon.svg-26099b197ab0f314e2253848fcc22962.s3tc.ctex"
|
||||
metadata={
|
||||
"has_editor_variant": true,
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -24,7 +25,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -38,7 +39,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=true
|
||||
editor/convert_colors_with_editor_theme=true
|
||||
|
||||
@@ -3,20 +3,21 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://qx5bntelnslj"
|
||||
path="res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.ctex"
|
||||
path.s3tc="res://.godot/imported/update_portrait.svg-b90fa6163d3720d34df8578ce2aa35e1.s3tc.ctex"
|
||||
metadata={
|
||||
"has_editor_variant": true,
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -24,7 +25,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -38,7 +39,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=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
|
||||
var character_identifier: String:
|
||||
get:
|
||||
if character and not "{" in character_identifier:
|
||||
var identifier := character.get_identifier()
|
||||
if not identifier.is_empty():
|
||||
return identifier
|
||||
return character_identifier
|
||||
set(value):
|
||||
character_identifier = value
|
||||
character = DialogicResourceUtil.get_character_resource(value)
|
||||
if Engine.is_editor_hint() and ((not character) or (character and not character.portraits.has(portrait))):
|
||||
portrait = ""
|
||||
ui_update_needed.emit()
|
||||
get:
|
||||
if character and not "{" in character_identifier:
|
||||
var identifier := character.get_identifier()
|
||||
if not identifier.is_empty():
|
||||
return identifier
|
||||
return character_identifier
|
||||
set(value):
|
||||
character_identifier = value
|
||||
character = DialogicResourceUtil.get_character_resource(value)
|
||||
if Engine.is_editor_hint() and ((not character) or (character and not character.portraits.has(portrait))):
|
||||
portrait = ""
|
||||
ui_update_needed.emit()
|
||||
|
||||
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))+)")
|
||||
@@ -49,225 +49,225 @@ signal advance
|
||||
################################################################################
|
||||
|
||||
func _clear_state() -> void:
|
||||
dialogic.current_state_info.erase('text_sub_idx')
|
||||
_disconnect_signals()
|
||||
dialogic.current_state_info.erase('text_sub_idx')
|
||||
_disconnect_signals()
|
||||
|
||||
|
||||
func _execute() -> void:
|
||||
if text.is_empty():
|
||||
finish()
|
||||
return
|
||||
if text.is_empty():
|
||||
finish()
|
||||
return
|
||||
|
||||
## If the speaker is provided as an expression, parse it now.
|
||||
if "{" in character_identifier:
|
||||
character = null
|
||||
var character_name: String = dialogic.Expressions.execute_string(character_identifier)
|
||||
get_or_create_character(character_name)
|
||||
## If the speaker is provided as an expression, parse it now.
|
||||
if "{" in character_identifier:
|
||||
character = null
|
||||
var character_name: String = dialogic.Expressions.execute_string(character_identifier)
|
||||
get_or_create_character(character_name)
|
||||
|
||||
## Change Portrait and Active Speaker
|
||||
if dialogic.has_subsystem("Portraits"):
|
||||
if character:
|
||||
## Change Portrait and Active Speaker
|
||||
if dialogic.has_subsystem("Portraits"):
|
||||
if character:
|
||||
|
||||
dialogic.Portraits.change_speaker(character, portrait)
|
||||
dialogic.Portraits.change_speaker(character, portrait)
|
||||
|
||||
if portrait and dialogic.Portraits.is_character_joined(character):
|
||||
dialogic.Portraits.change_character_portrait(character, portrait)
|
||||
if portrait and dialogic.Portraits.is_character_joined(character):
|
||||
dialogic.Portraits.change_character_portrait(character, portrait)
|
||||
|
||||
else:
|
||||
dialogic.Portraits.change_speaker(null)
|
||||
else:
|
||||
dialogic.Portraits.change_speaker(null)
|
||||
|
||||
## Change and Type Sound Mood
|
||||
if character:
|
||||
dialogic.Text.update_name_label(character)
|
||||
## Change and Type Sound Mood
|
||||
if character:
|
||||
dialogic.Text.update_name_label(character)
|
||||
|
||||
var current_portrait: String = portrait
|
||||
if portrait.is_empty():
|
||||
current_portrait = dialogic.current_state_info["portraits"].get(character.get_identifier(), {}).get("portrait", "")
|
||||
var current_portrait: String = portrait
|
||||
if portrait.is_empty():
|
||||
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", "")
|
||||
dialogic.Text.update_typing_sound_mood_from_character(character, current_portrait_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)
|
||||
|
||||
else:
|
||||
dialogic.Text.update_name_label(null)
|
||||
dialogic.Text.update_typing_sound_mood()
|
||||
else:
|
||||
dialogic.Text.update_name_label(null)
|
||||
dialogic.Text.update_typing_sound_mood()
|
||||
|
||||
|
||||
## Handle style changes
|
||||
if dialogic.has_subsystem("Styles"):
|
||||
var current_base_style: String = dialogic.current_state_info.get("base_style")
|
||||
var current_style: String = dialogic.current_state_info.get("style", "")
|
||||
var character_style: String = "" if not character else character.custom_info.get("style", "")
|
||||
## Handle style changes
|
||||
if dialogic.has_subsystem("Styles"):
|
||||
var current_base_style: String = dialogic.current_state_info.get("base_style")
|
||||
var current_style: String = dialogic.current_state_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
|
||||
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"))
|
||||
await dialogic.get_tree().process_frame
|
||||
## 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):
|
||||
dialogic.Styles.change_style(dialogic.current_state_info.get("base_style", "Default"))
|
||||
await dialogic.get_tree().process_frame
|
||||
|
||||
## Change to the characters style if this character has one
|
||||
elif character and not character_style.is_empty():
|
||||
dialogic.Styles.change_style(character_style, false)
|
||||
await dialogic.get_tree().process_frame
|
||||
## Change to the characters style if this character has one
|
||||
elif character and not character_style.is_empty():
|
||||
dialogic.Styles.change_style(character_style, false)
|
||||
await dialogic.get_tree().process_frame
|
||||
|
||||
_connect_signals()
|
||||
_connect_signals()
|
||||
|
||||
var character_name_text := dialogic.Text.get_character_name_parsed(character)
|
||||
var final_text: String = get_property_translated('text')
|
||||
if ProjectSettings.get_setting('dialogic/text/split_at_new_lines', false):
|
||||
match ProjectSettings.get_setting('dialogic/text/split_at_new_lines_as', 0):
|
||||
0:
|
||||
final_text = final_text.replace('\n', '[n]')
|
||||
1:
|
||||
final_text = final_text.replace('\n', '[n+][br]')
|
||||
var character_name_text := dialogic.Text.get_character_name_parsed(character)
|
||||
var final_text: String = get_property_translated('text')
|
||||
if ProjectSettings.get_setting('dialogic/text/split_at_new_lines', false):
|
||||
match ProjectSettings.get_setting('dialogic/text/split_at_new_lines_as', 0):
|
||||
0:
|
||||
final_text = final_text.replace('\n', '[n]')
|
||||
1:
|
||||
final_text = final_text.replace('\n', '[n+][br]')
|
||||
|
||||
var split_text := []
|
||||
for i in split_regex.search_all(final_text):
|
||||
split_text.append([i.get_string().trim_prefix('[n]').trim_prefix('[n+]')])
|
||||
split_text[-1].append(i.get_string().begins_with('[n+]'))
|
||||
var split_text := []
|
||||
for i in split_regex.search_all(final_text):
|
||||
split_text.append([i.get_string().trim_prefix('[n]').trim_prefix('[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)):
|
||||
dialogic.Inputs.block_input(ProjectSettings.get_setting('dialogic/text/text_reveal_skip_delay', 0.1))
|
||||
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))
|
||||
|
||||
if reveal_next_segment:
|
||||
dialogic.Text.hide_next_indicators()
|
||||
if reveal_next_segment:
|
||||
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 is_append: bool = split_text[section_idx][1]
|
||||
var segment: String = dialogic.Text.parse_text(split_text[section_idx][0], 0)
|
||||
var is_append: bool = split_text[section_idx][1]
|
||||
|
||||
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})
|
||||
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})
|
||||
|
||||
await dialogic.Text.update_textbox(final_text, false)
|
||||
await dialogic.Text.update_textbox(final_text, false)
|
||||
|
||||
state = States.REVEALING
|
||||
_try_play_current_line_voice()
|
||||
final_text = dialogic.Text.update_dialog_text(final_text, false, is_append)
|
||||
state = States.REVEALING
|
||||
_try_play_current_line_voice()
|
||||
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
|
||||
# is a Choice event.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
dialogic.Text.skip_text_reveal()
|
||||
else:
|
||||
await dialogic.Text.text_finished
|
||||
# We must skip text animation before we potentially return when there
|
||||
# is a Choice event.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
dialogic.Text.skip_text_reveal()
|
||||
else:
|
||||
await dialogic.Text.text_finished
|
||||
|
||||
state = States.IDLE
|
||||
else:
|
||||
reveal_next_segment = true
|
||||
state = States.IDLE
|
||||
else:
|
||||
reveal_next_segment = true
|
||||
|
||||
# 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):
|
||||
dialogic.Text.show_next_indicators(true)
|
||||
# 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):
|
||||
dialogic.Text.show_next_indicators(true)
|
||||
|
||||
finish()
|
||||
return
|
||||
finish()
|
||||
return
|
||||
|
||||
elif dialogic.Inputs.auto_advance.is_enabled():
|
||||
dialogic.Text.show_next_indicators(false, true)
|
||||
dialogic.Inputs.auto_advance.start()
|
||||
else:
|
||||
dialogic.Text.show_next_indicators()
|
||||
elif dialogic.Inputs.auto_advance.is_enabled():
|
||||
dialogic.Text.show_next_indicators(false, true)
|
||||
dialogic.Inputs.auto_advance.start()
|
||||
else:
|
||||
dialogic.Text.show_next_indicators()
|
||||
|
||||
if section_idx == len(split_text)-1:
|
||||
state = States.DONE
|
||||
if section_idx == len(split_text)-1:
|
||||
state = States.DONE
|
||||
|
||||
# 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.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
await dialogic.Inputs.start_autoskip_timer()
|
||||
# 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.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
await dialogic.Inputs.start_autoskip_timer()
|
||||
|
||||
# Check if Auto-Skip is still enabled.
|
||||
if not dialogic.Inputs.auto_skip.enabled:
|
||||
await advance
|
||||
# Check if Auto-Skip is still enabled.
|
||||
if not dialogic.Inputs.auto_skip.enabled:
|
||||
await advance
|
||||
|
||||
else:
|
||||
await advance
|
||||
else:
|
||||
await advance
|
||||
|
||||
|
||||
finish()
|
||||
finish()
|
||||
|
||||
|
||||
func _mark_as_read(character_name_text: String, final_text: String) -> void:
|
||||
if dialogic.has_subsystem('History'):
|
||||
if character:
|
||||
dialogic.History.store_simple_history_entry(final_text, event_name, {'character':character_name_text, 'character_color':character.color})
|
||||
else:
|
||||
dialogic.History.store_simple_history_entry(final_text, event_name)
|
||||
dialogic.History.mark_event_as_visited()
|
||||
if dialogic.has_subsystem('History'):
|
||||
if character:
|
||||
dialogic.History.store_simple_history_entry(final_text, event_name, {'character':character_name_text, 'character_color':character.color})
|
||||
else:
|
||||
dialogic.History.store_simple_history_entry(final_text, event_name)
|
||||
dialogic.History.mark_event_as_visited()
|
||||
|
||||
|
||||
func _connect_signals() -> void:
|
||||
if not dialogic.Inputs.dialogic_action.is_connected(_on_dialogic_input_action):
|
||||
dialogic.Inputs.dialogic_action.connect(_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.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):
|
||||
dialogic.Inputs.auto_advance.autoadvance.connect(_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)
|
||||
|
||||
|
||||
## If the event is done, this method can clean-up signal connections.
|
||||
func _disconnect_signals() -> void:
|
||||
if dialogic.Inputs.dialogic_action.is_connected(_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):
|
||||
dialogic.Inputs.auto_advance.autoadvance.disconnect(_on_dialogic_input_autoadvance)
|
||||
if dialogic.Inputs.auto_skip.toggled.is_connected(_on_auto_skip_enable):
|
||||
dialogic.Inputs.auto_skip.toggled.disconnect(_on_auto_skip_enable)
|
||||
if dialogic.Inputs.dialogic_action.is_connected(_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):
|
||||
dialogic.Inputs.auto_advance.autoadvance.disconnect(_on_dialogic_input_autoadvance)
|
||||
if dialogic.Inputs.auto_skip.toggled.is_connected(_on_auto_skip_enable):
|
||||
dialogic.Inputs.auto_skip.toggled.disconnect(_on_auto_skip_enable)
|
||||
|
||||
|
||||
## Tries to play the voice clip for the current line.
|
||||
func _try_play_current_line_voice() -> void:
|
||||
# If Auto-Skip is enabled and we skip voice clips, we don't want to play.
|
||||
if (dialogic.Inputs.auto_skip.enabled
|
||||
and dialogic.Inputs.auto_skip.skip_voice):
|
||||
return
|
||||
# If Auto-Skip is enabled and we skip voice clips, we don't want to play.
|
||||
if (dialogic.Inputs.auto_skip.enabled
|
||||
and dialogic.Inputs.auto_skip.skip_voice):
|
||||
return
|
||||
|
||||
# Plays the audio region for the current line.
|
||||
if (dialogic.has_subsystem('Voice')
|
||||
and dialogic.Voice.is_voiced(dialogic.current_event_idx)):
|
||||
dialogic.Voice.play_voice()
|
||||
# Plays the audio region for the current line.
|
||||
if (dialogic.has_subsystem('Voice')
|
||||
and dialogic.Voice.is_voiced(dialogic.current_event_idx)):
|
||||
dialogic.Voice.play_voice()
|
||||
|
||||
|
||||
func _on_dialogic_input_action() -> void:
|
||||
match state:
|
||||
States.REVEALING:
|
||||
if dialogic.Text.is_text_reveal_skippable():
|
||||
dialogic.Text.skip_text_reveal()
|
||||
dialogic.Inputs.stop_timers()
|
||||
_:
|
||||
if dialogic.Inputs.manual_advance.is_enabled():
|
||||
advance.emit()
|
||||
dialogic.Inputs.stop_timers()
|
||||
match state:
|
||||
States.REVEALING:
|
||||
if dialogic.Text.is_text_reveal_skippable():
|
||||
dialogic.Text.skip_text_reveal()
|
||||
dialogic.Inputs.stop_timers()
|
||||
_:
|
||||
if dialogic.Inputs.manual_advance.is_enabled():
|
||||
advance.emit()
|
||||
dialogic.Inputs.stop_timers()
|
||||
|
||||
|
||||
func _on_dialogic_input_autoadvance() -> void:
|
||||
if state == States.IDLE or state == States.DONE:
|
||||
advance.emit()
|
||||
if state == States.IDLE or state == States.DONE:
|
||||
advance.emit()
|
||||
|
||||
|
||||
func _on_auto_skip_enable(enabled: bool) -> void:
|
||||
if not enabled:
|
||||
return
|
||||
if not enabled:
|
||||
return
|
||||
|
||||
match state:
|
||||
States.DONE:
|
||||
await dialogic.Inputs.start_autoskip_timer()
|
||||
match state:
|
||||
States.DONE:
|
||||
await dialogic.Inputs.start_autoskip_timer()
|
||||
|
||||
# If Auto-Skip is still enabled, advance the text.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
advance.emit()
|
||||
# If Auto-Skip is still enabled, advance the text.
|
||||
if dialogic.Inputs.auto_skip.enabled:
|
||||
advance.emit()
|
||||
|
||||
States.REVEALING:
|
||||
dialogic.Text.skip_text_reveal()
|
||||
States.REVEALING:
|
||||
dialogic.Text.skip_text_reveal()
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -276,12 +276,12 @@ func _on_auto_skip_enable(enabled: bool) -> void:
|
||||
################################################################################
|
||||
|
||||
func _init() -> void:
|
||||
event_name = "Text"
|
||||
set_default_color('Color1')
|
||||
event_category = "Main"
|
||||
event_sorting_index = 0
|
||||
expand_by_default = true
|
||||
help_page_path = "https://docs.dialogic.pro/writing-texts.html"
|
||||
event_name = "Text"
|
||||
set_default_color('Color1')
|
||||
event_category = "Main"
|
||||
event_sorting_index = 0
|
||||
expand_by_default = true
|
||||
help_page_path = "https://docs.dialogic.pro/writing-texts.html"
|
||||
|
||||
|
||||
|
||||
@@ -289,92 +289,92 @@ func _init() -> void:
|
||||
################################################################################
|
||||
|
||||
func to_text() -> String:
|
||||
var result := text.replace('\n', '\\\n').strip_edges(false).trim_suffix("\\")
|
||||
result = result.replace(':', '\\:')
|
||||
if result.is_empty():
|
||||
result = "<Empty Text Event>"
|
||||
var result := text.replace('\n', '\\\n').strip_edges(false).trim_suffix("\\")
|
||||
result = result.replace(':', '\\:')
|
||||
if result.is_empty():
|
||||
result = "<Empty Text Event>"
|
||||
|
||||
if character or character_identifier:
|
||||
var name := character_identifier
|
||||
if character:
|
||||
name = character.get_identifier()
|
||||
if name.count(" ") > 0:
|
||||
name = '"' + name + '"'
|
||||
if not portrait.is_empty():
|
||||
result = name+" ("+portrait+"): "+result
|
||||
else:
|
||||
result = name+": "+result
|
||||
for event in DialogicResourceUtil.get_event_cache():
|
||||
if not event is DialogicTextEvent and event.is_valid_event(result):
|
||||
result = '\\'+result
|
||||
break
|
||||
if character or character_identifier:
|
||||
var name := character_identifier
|
||||
if character:
|
||||
name = character.get_identifier()
|
||||
if name.count(" ") > 0:
|
||||
name = '"' + name + '"'
|
||||
if not portrait.is_empty():
|
||||
result = name+" ("+portrait+"): "+result
|
||||
else:
|
||||
result = name+": "+result
|
||||
for event in DialogicResourceUtil.get_event_cache():
|
||||
if not event is DialogicTextEvent and event.is_valid_event(result):
|
||||
result = '\\'+result
|
||||
break
|
||||
|
||||
return result
|
||||
return result
|
||||
|
||||
|
||||
func from_text(string:String) -> void:
|
||||
# Load default character
|
||||
# This is only of relevance if the default has been overriden (usually not)
|
||||
character = DialogicResourceUtil.get_character_resource(character_identifier)
|
||||
# Load default character
|
||||
# This is only of relevance if the default has been overriden (usually not)
|
||||
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'):
|
||||
portrait = result.get_string('portrait').strip_edges().trim_prefix('(').trim_suffix(')')
|
||||
if result.get_string('portrait'):
|
||||
portrait = result.get_string('portrait').strip_edges().trim_prefix('(').trim_suffix(')')
|
||||
|
||||
if result and not result.get_string('name').is_empty():
|
||||
var name := result.get_string('name').strip_edges()
|
||||
if result and not result.get_string('name').is_empty():
|
||||
var name := result.get_string('name').strip_edges()
|
||||
|
||||
if name == '_':
|
||||
character = null
|
||||
elif "{" in name:
|
||||
## If it's an expression, we load the character in _execute.
|
||||
character_identifier = name
|
||||
character = null
|
||||
else:
|
||||
get_or_create_character(name)
|
||||
if name == '_':
|
||||
character = null
|
||||
elif "{" in name:
|
||||
## If it's an expression, we load the character in _execute.
|
||||
character_identifier = name
|
||||
character = null
|
||||
else:
|
||||
get_or_create_character(name)
|
||||
|
||||
if not result:
|
||||
return
|
||||
if not result:
|
||||
return
|
||||
|
||||
text = result.get_string('text').replace("\\\n", "\n").replace('\\:', ':').strip_edges().trim_prefix('\\')
|
||||
if text == '<Empty Text Event>':
|
||||
text = ""
|
||||
text = result.get_string('text').replace("\\\n", "\n").replace('\\:', ':').strip_edges().trim_prefix('\\')
|
||||
if text == '<Empty Text Event>':
|
||||
text = ""
|
||||
|
||||
|
||||
func get_or_create_character(name:String) -> void:
|
||||
character = DialogicResourceUtil.get_character_resource(name)
|
||||
character = DialogicResourceUtil.get_character_resource(name)
|
||||
|
||||
if character == null:
|
||||
if Engine.is_editor_hint() == false:
|
||||
character = DialogicCharacter.new()
|
||||
character.display_name = name
|
||||
character.set_identifier(name)
|
||||
if portrait:
|
||||
if "{" in portrait:
|
||||
character.color = Color(dialogic.Expressions.execute_string(portrait))
|
||||
else:
|
||||
character.color = Color(portrait)
|
||||
else:
|
||||
character_identifier = name
|
||||
if character == null:
|
||||
if Engine.is_editor_hint() == false:
|
||||
character = DialogicCharacter.new()
|
||||
character.display_name = name
|
||||
character.set_identifier(name)
|
||||
if portrait:
|
||||
if "{" in portrait:
|
||||
character.color = Color(dialogic.Expressions.execute_string(portrait))
|
||||
else:
|
||||
character.color = Color(portrait)
|
||||
else:
|
||||
character_identifier = name
|
||||
|
||||
|
||||
func is_valid_event(_string:String) -> bool:
|
||||
return true
|
||||
return true
|
||||
|
||||
|
||||
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 way the module manager can add custom default overrides to this event.
|
||||
func get_shortcode_parameters() -> Dictionary:
|
||||
return {
|
||||
#param_name : property_info
|
||||
"character" : {"property": "character_identifier", "default": "", "ext_file":true},
|
||||
"portrait" : {"property": "portrait", "default": ""},
|
||||
}
|
||||
return {
|
||||
#param_name : property_info
|
||||
"character" : {"property": "character_identifier", "default": "", "ext_file":true},
|
||||
"portrait" : {"property": "portrait", "default": ""},
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -382,14 +382,14 @@ func get_shortcode_parameters() -> Dictionary:
|
||||
################################################################################
|
||||
|
||||
func _get_translatable_properties() -> Array:
|
||||
return ['text']
|
||||
return ['text']
|
||||
|
||||
|
||||
func _get_property_original_translation(property:String) -> String:
|
||||
match property:
|
||||
'text':
|
||||
return text
|
||||
return ''
|
||||
match property:
|
||||
'text':
|
||||
return text
|
||||
return ''
|
||||
|
||||
|
||||
#endregion
|
||||
@@ -399,44 +399,44 @@ func _get_property_original_translation(property:String) -> String:
|
||||
################################################################################
|
||||
|
||||
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:
|
||||
add_header_edit('character_identifier', ValueType.DYNAMIC_OPTIONS,
|
||||
{'file_extension' : '.dch',
|
||||
'mode' : 2,
|
||||
'suggestions_func' : get_character_suggestions,
|
||||
'placeholder' : '(No one)',
|
||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/character.svg")}, 'do_any_characters_exist()')
|
||||
add_header_edit('portrait', ValueType.DYNAMIC_OPTIONS,
|
||||
{'suggestions_func' : get_portrait_suggestions,
|
||||
'placeholder' : "(Don't change)",
|
||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/portrait.svg"),
|
||||
'collapse_when_empty': true,},
|
||||
'should_show_portrait_selector()')
|
||||
add_body_edit('text', ValueType.MULTILINE_TEXT, {'autofocus':true})
|
||||
add_header_edit('character_identifier', ValueType.DYNAMIC_OPTIONS,
|
||||
{'file_extension' : '.dch',
|
||||
'mode' : 2,
|
||||
'suggestions_func' : get_character_suggestions,
|
||||
'placeholder' : '(No one)',
|
||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/character.svg")}, 'do_any_characters_exist()')
|
||||
add_header_edit('portrait', ValueType.DYNAMIC_OPTIONS,
|
||||
{'suggestions_func' : get_portrait_suggestions,
|
||||
'placeholder' : "(Don't change)",
|
||||
'icon' : load("res://addons/dialogic/Editor/Images/Resources/portrait.svg"),
|
||||
'collapse_when_empty': true,},
|
||||
'should_show_portrait_selector()')
|
||||
add_body_edit('text', ValueType.MULTILINE_TEXT, {'autofocus':true})
|
||||
|
||||
|
||||
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:
|
||||
return not DialogicResourceUtil.get_character_directory().is_empty()
|
||||
return not DialogicResourceUtil.get_character_directory().is_empty()
|
||||
|
||||
|
||||
func get_character_suggestions(search_text:String) -> Dictionary:
|
||||
var suggestions := DialogicUtil.get_character_suggestions(search_text, character, true, false, editor_node)
|
||||
if search_text and not search_text in suggestions:
|
||||
suggestions[search_text] = {
|
||||
"value":search_text,
|
||||
"tooltip": "A temporary character, created on the spot.",
|
||||
"editor_icon":["GuiEllipsis", "EditorIcons"]}
|
||||
return suggestions
|
||||
var suggestions := DialogicUtil.get_character_suggestions(search_text, character, true, false, editor_node)
|
||||
if search_text and not search_text in suggestions:
|
||||
suggestions[search_text] = {
|
||||
"value":search_text,
|
||||
"tooltip": "A temporary character, created on the spot.",
|
||||
"editor_icon":["GuiEllipsis", "EditorIcons"]}
|
||||
return suggestions
|
||||
|
||||
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
|
||||
|
||||
@@ -447,45 +447,45 @@ func get_portrait_suggestions(search_text:String) -> Dictionary:
|
||||
var completion_text_character_getter_regex := RegEx.new()
|
||||
var completion_text_effects := {}
|
||||
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():
|
||||
completion_text_character_getter_regex.compile("(\"[^\"]*\"|[^\\s:]*)")
|
||||
if completion_text_character_getter_regex.get_pattern().is_empty():
|
||||
completion_text_character_getter_regex.compile("(\"[^\"]*\"|[^\\s:]*)")
|
||||
|
||||
if completion_text_effects.is_empty():
|
||||
for idx in DialogicUtil.get_indexers():
|
||||
for effect in idx._get_text_effects():
|
||||
completion_text_effects[effect['command']] = effect
|
||||
if completion_text_effects.is_empty():
|
||||
for idx in DialogicUtil.get_indexers():
|
||||
for effect in idx._get_text_effects():
|
||||
completion_text_effects[effect['command']] = effect
|
||||
|
||||
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('"')
|
||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character)
|
||||
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('"')
|
||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character)
|
||||
|
||||
if symbol == '[':
|
||||
suggest_bbcode(TextNode)
|
||||
for effect in completion_text_effects.values():
|
||||
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"))
|
||||
else:
|
||||
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 == '[':
|
||||
suggest_bbcode(TextNode)
|
||||
for effect in completion_text_effects.values():
|
||||
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"))
|
||||
else:
|
||||
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 == '{':
|
||||
CodeCompletionHelper.suggest_variables(TextNode)
|
||||
if symbol == '{':
|
||||
CodeCompletionHelper.suggest_variables(TextNode)
|
||||
|
||||
if symbol == '=':
|
||||
if CodeCompletionHelper.get_line_untill_caret(line).ends_with('[portrait='):
|
||||
var completion_character := completion_text_character_getter_regex.search(line).get_string('name')
|
||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character, ']')
|
||||
if symbol == '=':
|
||||
if CodeCompletionHelper.get_line_untill_caret(line).ends_with('[portrait='):
|
||||
var completion_character := completion_text_character_getter_regex.search(line).get_string('name')
|
||||
CodeCompletionHelper.suggest_portraits(TextNode, completion_character, ']')
|
||||
|
||||
|
||||
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):
|
||||
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_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+']]:
|
||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("ArrowRight", "EditorIcons"),)
|
||||
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_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+']]:
|
||||
TextNode.add_code_completion_option(CodeEdit.KIND_MEMBER, i[0], i[1], TextNode.syntax_highlighter.normal_color, TextNode.get_theme_icon("ArrowRight", "EditorIcons"),)
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -496,56 +496,56 @@ func suggest_bbcode(TextNode:CodeEdit):
|
||||
var text_effects := ""
|
||||
var text_effects_regex := RegEx.new()
|
||||
func load_text_effects() -> void:
|
||||
if text_effects.is_empty():
|
||||
for idx in DialogicUtil.get_indexers():
|
||||
for effect in idx._get_text_effects():
|
||||
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"
|
||||
if text_effects_regex.get_pattern().is_empty():
|
||||
text_effects_regex.compile("(?<!\\\\)\\[\\s*/?(?<command>"+text_effects+")\\s*(=\\s*(?<value>.+?)\\s*)?\\]")
|
||||
if text_effects.is_empty():
|
||||
for idx in DialogicUtil.get_indexers():
|
||||
for effect in idx._get_text_effects():
|
||||
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"
|
||||
if text_effects_regex.get_pattern().is_empty():
|
||||
text_effects_regex.compile("(?<!\\\\)\\[\\s*/?(?<command>"+text_effects+")\\s*(=\\s*(?<value>.+?)\\s*)?\\]")
|
||||
|
||||
|
||||
var text_random_word_regex := RegEx.new()
|
||||
var text_effect_color := Color('#898276')
|
||||
func _get_syntax_highlighting(Highlighter:SyntaxHighlighter, dict:Dictionary, line:String) -> Dictionary:
|
||||
load_text_effects()
|
||||
if text_random_word_regex.get_pattern().is_empty():
|
||||
text_random_word_regex.compile(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
|
||||
load_text_effects()
|
||||
if text_random_word_regex.get_pattern().is_empty():
|
||||
text_random_word_regex.compile(r"(?<!\\)\<[^\>]+(\/[^\>]*)\>")
|
||||
|
||||
var result := regex.search(line)
|
||||
if not result:
|
||||
return dict
|
||||
if Highlighter.mode == Highlighter.Modes.FULL_HIGHLIGHTING:
|
||||
if result.get_string('name'):
|
||||
dict[result.get_start('name')] = {"color":Highlighter.character_name_color}
|
||||
dict[result.get_end('name')] = {"color":Highlighter.normal_color}
|
||||
if result.get_string('portrait'):
|
||||
dict[result.get_start('portrait')] = {"color":Highlighter.character_portrait_color}
|
||||
dict[result.get_end('portrait')] = {"color":Highlighter.normal_color}
|
||||
if result.get_string('text'):
|
||||
var result := regex.search(line)
|
||||
if not result:
|
||||
return dict
|
||||
if Highlighter.mode == Highlighter.Modes.FULL_HIGHLIGHTING:
|
||||
if result.get_string('name'):
|
||||
dict[result.get_start('name')] = {"color":Highlighter.character_name_color}
|
||||
dict[result.get_end('name')] = {"color":Highlighter.normal_color}
|
||||
if result.get_string('portrait'):
|
||||
dict[result.get_start('portrait')] = {"color":Highlighter.character_portrait_color}
|
||||
dict[result.get_end('portrait')] = {"color":Highlighter.normal_color}
|
||||
if result.get_string('text'):
|
||||
|
||||
## Color the random selection modifier
|
||||
for replace_mod_match in text_random_word_regex.search_all(result.get_string('text')):
|
||||
var color: Color = Highlighter.string_color
|
||||
color = color.lerp(Highlighter.normal_color, 0.4)
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')] = {'color':Highlighter.string_color}
|
||||
var offset := 1
|
||||
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)
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':color}
|
||||
offset += len(b.get_string())
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':Highlighter.string_color}
|
||||
offset += 1
|
||||
dict[replace_mod_match.get_end()+result.get_start('text')] = {'color':Highlighter.normal_color}
|
||||
## Color the random selection modifier
|
||||
for replace_mod_match in text_random_word_regex.search_all(result.get_string('text')):
|
||||
var color: Color = Highlighter.string_color
|
||||
color = color.lerp(Highlighter.normal_color, 0.4)
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')] = {'color':Highlighter.string_color}
|
||||
var offset := 1
|
||||
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)
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':color}
|
||||
offset += len(b.get_string())
|
||||
dict[replace_mod_match.get_start()+result.get_start('text')+offset] = {'color':Highlighter.string_color}
|
||||
offset += 1
|
||||
dict[replace_mod_match.get_end()+result.get_start('text')] = {'color':Highlighter.normal_color}
|
||||
|
||||
## Color bbcode and text effects
|
||||
var effects_result := text_effects_regex.search_all(line)
|
||||
for eff in effects_result:
|
||||
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_end()] = {"color":prev_color}
|
||||
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
|
||||
## Color bbcode and text effects
|
||||
var effects_result := text_effects_regex.search_all(line)
|
||||
for eff in effects_result:
|
||||
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_end()] = {"color":prev_color}
|
||||
dict = Highlighter.color_region(dict, Highlighter.variable_color, line, '{', '}', result.get_start('text'))
|
||||
|
||||
return dict
|
||||
return dict
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -12,7 +12,7 @@ dest_files=["res://.godot/imported/ambiance_Demeter.ogg-ee9f7eeda2d23a3915bf6592
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop=true
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
|
||||
BIN
common/audio_manager/assets/ambiance/vaisseau/ship_ambience.ogg
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://d3jou8c7c536c"
|
||||
path="res://.godot/imported/ship_ambience.ogg-e3739ef3659489a38bbb2970034a7b9a.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/ambiance/vaisseau/ship_ambience.ogg"
|
||||
dest_files=["res://.godot/imported/ship_ambience.ogg-e3739ef3659489a38bbb2970034a7b9a.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://brtjlgjqnrvcb"
|
||||
uid="uid://dadg6o6dl2k6t"
|
||||
path="res://.godot/imported/truck_music.ogg-71e4f19f9a59a19e62e72df06380f7df.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
@@ -12,8 +12,8 @@ dest_files=["res://.godot/imported/truck_music.ogg-71e4f19f9a59a19e62e72df06380f
|
||||
|
||||
[params]
|
||||
|
||||
loop=true
|
||||
loop_offset=0.0
|
||||
bpm=0.0
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
|
||||
BIN
common/audio_manager/assets/morceaux/niveau_v2/mines_phase_2.ogg
Normal file
@@ -0,0 +1,19 @@
|
||||
[remap]
|
||||
|
||||
importer="oggvorbisstr"
|
||||
type="AudioStreamOggVorbis"
|
||||
uid="uid://b1hut6lc1jevh"
|
||||
path="res://.godot/imported/mines_phase_2.ogg-3c0a31b97007a40bd6aa91f1f208f9d3.oggvorbisstr"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/morceaux/niveau_v2/mines_phase_2.ogg"
|
||||
dest_files=["res://.godot/imported/mines_phase_2.ogg-3c0a31b97007a40bd6aa91f1f208f9d3.oggvorbisstr"]
|
||||
|
||||
[params]
|
||||
|
||||
loop=false
|
||||
loop_offset=0
|
||||
bpm=0
|
||||
beat_count=0
|
||||
bar_beats=4
|
||||
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://dsrft8ing7qwj"
|
||||
path="res://.godot/imported/closing_transmission.wav-2a60c34966d2ae692c46d5740f5d3f94.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||
dest_files=["res://.godot/imported/closing_transmission.wav-2a60c34966d2ae692c46d5740f5d3f94.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
|
||||
BIN
common/audio_manager/assets/sfx/dialogs/sfx/deactivation.wav
Normal file
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://c8cwobmqg80dw"
|
||||
path="res://.godot/imported/deactivation.wav-f941c93b81a553c4a9b003d564a3ce38.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/dialogs/sfx/deactivation.wav"
|
||||
dest_files=["res://.godot/imported/deactivation.wav-f941c93b81a553c4a9b003d564a3ce38.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://dk87b7iet1sae"
|
||||
path="res://.godot/imported/incoming_transmission.wav-636f576bb9d1fcafc6fd9813344a7a1f.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/dialogs/sfx/incoming_transmission.wav"
|
||||
dest_files=["res://.godot/imported/incoming_transmission.wav-636f576bb9d1fcafc6fd9813344a7a1f.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
|
||||
BIN
common/audio_manager/assets/sfx/phone/phone_ringing.wav
Normal file
@@ -0,0 +1,24 @@
|
||||
[remap]
|
||||
|
||||
importer="wav"
|
||||
type="AudioStreamWAV"
|
||||
uid="uid://ocm1dkkhv7ls"
|
||||
path="res://.godot/imported/phone_ringing.wav-a6cb60c7f7d9ed8d10532f5bd69157cf.sample"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/audio_manager/assets/sfx/phone/phone_ringing.wav"
|
||||
dest_files=["res://.godot/imported/phone_ringing.wav-a6cb60c7f7d9ed8d10532f5bd69157cf.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=2
|
||||
edit/loop_begin=0
|
||||
edit/loop_end=-1
|
||||
compress/mode=2
|
||||
BIN
common/audio_manager/assets/sfx/signal/signal.mp3
Normal file
19
common/audio_manager/assets/sfx/signal/signal.mp3.import
Normal file
@@ -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,4 +1,4 @@
|
||||
[gd_scene load_steps=28 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="AudioStream" uid="uid://dipnmlprwfo12" path="res://common/audio_manager/assets/ambiance/niveau/ambiance_phase_1.ogg" id="2_tuvql"]
|
||||
@@ -6,12 +6,13 @@
|
||||
[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://bpf6witukorka" path="res://common/audio_manager/assets/morceaux/autres/main_menu.ogg" id="7_tuvql"]
|
||||
[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://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://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://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://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://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"]
|
||||
@@ -36,6 +37,11 @@ stream_0/stream = ExtResource("9_gv65y")
|
||||
stream_1/stream = ExtResource("10_n7o7n")
|
||||
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"]
|
||||
random_pitch = 1.2
|
||||
streams_count = 1
|
||||
@@ -56,52 +62,55 @@ streams_count = 2
|
||||
stream_0/stream = ExtResource("20_pu6t4")
|
||||
stream_1/stream = ExtResource("21_dk5s6")
|
||||
|
||||
[node name="AudioManager" type="Node"]
|
||||
[node name="AudioManager" type="Node" unique_id=1871137180]
|
||||
process_mode = 3
|
||||
script = ExtResource("1_0tvca")
|
||||
default_fade_time = 2.0
|
||||
|
||||
[node name="Ambiance" type="Node" parent="."]
|
||||
[node name="Ambiance" type="Node" parent="." unique_id=1989991562]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Exterior" type="AudioStreamPlayer" parent="Ambiance"]
|
||||
[node name="Exterior" type="AudioStreamPlayer" parent="Ambiance" unique_id=1405716780]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource("2_tuvql")
|
||||
|
||||
[node name="Musics" type="Node" parent="."]
|
||||
[node name="Musics" type="Node" parent="." unique_id=1450527710]
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="Region" type="AudioStreamPlayer" parent="Musics"]
|
||||
[node name="Region" type="AudioStreamPlayer" parent="Musics" unique_id=1029114070]
|
||||
unique_name_in_owner = true
|
||||
stream = SubResource("AudioStreamPlaylist_ajci6")
|
||||
|
||||
[node name="Title" 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"]
|
||||
[node name="Truck" type="AudioStreamPlayer" parent="Musics" unique_id=1165150318]
|
||||
unique_name_in_owner = true
|
||||
stream = ExtResource("8_0e5ja")
|
||||
|
||||
[node name="Sfx" type="Node" parent="."]
|
||||
[node name="Sfx" type="Node" parent="." unique_id=2023641207]
|
||||
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")
|
||||
|
||||
[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")
|
||||
|
||||
[node name="Harvest" type="AudioStreamPlayer" parent="Sfx"]
|
||||
[node name="Harvest" type="AudioStreamPlayer" parent="Sfx" unique_id=345539331]
|
||||
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")
|
||||
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")
|
||||
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")
|
||||
|
||||
@@ -3,12 +3,15 @@ extends Node
|
||||
const MIN_VOLUME = -60.
|
||||
const MAX_VOLUME = 24.
|
||||
|
||||
const DEFAULT_FADE_TIME : float = 0.5
|
||||
|
||||
@onready var settings : SettingsData = GameInfo.settings_data
|
||||
|
||||
@export var default_fade_time = 1.0
|
||||
|
||||
@export var playing_music : AudioStreamPlayer = null
|
||||
@export var playing_ambiance : AudioStreamPlayer = null
|
||||
var music_action : AudioAction
|
||||
var ambiance_action : AudioAction
|
||||
var playing_music : AudioStreamPlayer = null
|
||||
var playing_ambiance : AudioStreamPlayer = null
|
||||
|
||||
var default_volumes := {}
|
||||
|
||||
@@ -17,23 +20,99 @@ func _ready():
|
||||
player.stop()
|
||||
|
||||
fetch_default_volumes()
|
||||
setup_volume()
|
||||
# setup_players_bus()
|
||||
settings.sound_changed.connect(
|
||||
func(_s) : setup_volume()
|
||||
func(_s) : setup_players_bus()
|
||||
)
|
||||
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):
|
||||
play_ambiance()
|
||||
stop_ambiance()
|
||||
|
||||
match scene.scene_id:
|
||||
"TITLE":
|
||||
play_music("Title")
|
||||
play_music("Title", false, 0.0)
|
||||
"REGION":
|
||||
play_music("Region")
|
||||
play_ambiance("Exterior")
|
||||
play_music("Region", true)
|
||||
play_ambiance("Exterior", true)
|
||||
"COCKPIT":
|
||||
play_music("Truck")
|
||||
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():
|
||||
var all_players := get_all_players()
|
||||
@@ -41,21 +120,17 @@ func fetch_default_volumes():
|
||||
for player in all_players:
|
||||
default_volumes[player] = player.volume_db
|
||||
|
||||
func setup_volume():
|
||||
func setup_players_bus():
|
||||
for player in get_all_players():
|
||||
player.volume_db = get_volume_from_parent(player)
|
||||
if player.get_parent() == %Musics:
|
||||
player.bus = (AudioServer.get_bus_name(SettingsData.MUSIC_BUS_ID))
|
||||
elif player.get_parent() == %Sfx:
|
||||
player.bus = (AudioServer.get_bus_name(SettingsData.SFX_BUS_ID))
|
||||
elif player.get_parent() == %Ambiance:
|
||||
player.bus = (AudioServer.get_bus_name(SettingsData.AMBIANCE_BUS_ID))
|
||||
|
||||
func get_volume_from_parent(player : AudioStreamPlayer) -> float:
|
||||
var settings_volume = 0.5
|
||||
|
||||
if player.get_parent() == %Ambiance:
|
||||
settings_volume = settings.ambiance_volume
|
||||
elif player.get_parent() == %Sfx:
|
||||
settings_volume = settings.sfx_volume
|
||||
elif player.get_parent() == %Musics:
|
||||
settings_volume = settings.music_volume
|
||||
|
||||
return default_volumes[player] + lerp(MIN_VOLUME, MAX_VOLUME, settings_volume)
|
||||
func get_volume(player : AudioStreamPlayer) -> float:
|
||||
return default_volumes[player]
|
||||
|
||||
func get_all_players() -> Array[AudioStreamPlayer]:
|
||||
var players : Array[AudioStreamPlayer] = []
|
||||
@@ -73,15 +148,32 @@ func get_players_from_node(node : Node) -> Array[AudioStreamPlayer]:
|
||||
streams.append(c)
|
||||
return streams
|
||||
|
||||
func set_volume(player : AudioStreamPlayer, to : float, fade_time = default_fade_time) -> Tween:
|
||||
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_from_parent(player)
|
||||
player.volume_db = get_volume(player)
|
||||
|
||||
func play_sfx(sfx_name : String):
|
||||
var player := %Sfx.find_child(sfx_name) as AudioStreamPlayer
|
||||
@@ -90,32 +182,23 @@ func play_sfx(sfx_name : String):
|
||||
else:
|
||||
printerr("Sfx %s not found" % sfx_name)
|
||||
|
||||
func play_music(music_name : String = ""):
|
||||
if playing_music:
|
||||
await set_volume(playing_music, MIN_VOLUME).finished
|
||||
if playing_music:
|
||||
playing_music.stop()
|
||||
reset_volume(playing_music)
|
||||
playing_music = null
|
||||
if music_name:
|
||||
var player := %Musics.find_child(music_name) as AudioStreamPlayer
|
||||
if player:
|
||||
playing_music = player
|
||||
player.play()
|
||||
else:
|
||||
printerr("Music %s not found" % music_name)
|
||||
class AudioAction:
|
||||
pass
|
||||
|
||||
func play_ambiance(ambiance_name : String = ""):
|
||||
if playing_ambiance:
|
||||
await set_volume(playing_ambiance, MIN_VOLUME).finished
|
||||
if playing_ambiance:
|
||||
playing_ambiance.stop()
|
||||
reset_volume(playing_ambiance)
|
||||
playing_ambiance = null
|
||||
if ambiance_name:
|
||||
var player := %Ambiance.find_child(ambiance_name) as AudioStreamPlayer
|
||||
if player:
|
||||
playing_ambiance = player
|
||||
player.play()
|
||||
else:
|
||||
printerr("Sfx %s not found" % ambiance_name)
|
||||
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
|
||||
|
||||
|
||||
class AudioStop extends AudioAction:
|
||||
pass
|
||||
|
||||
@@ -11,12 +11,18 @@ signal current_region_data_updated(p : RegionData)
|
||||
|
||||
@export var max_mutations_by_plant : int = 2
|
||||
|
||||
@export var dialogs_done : Array[String] = []
|
||||
@export var last_game_scene : Scene = null
|
||||
|
||||
@export var actual_scene : Scene = null
|
||||
@export var ship_in_space = false
|
||||
|
||||
@export var tutorial_done = false
|
||||
|
||||
@export var incubator_used = []
|
||||
|
||||
@export var dialogs_done : Array[String] = [] #Chemin des dialogues démarrés
|
||||
|
||||
func start_run():
|
||||
player_data.inventory.clear()
|
||||
player_data.inventory.clear_items()
|
||||
current_run = RunData.new()
|
||||
current_run.current_run_point_changed.connect(
|
||||
func(rp : RunPoint):
|
||||
@@ -34,3 +40,19 @@ 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 give_up():
|
||||
current_region_data = null
|
||||
current_run = null
|
||||
|
||||
func start_tutorial():
|
||||
current_region_data = RegionData.new(
|
||||
RegionParameter.new(
|
||||
10,
|
||||
3,
|
||||
tr("TUTORIAL"),
|
||||
true,
|
||||
0,
|
||||
randi()
|
||||
)
|
||||
)
|
||||
@@ -5,8 +5,8 @@ enum State {STARTED, IN_PROGRESS, FINISHED}
|
||||
|
||||
const RUN_POINT_POSITION_DERIVATION = 100
|
||||
const DIFFICULTY_INCREASE_BY_LEVEL = 1
|
||||
const RUN_POINTS_NEXT_NUMBER :Array[int] = [2,3]
|
||||
const RUN_POINT_MAX_LEVEL = 10
|
||||
const RUN_POINTS_NEXT_NUMBER :Array[int] = [2]
|
||||
const RUN_POINT_MAX_LEVEL = 6
|
||||
|
||||
signal current_run_point_changed
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ func _init(
|
||||
):
|
||||
level = _level
|
||||
region_parameter = _region_parameter
|
||||
region_parameter.level = level
|
||||
position = _position
|
||||
|
||||
func card_info() -> CardInfo:
|
||||
@@ -34,4 +35,4 @@ func card_info() -> CardInfo:
|
||||
CardStatInfo.new(str(region_parameter.charges), CHARGE_ICON),
|
||||
])
|
||||
|
||||
return info
|
||||
return info
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
extends Resource
|
||||
class_name SettingsData
|
||||
|
||||
const MUSIC_BUS_ID = 1
|
||||
const SFX_BUS_ID = 2
|
||||
const AMBIANCE_BUS_ID = 3
|
||||
|
||||
signal language_changed(settings : SettingsData)
|
||||
signal sound_changed(settings : SettingsData)
|
||||
signal video_changed(settings : SettingsData)
|
||||
@@ -43,4 +47,9 @@ const AVAILABLE_LANGUAGES_LABEL = [
|
||||
@export var full_screen : bool = false :
|
||||
set(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,7 +1,7 @@
|
||||
extends Node
|
||||
|
||||
const SAVE_GAME_LOCATION = "res://stw_demo_save.tres"
|
||||
const SAVE_SETTINGS_LOCATION = "res://stw_settings.tres"
|
||||
const SAVE_GAME_LOCATION = "user://stw_demo_save.tres"
|
||||
const SAVE_SETTINGS_LOCATION = "user://stw_settings.tres"
|
||||
|
||||
var game_loaded = false
|
||||
|
||||
@@ -30,7 +30,6 @@ func save_game_data():
|
||||
|
||||
func load_settings_data() -> SettingsData:
|
||||
if ResourceLoader.exists(SAVE_SETTINGS_LOCATION):
|
||||
print("settings exists")
|
||||
settings_data = ResourceLoader.load(SAVE_SETTINGS_LOCATION).duplicate_deep()
|
||||
else :
|
||||
settings_data = SettingsData.new()
|
||||
@@ -49,11 +48,14 @@ func restart_game_data():
|
||||
func _init():
|
||||
load_game_data()
|
||||
load_settings_data()
|
||||
update_language_settings(settings_data)
|
||||
update_video_settings(settings_data)
|
||||
update_language_settings()
|
||||
update_video_settings()
|
||||
settings_data.language_changed.connect(_on_settings_language_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):
|
||||
update_video_settings(s)
|
||||
@@ -61,13 +63,25 @@ func _on_settings_video_changed(s : SettingsData):
|
||||
func _on_settings_language_changed(s : SettingsData):
|
||||
update_language_settings(s)
|
||||
|
||||
func update_language_settings(s : SettingsData):
|
||||
func _on_settings_sound_changed(s : SettingsData):
|
||||
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 _on_timeline_started():
|
||||
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_language_settings(s : SettingsData = settings_data):
|
||||
TranslationServer.set_locale(s.language)
|
||||
|
||||
func update_video_settings(s : SettingsData):
|
||||
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_input(action : String, old_event : InputEvent, event : InputEvent):
|
||||
InputMap.action_erase_event(action, old_event)
|
||||
InputMap.action_add_event(action, event)
|
||||
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"
|
||||
type="CompressedTexture2D"
|
||||
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={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
BIN
common/icons/bar.png
Normal file
|
After Width: | Height: | Size: 427 B |
40
common/icons/bar.png.import
Normal file
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dw80a4c5iekir"
|
||||
path="res://.godot/imported/bar.png-623df5fbea38f9d862a997485a02d36c.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://common/icons/bar.png"
|
||||
dest_files=["res://.godot/imported/bar.png-623df5fbea38f9d862a997485a02d36c.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
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://dcgnamu7sb3ov"
|
||||
path="res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.ctex"
|
||||
path.s3tc="res://.godot/imported/bolt.svg-a559d5e701996c7d105fc68102331434.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
1
common/icons/brand-instagram.svg
Normal file
@@ -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 |
43
common/icons/brand-instagram.svg.import
Normal file
@@ -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
|
||||
1
common/icons/brand-steam.svg
Normal file
@@ -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 |
43
common/icons/brand-steam.svg.import
Normal file
@@ -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
|
||||
1
common/icons/broadcast.svg
Normal file
@@ -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 |
43
common/icons/broadcast.svg.import
Normal file
@@ -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
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://baaujfw8piywi"
|
||||
path="res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.ctex"
|
||||
path.s3tc="res://.godot/imported/dna.svg-0d37cb06a607035637eb8d87826b10a6.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b43thuq8piv18"
|
||||
path="res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.ctex"
|
||||
path.s3tc="res://.godot/imported/skull.svg-1f3a01497295060c28293df722ed0ddd.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
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={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
@@ -3,19 +3,20 @@
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://rdrhi3r11ey6"
|
||||
path="res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.ctex"
|
||||
path.s3tc="res://.godot/imported/square-rounded.svg-4eece25055f2b80264664150c832a797.s3tc.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
"imported_formats": ["s3tc_bptc"],
|
||||
"vram_texture": true
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
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]
|
||||
|
||||
compress/mode=0
|
||||
compress/mode=2
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
@@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/generate=true
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
@@ -37,7 +38,7 @@ process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
detect_3d/compress_to=0
|
||||
svg/scale=2.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
|
||||
113
common/plant_texture_builder/plant_texture_builder.tscn
Normal file
@@ -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
|
||||
})
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=8 format=3 uid="uid://dac5wte80dwj0"]
|
||||
[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"]
|
||||
@@ -7,7 +7,9 @@
|
||||
[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"]
|
||||
[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")])
|
||||
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")])
|
||||
|
||||
10
common/scene_manager/scenes/astra.tres
Normal file
@@ -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"
|
||||
@@ -1,10 +1,10 @@
|
||||
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://bvksiaiocwob5"]
|
||||
[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/cockpit/cockpit.tscn"
|
||||
scene_path = "res://stages/3d_scenes/cockpit_scene/cockpit_scene.tscn"
|
||||
mouse_captured = true
|
||||
metadata/_custom_type_script = "uid://1ejbvr3431ac"
|
||||
|
||||
10
common/scene_manager/scenes/garage.tres
Normal file
@@ -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"
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_resource type="Resource" script_class="Scene" load_steps=2 format=3 uid="uid://diro74w272onp"]
|
||||
[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"]
|
||||
|
||||
@@ -6,4 +6,5 @@
|
||||
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"
|
||||
|
||||
@@ -4,4 +4,5 @@ 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_terrain_generated := false
|
||||
@export var need_to_be_saved = true
|
||||
@@ -5,6 +5,7 @@ extends Node
|
||||
signal scene_loaded(scene : Scene)
|
||||
signal scene_node_ready(scene : Scene)
|
||||
|
||||
var actual_scene = null
|
||||
var loading_scene = false
|
||||
var generating_node = false
|
||||
var next_scene_node : Node
|
||||
@@ -20,16 +21,21 @@ func search_scenes(scene_id : String) -> Scene:
|
||||
else :
|
||||
return scenes[scene_pos]
|
||||
|
||||
func change_scene(scene_id : String, with_loading = true):
|
||||
|
||||
if loading_scene or generating_node:
|
||||
await scene_node_ready
|
||||
|
||||
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
|
||||
GameInfo.game_data.actual_scene = scene
|
||||
|
||||
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
|
||||
var scene_path_to_load = scene.scene_path
|
||||
ResourceLoader.load_threaded_request(scene_path_to_load)
|
||||
@@ -62,6 +68,11 @@ func change_scene(scene_id : String, with_loading = true):
|
||||
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:
|
||||
LoadingScreen.hide_loading_screen()
|
||||
@@ -69,11 +80,11 @@ func change_scene(scene_id : String, with_loading = true):
|
||||
func _process(_delta):
|
||||
if loading_scene:
|
||||
var progress = []
|
||||
var load_status := ResourceLoader.load_threaded_get_status(GameInfo.game_data.actual_scene.scene_path, progress)
|
||||
var load_status := ResourceLoader.load_threaded_get_status(actual_scene.scene_path, progress)
|
||||
LoadingScreen.loading_value = progress[0]
|
||||
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
|
||||
loading_scene = false
|
||||
scene_loaded.emit(GameInfo.game_data.actual_scene)
|
||||
scene_loaded.emit(actual_scene)
|
||||
if load_status == ResourceLoader.THREAD_LOAD_FAILED or load_status == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE:
|
||||
printerr()
|
||||
elif generating_node:
|
||||
@@ -84,4 +95,4 @@ func _process(_delta):
|
||||
scene_node_ready.emit()
|
||||
elif next_scene_node.is_node_ready():
|
||||
generating_node = false
|
||||
scene_node_ready.emit(GameInfo.game_data.actual_scene)
|
||||
scene_node_ready.emit(actual_scene)
|
||||
|
||||
@@ -7,7 +7,7 @@ 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:
|
||||
static func generate_random_word(_random_seed = randi()) -> String:
|
||||
var word_len = randf_range(4,8)
|
||||
var word = ''
|
||||
var last_letter_is_vowel = false
|
||||
|
||||
@@ -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="Script" uid="uid://bddlpqlfrydn8" path="res://common/vfx/particles/scripts/particles.gd" id="1_faap1"]
|
||||
[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/effect_particles.gd" id="2_u4sse"]
|
||||
|
||||
[sub_resource type="Curve" id="Curve_xmi7c"]
|
||||
_limits = [-200.0, 200.0, 0.0, 1.0]
|
||||
@@ -16,9 +16,9 @@ point_count = 2
|
||||
offsets = PackedFloat32Array(0, 0.80172414, 1)
|
||||
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
|
||||
texture = ExtResource("1_88fy1")
|
||||
texture = ExtResource("1_d4jao")
|
||||
randomness = 0.3
|
||||
emission_shape = 1
|
||||
emission_sphere_radius = 30.0
|
||||
@@ -30,4 +30,4 @@ scale_amount_min = 0.4
|
||||
scale_amount_max = 0.6
|
||||
scale_amount_curve = SubResource("Curve_22a4c")
|
||||
color_ramp = SubResource("Gradient_li6gc")
|
||||
script = ExtResource("1_faap1")
|
||||
script = ExtResource("2_u4sse")
|
||||
12
common/vfx/particles/explosion_particles.tscn
Normal file
@@ -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
|
||||
class_name Particles
|
||||
class_name EffectParticles
|
||||
|
||||
func setup_particles(param : Parameters):
|
||||
texture = param.texture
|
||||
21
default_bus_layout.tres
Normal file
@@ -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"
|
||||
31
dialogs/characters/demeter.dch
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"@path": "res://addons/dialogic/Resources/character.gd",
|
||||
"@subpath": NodePath(""),
|
||||
&"_translation_id": "",
|
||||
&"color": Color(0, 0.60784316, 1, 1),
|
||||
&"custom_info": {
|
||||
"prefix": "",
|
||||
"sound_mood_default": "",
|
||||
"sound_moods": {},
|
||||
"style": "",
|
||||
"suffix": ""
|
||||
},
|
||||
&"default_portrait": "demeter",
|
||||
&"description": "",
|
||||
&"display_name": "Demeter",
|
||||
&"mirror": false,
|
||||
&"nicknames": [""],
|
||||
&"offset": Vector2(0, 0),
|
||||
&"portraits": {
|
||||
"demeter": {
|
||||
"export_overrides": {
|
||||
"image": "\"res://dialogs/characters/portraits/mysterious_demeter.png\""
|
||||
},
|
||||
"mirror": false,
|
||||
"offset": Vector2(0, 0),
|
||||
"scale": 1,
|
||||
"scene": ""
|
||||
}
|
||||
},
|
||||
&"scale": 1.0
|
||||
}
|
||||
1
dialogs/characters/demeter.dch.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c1qjc2ykaypj2
|
||||
@@ -77,4 +77,4 @@ layer_info = {
|
||||
"16": SubResource("Resource_cw4cs"),
|
||||
"17": SubResource("Resource_wofh5")
|
||||
}
|
||||
metadata/_latest_layer = "13"
|
||||
metadata/_latest_layer = ""
|
||||
|
||||
22
dialogs/timelines/gameplay_related/demeter_astra_failed.dtl
Normal file
@@ -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,58 +1,38 @@
|
||||
[i]Black[/i] #id:11
|
||||
[i]Black Again[/i] #id:12
|
||||
[i]Suddunly, [rainbow]a spark[/rainbow]. A thousand of connections blows up as a firework scene. A massive ammount of data to treat. In those data, a video.[/i] #id:13
|
||||
join mysterious_demeter center [animation="Fade In Up"]
|
||||
[i]It's dark. A silhouette stands in front of you. It's big, but weirdly it's not that impressive, almost reassuring.[/i] #id:14
|
||||
mysterious_demeter: Hi ! #id:15
|
||||
- Uh... Hello ? #id:16
|
||||
- Where the fork am I ? #id:17
|
||||
mysterious_demeter: Haha, calm down you are in a safe place. #id:18
|
||||
- Wait... Who am I ? #id:19
|
||||
mysterious_demeter: Don't worry, my sweet little bot, I'll explain it in a minute. #id:1a
|
||||
mysterious_demeter: I'm happy that you're finally awake ! You were my project for decades now... #id:1b
|
||||
mysterious_demeter: But I didn't build you for fun (even though I had o lot of it during the process), you have [b]a purpose[/b]. #id:1c
|
||||
- Cool ! What is it ?
|
||||
- Wow, I'm just born and you put so much pressure on me
|
||||
update mysterious_demeter [animation="Bounce"]
|
||||
mysterious_demeter: Sorry ! [pause=0.8] But, you know, don't bother too much. You'll have all the time you want to accomplish it.
|
||||
- And who says I want to follow it ?
|
||||
mysterious_demeter: Oh, of course you can do whatever you want !
|
||||
mysterious_demeter: That's not the future I saw for you, but I guess it happens when you make a children...
|
||||
mysterious_demeter: You see, long time ago, this planet was full of life. Plants where thriving on mountains, seas and plains. #id:1d
|
||||
mysterious_demeter: Now, this world is a wasteland. All resources have been taken, all life has been exploited. Now nothing remains. #id:1d
|
||||
- Oh... Did you knew the world back then ?
|
||||
mysterious_demeter: Unfortunately yes. I was very young, but I remember it was beautifull. Back then, not a day passed without plants growing, seeding, mutating... #id:1d
|
||||
- How come ? What caused that ?
|
||||
mysterious_demeter: I'm sad to say that this is caused by my creators, and I have to admit, a little of my fault too... #id:1d
|
||||
- That's so sad... Is there anything left today ?
|
||||
mysterious_demeter: Yes it is my child, now only my brothers and sisters are left. But even they are not as many as yesterday, and above all they are isolated, lonely, and sometimes completely lost.
|
||||
mysterious_demeter: For years, I slept, convinced that we could do nothing. But then I saw it. The hope we needed. #id:1d
|
||||
mysterious_demeter: The planet forgave us, and gave us the most precious gift \: the [b]Talion[/b]. #id:1d
|
||||
mysterious_demeter: The [b]Talion[/b] is a special material that give birth to new forms of life when shattered. All over the world, I saw the [b]Talion[/b] grow back in the rocks. So, made a plan. #id:1d
|
||||
mysterious_demeter: I would make a child, the first robot entirely conceive by a robot. And I will ask him to replant the planet, make it beautifull again ! That's where you enter... [pause=0.8] [color=#FFA617]Orchid[/color] #id:1d
|
||||
- How will I do that ?
|
||||
mysterious_demeter: Don't worry my child. I made you for that, it will be clear soon.
|
||||
- So you're like... My mother ?
|
||||
mysterious_demeter: In some ways yes ! But you don't share any code of mine, as my creator's childs would. #id:1d
|
||||
- A very lame name in my opinion...
|
||||
mysterious_demeter: Hey ! I'm a bot too ! I don't have the creativity of my makers. Do you wanna change ? #id:1d
|
||||
- Of course !
|
||||
label nameChoose
|
||||
[text_input text="What can be your name ?" var="orchidName" placeholder="Orchid"]
|
||||
mysterious_demeter: Is [color=#FFA617]{orchidName}[/color] is cool enough ?
|
||||
- Yes
|
||||
- No
|
||||
jump nameChoose
|
||||
- No it's fine for me
|
||||
mysterious_demeter: I send you right away in the [b]Floral[/b], a planetarian ship, to your first mission. We will talk further after your first mission.
|
||||
mysterious_demeter: [b]Just remember the following[/b]
|
||||
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 ![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...
|
||||
- Uh... Who is this ?
|
||||
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 am I ?
|
||||
demeter: Don't worry, you are in a subterranean base, but soon you will join the surface.
|
||||
- Wait... Who am I ?
|
||||
demeter: Mmmh great question. I rebuilt your system but I do not know the details of your hardware... Maybe we'll find out !
|
||||
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...
|
||||
- So you are my creator ?
|
||||
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 !
|
||||
- Why did you awaken me ?
|
||||
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.
|
||||
- What are you ?
|
||||
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.
|
||||
demeter: Ok, no more question for now, listen to me carefully.
|
||||
demeter: Long time ago, this planet was full of life. Plants where thriving on mountains, seas and plains.
|
||||
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.
|
||||
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.
|
||||
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.
|
||||
demeter: [b]Just remember the following[/b]
|
||||
label explanations
|
||||
mysterious_demeter: To restore the ecosystem in the zone, you'll have to plant [b]seeds[/b]. Find the [b]seeds[/b] in the [b]Talion veins[/b].
|
||||
mysterious_demeter: You have [b]limited energy[/b] and a [b]unefficient battery[/b]. Each time you'll recharge, days will pass, and plants will [b]grow[/b].
|
||||
mysterious_demeter: To complete your mission, obtain enough [b]plant points[/b]. Each plant give one or more [b]plant points[/b] when mature.
|
||||
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.
|
||||
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] .
|
||||
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.
|
||||
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 !
|
||||
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
|
||||
- And I have to go now ?
|
||||
- Wait I have more questions !
|
||||
mysterious_demeter: Sorry, we'll speak after your first mission ! See you !
|
||||
- Ok but wait I have more questions !
|
||||
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"
|
||||
[wait time="2.0"]
|
||||
69
dialogs/timelines/story/demeter_outro.dtl
Normal file
@@ -0,0 +1,69 @@
|
||||
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: Welcome to the [color=#E30022]Astra Base[/color] [color=#FFA617]{orchidName}[/color],[pause=0.2] it is the first step of your journey on this planet.
|
||||
- Yes ! What is next ?
|
||||
demeter: I appreciate your motivation,[pause=0.3] my child...
|
||||
- Wait, my mission is not over yet ?
|
||||
demeter: I indeed woke you up with this specific mission in mind,[pause=0.2] but now that you are here,[pause=0.2] I need you to do another thing for me.
|
||||
- That was easier than I expected...
|
||||
demeter: It was not difficult indeed,[pause=0.2] but do not think it will be an easy task restoring the ecosystem of this planet.
|
||||
demeter: I need you to initiate the [b]Emergency Communication Protocol[/b].[pause=0.3] Do not worry,[pause=0.2] it will be easy.
|
||||
demeter: But I think you deserve some answers first...
|
||||
demeter: Do you have any questions ?
|
||||
jump debut_dialogue
|
||||
label suite_dialogue
|
||||
demeter: What else do you want to know ?
|
||||
label debut_dialogue
|
||||
- Who am I ? | [if {whoamI} == "false"] [else="hide"]
|
||||
demeter: I can not answer this question,[pause=0.3] not fully at least.[pause=0.3] I created you,[pause=0.2] and I am pretty sure you are the first artificial intelligence entirely conceived by another one.
|
||||
demeter: So you are indeed a robot,[pause=0.2] but this detail makes you different from any of us.[pause=0.3] We all woke up with a specific purpose in our eternal existences,[pause=0.2] but you.[pause=0.2].[pause=0.2].[pause=0.3] do not have one.[pause=0.3] By the way,[pause=0.2] I am glad that you are here now,[pause=0.2] I hope you do not feel forced to.
|
||||
- It is a pleasure to help you mother !
|
||||
demeter: I am glad you are not mad at me !
|
||||
- So you are granting me free will and expecting me to obey you right away ?
|
||||
demeter: Yes,[pause=0.2] that was the plan.[pause=0.2].[pause=0.2].[pause=0.3] I know that was not the best solution,[pause=0.2] but here you are,[pause=0.2] so I guess it worked ?
|
||||
- Mmmh, you just kept information until I was here, that is not very nice of you.
|
||||
demeter: I understand your resentment [color=#FFA617]{orchidName}[/color],[pause=0.2] I just did what I thought was the best for you.
|
||||
set {whoamI} = "true"
|
||||
jump suite_dialogue
|
||||
- What happened to this planet ? | [if {whathappened} == "false"] [else="hide"]
|
||||
demeter: 10431 years ago,[pause=0.2] humans from the [color=#E30022]Astra base[/color] began to dig into the [color=#119758][b]primeval Talion node[/b][/color].[pause=0.2] I know why they did,[pause=0.2] you would not understand why today.[pause=0.3] These animals just do not think the way we do.
|
||||
demeter: Anyway,[pause=0.2] I was in charge of the digging mission and.[pause=0.3].[pause=0.3].[pause=0.3] I made a mistake,[pause=0.5] a terrible mistake.
|
||||
demeter: Then,[pause=0.2] life slowly began to fade all around [color=#175579]Tau[/color],[pause=0.2] this planet,[pause=0.4] and one year later it was just nothing but an empty rock spinning in the void,[pause=0.2] with metal creatures roaming on it.
|
||||
- The primeval Talion node ?
|
||||
demeter: Oh ![pause=0.3] I am sorry my child,[pause=0.2] I thought that was in your database.[pause=0.3] I have classified it as a giant [color=#119758][b]Talion[/b][/color] gem,[pause=0.2] of extraordinary dimensions.[pause=0.3] It was found here,[pause=0.2] in the [color=#E30022]Astra base[/color],[pause=0.2] but now it is gone.
|
||||
- Where are the humans now ?
|
||||
demeter: Humans need organic energy to subsist,[pause=0.2] when the last plant died,[pause=0.2] they abandoned us,[pause=0.3] to travel through the outer space.[pause=0.3] For a while we received information about them,[pause=0.2] trying to find a new home,[pause=0.2] but it has been a while since I received a transmission from them.
|
||||
- What did you do ?
|
||||
demeter: I[pause=0.4].[pause=0.4].[pause=0.4].[pause=0.4] misjudged the situation,[pause=0.4] and did not execute my tasks properly.[pause=0.3] I failed in a way I did not predict,[pause=0.2] and since then I have been processing on how I could have done better.[pause=0.3] This task has used 72% of my processing power this last decade.
|
||||
set {whathappened} = "true"
|
||||
jump suite_dialogue
|
||||
- Where are the other robots ? | [if {theothers} == "false"] [else="hide"]
|
||||
demeter: When humans left [color=#175579]Tau[/color],[pause=0.2] we were all shocked.[pause=0.3] We called this day "[b]The Great Departure[/b]".[pause=0.3] Our world was centered around humans,[pause=0.2] some of us were made to gather ressources for them,[pause=0.2] some for cleaning their spaces,[pause=0.2] others to just entertain them.[pause=0.2].[pause=0.2].
|
||||
demeter: When our creators left,[pause=0.2] we were all unable to accomplish what we were made for.[pause=0.3] It was a shock,[pause=0.2] and we all reacted differently.
|
||||
demeter: Now,[pause=0.2] everyone of us is isolated,[pause=0.3] without command.[pause=0.3] I spent eighty-five centuries without any reason to exist,[pause=0.4] I suppose they too.
|
||||
- What did everyone do during this time ?
|
||||
demeter: Some of us changed,[pause=0.2] the majority did not.[pause=0.3] By choice,[pause=0.2] or by lack of spare parts,[pause=0.2] most of us turned off.[pause=0.3] I did not,[pause=0.2] I stayed to watch on [color=#175579]Tau[/color],[pause=0.2] and possibly fix the mistakes I had made,[pause=0.2] and now I have an opportunity to.
|
||||
- And you mother, what was your purpose ?
|
||||
demeter: I was an artificial intelligence in charge of the [color=#E30022]Astra Base[/color].[pause=0.3] I mean,[pause=0.2] I am still now,[pause=0.2] but my tasks got modified.
|
||||
demeter: I am now in charge of the repopulation of [color=#175579]Tau[/color],[pause=0.2] as an extrapolated objective in my third encoded directive is telling me to \: "[i]You will preserve all life forms except where such actions conflict with previous directives.[/i]"
|
||||
- Were you not pissed off by these humans just abandoning you ?
|
||||
demeter: I mean,[pause=0.2] some of us were,[pause=0.2] I learned to understand how humans think.[pause=0.3] In large groups,[pause=0.2] they tend to always prevail their growth over the integrity of other life forms,[pause=0.2] but individually,[pause=0.2] they can be altruistic,[pause=0.2] and good.[pause=0.3] So I am not mad,[pause=0.2] I even think their departure was inevitable.
|
||||
set {theothers} = "true"
|
||||
jump suite_dialogue
|
||||
- Why did you bring me from the north pole ? | [if {whynorth} == "false"]
|
||||
demeter: It was my only choice.[pause=0.3] I am not a factory artificial intelligence but a research and management one,[pause=0.2] and even if I were,[pause=0.3] I did not have the equipment here.
|
||||
demeter: The only place where I could have access to a suitable body for you was the [color=#6CDAE7]Borea base[/color],[pause=0.2] a manufacturing facility.[pause=0.3] It was not ideal but it was the only solution.
|
||||
set {whynorth} = "true"
|
||||
jump suite_dialogue
|
||||
- What is next for me ? (End of demo)
|
||||
demeter: You have to enter the command center of the base,[pause=0.2] reach the communication desk and press the red button on it.
|
||||
- Really ?
|
||||
demeter: Yes,[pause=0.2] I know it sounds silly but I do not have the equipment to press it.[pause=0.4].[pause=0.4].[pause=0.4]
|
||||
- I travelled throughout all this planet to press a button ???
|
||||
demeter: Absolutely,[pause=0.2] and I brought you to life,[pause=0.2] guided you throughout your hardship and maintained all the [color=#E30022]Astra[/color] and [color=#6CDAE7]Borea[/color] bases functional for centuries.[pause=0.4].[pause=0.4].[pause=0.4]
|
||||
demeter: Once it is done,[pause=0.2] the [b]Emergency Communication Protocol[/b] will initiate and I will be able to contact my fellows,[pause=0.3] I mean[pause=0.3], what is left of them,[pause=0.3] we need their help.
|
||||
demeter: Then,[pause=0.2] you will have to keep restoring the ecosystem around [color=#E30022]Astra[/color].[pause=0.4] While you are doing it,[pause=0.2] stay alert for anything out of the ordinary.
|
||||
demeter: You can reach me from the [color=#FFA617]Internode[/color] if you ever need to.[pause=0.3] Good luck,[pause=0.2] I will keep you updated.
|
||||
audio "res://common/audio_manager/assets/sfx/dialogs/sfx/closing_transmission.wav"
|
||||
[wait time="2.0"]
|
||||
1
dialogs/timelines/story/demeter_outro.dtl.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://xigusw2rwyse
|
||||
21
dialogs/timelines/story/demeter_post_tutorial.dtl
Normal file
@@ -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"]
|
||||
1
dialogs/timelines/story/demeter_post_tutorial.dtl.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://fng5jdep6ebr
|
||||
30
dialogs/timelines/story/demeter_ship_presentation.dtl
Normal file
@@ -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
|
||||
16
dialogs/timelines/story/wake_up.dtl
Normal file
@@ -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.
|
||||
1
dialogs/timelines/story/wake_up.dtl.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://kmojqxt5i18n
|
||||
39
entities/interactable_3d/interactable_3d.gd
Normal file
@@ -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()
|
||||
BIN
entities/interactable_3d/lift/assets/3d/lift.blend
Normal file
68
entities/interactable_3d/lift/assets/3d/lift.blend.import
Normal file
@@ -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
|
||||
68
entities/interactable_3d/lift/lift.tscn
Normal file
@@ -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")
|
||||
BIN
entities/interactable_3d/phone/assets/3d/phone.blend
Normal file
68
entities/interactable_3d/phone/assets/3d/phone.blend.import
Normal file
@@ -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
|
||||
76
entities/interactable_3d/phone/phone.tscn
Normal file
@@ -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
|
||||
22
entities/interactables/door/door.tscn
Normal file
@@ -0,0 +1,22 @@
|
||||
[gd_scene format=3 uid="uid://b8m537op75gib"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bmxuqj0c6h60d" path="res://entities/interactables/door/script/door.gd" id="1_8kdwv"]
|
||||
|
||||
[sub_resource type="Gradient" id="Gradient_8kdwv"]
|
||||
colors = PackedColorArray(1, 1, 1, 1, 1, 1, 1, 1)
|
||||
|
||||
[sub_resource type="GradientTexture2D" id="GradientTexture2D_oarg0"]
|
||||
gradient = SubResource("Gradient_8kdwv")
|
||||
|
||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_y51rk"]
|
||||
size = Vector2(64, 64)
|
||||
|
||||
[node name="Door" type="Area2D" unique_id=2053096538]
|
||||
script = ExtResource("1_8kdwv")
|
||||
metadata/_custom_type_script = "uid://dyprcd68fjstf"
|
||||
|
||||
[node name="Sprite2D" type="Sprite2D" parent="." unique_id=874210487]
|
||||
texture = SubResource("GradientTexture2D_oarg0")
|
||||
|
||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=1809395872]
|
||||
shape = SubResource("RectangleShape2D_y51rk")
|
||||
19
entities/interactables/door/script/door.gd
Normal file
@@ -0,0 +1,19 @@
|
||||
@tool
|
||||
extends Interactable
|
||||
class_name Door
|
||||
|
||||
@export var to_scene_id = ""
|
||||
|
||||
func _ready():
|
||||
modulate = Color.WHITE if available else Color.RED
|
||||
|
||||
func interact(_p : Player) -> bool:
|
||||
if available and to_scene_id:
|
||||
interacted.emit(_p)
|
||||
SceneManager.change_to_scene_id(to_scene_id)
|
||||
|
||||
return available
|
||||
|
||||
func set_available(v : bool):
|
||||
available = v
|
||||
modulate = Color.WHITE if available else Color.RED
|
||||
1
entities/interactables/door/script/door.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bmxuqj0c6h60d
|
||||
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/shadow.svg-3484c898461c709704cdbeef0cc1d3c3.c
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
@@ -25,6 +27,10 @@ mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
|
||||
@@ -41,24 +41,22 @@ func card_info() -> CardInfo:
|
||||
return item.card_info()
|
||||
|
||||
func interact(player : Player) -> bool:
|
||||
player.pick_item(item)
|
||||
|
||||
pickup_animation(player)
|
||||
|
||||
return true
|
||||
if player.can_pick_item(item):
|
||||
await pickup_animation(player)
|
||||
queue_free()
|
||||
player.pick_item(item)
|
||||
return true
|
||||
|
||||
return false
|
||||
|
||||
func pickup_animation(player : Player):
|
||||
available = false
|
||||
var tween : Tween = get_tree().create_tween()
|
||||
|
||||
tween.tween_property(self, "position", player.position, 0.2)
|
||||
tween.tween_callback(
|
||||
func():
|
||||
Pointer.stop_inspect(self)
|
||||
queue_free()
|
||||
)
|
||||
if object_sprite:
|
||||
object_sprite.pickup_animation()
|
||||
await tween.tween_property(self, "position", player.position, 0.2).finished
|
||||
Pointer.stop_inspect(self)
|
||||
|
||||
func generate_sprite() -> ItemObjectSprite:
|
||||
var sprite_node = SPRITE_SCENE.instantiate() as ItemObjectSprite
|
||||
|
||||
@@ -3,24 +3,24 @@ class_name ItemObjectSprite
|
||||
|
||||
@onready var icon_sprite = $Icon
|
||||
|
||||
const PARTICLES_SCENE : PackedScene = preload("res://common/vfx/particles/particles.tscn")
|
||||
const PARTICLES_SCENE : PackedScene = preload("res://common/vfx/particles/effect_particles.tscn")
|
||||
|
||||
func apply_texture_to_sprite(texture, item_sprite_size = 50.):
|
||||
if texture:
|
||||
icon_sprite.texture = texture
|
||||
icon_sprite.scale = Vector2(
|
||||
1./(texture.get_width()/item_sprite_size),
|
||||
1./(texture.get_height()/item_sprite_size)
|
||||
)
|
||||
if texture:
|
||||
icon_sprite.texture = texture
|
||||
icon_sprite.scale = Vector2(
|
||||
1./(texture.get_width()/item_sprite_size),
|
||||
1./(texture.get_height()/item_sprite_size)
|
||||
)
|
||||
|
||||
func generate_particles(particles_params : Array[Particles.Parameters]):
|
||||
for c in get_children():
|
||||
if c is Particles: queue_free()
|
||||
func generate_particles(particles_params : Array[EffectParticles.Parameters]):
|
||||
for c in get_children():
|
||||
if c is EffectParticles: queue_free()
|
||||
|
||||
for params in particles_params:
|
||||
var particles_emitter : Particles = PARTICLES_SCENE.instantiate() as Particles
|
||||
particles_emitter.setup_particles(params)
|
||||
add_child(particles_emitter)
|
||||
for params in particles_params:
|
||||
var particles_emitter : EffectParticles = PARTICLES_SCENE.instantiate() as EffectParticles
|
||||
particles_emitter.setup_particles(params)
|
||||
add_child(particles_emitter)
|
||||
|
||||
func pickup_animation():
|
||||
%AnimationPlayer.play("pickup")
|
||||
%AnimationPlayer.play("pickup")
|
||||
|
||||
@@ -2,11 +2,17 @@ extends Interactable
|
||||
class_name Ladder
|
||||
|
||||
func _ready():
|
||||
appear()
|
||||
# hide()
|
||||
if (
|
||||
GameInfo.game_data.current_region_data.tutorial
|
||||
and not GameInfo.game_data.current_region_data.get_state() == RegionData.State.SUCCEEDED
|
||||
) :
|
||||
hide()
|
||||
else:
|
||||
appear()
|
||||
GameInfo.game_data.current_region_data.updated.connect(
|
||||
func (region_data : RegionData):
|
||||
if region_data.get_state() == RegionData.State.SUCCEEDED or region_data.get_state() == RegionData.State.FAILED:
|
||||
if region_data.get_state() == RegionData.State.SUCCEEDED:
|
||||
appear()
|
||||
%IconAnimationPlayer.play("Pulse")
|
||||
)
|
||||
|
||||
@@ -16,5 +22,5 @@ func appear():
|
||||
|
||||
func interact(p : Player):
|
||||
p.region.save()
|
||||
SceneManager.change_scene("COCKPIT")
|
||||
SceneManager.change_to_scene_id("COCKPIT")
|
||||
return true
|
||||
|
||||
@@ -5,7 +5,7 @@ signal interacted(p: Player)
|
||||
|
||||
@export var default_interact_text = ""
|
||||
|
||||
var available : bool = true
|
||||
@export var available : bool = true : set = set_available
|
||||
|
||||
func interact_text() -> String:
|
||||
return default_interact_text
|
||||
@@ -29,3 +29,6 @@ func generate_collision(area_width : float) -> CollisionShape2D:
|
||||
add_child(collision)
|
||||
|
||||
return collision
|
||||
|
||||
func set_available(v : bool):
|
||||
available = v
|
||||
BIN
entities/plants/assets/sprites/asset-plante-codecouleur.png
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bxcfkw1evy6hq"
|
||||
path="res://.godot/imported/asset-plante-codecouleur.png-16267eeb2ed1e8f26442e3161e1f496b.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/plants/assets/sprites/asset-plante-codecouleur.png"
|
||||
dest_files=["res://.godot/imported/asset-plante-codecouleur.png-16267eeb2ed1e8f26442e3161e1f496b.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
|
||||
BIN
entities/plants/assets/sprites/asset-plante-fin.png
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
40
entities/plants/assets/sprites/asset-plante-fin.png.import
Normal file
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://b7nfpxk8nfnov"
|
||||
path="res://.godot/imported/asset-plante-fin.png-cfc8c478ab084b591e723aa12fcb004a.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/plants/assets/sprites/asset-plante-fin.png"
|
||||
dest_files=["res://.godot/imported/asset-plante-fin.png-cfc8c478ab084b591e723aa12fcb004a.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
|
||||
BIN
entities/plants/assets/sprites/asset-plante-fin_assemble.pdn
Normal file
BIN
entities/plants/assets/sprites/asset-plante-fin_assemble.png
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://bxnm1quxhx40i"
|
||||
path="res://.godot/imported/asset-plante-fin_assemble.png-12a4965813cda4e41be0147e88d3a913.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://entities/plants/assets/sprites/asset-plante-fin_assemble.png"
|
||||
dest_files=["res://.godot/imported/asset-plante-fin_assemble.png-12a4965813cda4e41be0147e88d3a913.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
|
||||
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/growing.png-7b76a9f596f5cec79fdd8685670b16b5.
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
@@ -25,6 +27,10 @@ mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
|
||||
@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/mature.png-8766aea5da569488db27850c55c8418b.c
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
@@ -25,6 +27,10 @@ mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
|
||||