Skip to content

Commit 33b7706

Browse files
Runtime Resources: Improve runtime characters ability to have portraits (#2589)
Changes the portrait subsystem to index characters by their identifier instead of the resource path and removes an unnecessary threaded loading loop. Also adds a helper method `character.add_portrait(name, image, _scene)` that allows code to very easily register a portrait.
1 parent e533bb0 commit 33b7706

File tree

6 files changed

+56
-72
lines changed

6 files changed

+56
-72
lines changed

addons/dialogic/Editor/Settings/CoreSettingsPages/settings_tools.gd

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ func execute_tool(method:Callable) -> void:
3030

3131
tool_thread = Thread.new()
3232
tool_progress_mutex = Mutex.new()
33-
print(method)
3433
tool_thread.start(method)
3534

3635
await tool_finished_signal
@@ -39,7 +38,7 @@ func execute_tool(method:Callable) -> void:
3938
button.disabled = false
4039

4140

42-
func _process(delta: float) -> void:
41+
func _process(_delta: float) -> void:
4342
if (tool_thread and tool_thread.is_alive()) or %ToolProgress.value < 1:
4443
if tool_progress_mutex: tool_progress_mutex.lock()
4544
%ToolProgress.value = tool_progress

addons/dialogic/Editor/TimelineEditor/TextEditor/timeline_editor_text.gd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,10 +274,10 @@ func get_next_search_position(navigate_up := false) -> Vector2i:
274274
search_from_line = get_caret_line()
275275
search_from_column = get_caret_column()
276276

277-
var flags := get_meta("current_search_flags", 0)
277+
var flags: int = get_meta("current_search_flags", 0)
278278
if navigate_up:
279279
flags = flags | SEARCH_BACKWARDS
280-
print()
280+
281281
pos = search(get_meta("current_search"), flags, search_from_line, search_from_column)
282282
return pos
283283

addons/dialogic/Modules/Character/subsystem_portraits.gd

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ var default_portrait_scene: PackedScene = load(get_script().resource_path.get_ba
1919
####################################################################################################
2020

2121
func clear_game_state(_clear_flag:=DialogicGameHandler.ClearFlags.FULL_CLEAR) -> void:
22-
for character in dialogic.current_state_info.get('portraits', {}).keys():
23-
remove_character(load(character))
22+
for character_identifier in dialogic.current_state_info.get('portraits', {}).keys():
23+
remove_character(DialogicResourceUtil.get_character_resource(character_identifier))
2424
dialogic.current_state_info['portraits'] = {}
2525

2626

@@ -315,7 +315,7 @@ func _change_portrait_z_index(character_node: Node, z_index:int, update_zindex:=
315315
## fully visible yet.
316316
func get_character_portrait(character: DialogicCharacter) -> DialogicPortrait:
317317
if is_character_joined(character):
318-
var portrait_node: DialogicPortrait = dialogic.current_state_info['portraits'][character.resource_path].node.get_child(-1)
318+
var portrait_node: DialogicPortrait = dialogic.current_state_info['portraits'][character.get_identifier()].node.get_child(-1)
319319
return portrait_node
320320

321321
return null
@@ -411,14 +411,14 @@ func join_character(character:DialogicCharacter, portrait:String, position_id:S
411411
if character_node == null:
412412
return null
413413

414-
dialogic.current_state_info['portraits'][character.resource_path] = {'portrait':portrait, 'node':character_node, 'position_id':position_id, 'custom_mirror':mirrored}
414+
dialogic.current_state_info['portraits'][character.get_identifier()] = {'portrait':portrait, 'node':character_node, 'position_id':position_id, 'custom_mirror':mirrored}
415415

416416
_change_portrait_mirror(character_node, mirrored)
417417
_change_portrait_extradata(character_node, extra_data)
418418
_change_portrait_z_index(character_node, z_index)
419419

420420
var info := {'character':character}
421-
info.merge(dialogic.current_state_info['portraits'][character.resource_path])
421+
info.merge(dialogic.current_state_info['portraits'][character.get_identifier()])
422422
character_joined.emit(info)
423423

424424
if animation_name.is_empty():
@@ -452,30 +452,19 @@ func add_character(character: DialogicCharacter, container: DialogicNode_Portrai
452452
printerr('[DialogicError] Cannot call add_portrait() with null character.')
453453
return null
454454

455-
ResourceLoader.load_threaded_request(character.resource_path)
455+
var character_node := _create_character_node(character, container)
456456

457-
var load_status = ResourceLoader.load_threaded_get_status(character.resource_path)
458-
while load_status == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
459-
await get_tree().process_frame
460-
load_status = ResourceLoader.load_threaded_get_status(character.resource_path)
461-
462-
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
463-
character = ResourceLoader.load_threaded_get(character.resource_path)
464-
var character_node := _create_character_node(character, container)
457+
if character_node == null:
458+
printerr('[Dialogic] Failed to join character to position ', position_id, ". Could not find position container.")
459+
return null
465460

466-
if character_node == null:
467-
printerr('[Dialogic] Failed to join character to position ', position_id, ". Could not find position container.")
468-
return null
461+
dialogic.current_state_info['portraits'][character.get_identifier()] = {'portrait': portrait, 'node': character_node, 'position_id': position_id}
469462

470-
dialogic.current_state_info['portraits'][character.resource_path] = {'portrait': portrait, 'node': character_node, 'position_id': position_id}
463+
_move_character(character_node, position_id)
464+
await _change_portrait(character_node, portrait)
471465

472-
_move_character(character_node, position_id)
473-
await _change_portrait(character_node, portrait)
466+
return character_node
474467

475-
return character_node
476-
else:
477-
push_error('[Dialogic] Failed to load character "' + str(character.resource_path) + '".')
478-
return null
479468

480469
## Changes the portrait of a character. Only works with joined characters.
481470
func change_character_portrait(character: DialogicCharacter, portrait: String, fade_animation:="", fade_length := -1.0) -> void:
@@ -484,7 +473,7 @@ func change_character_portrait(character: DialogicCharacter, portrait: String, f
484473

485474
portrait = get_valid_portrait(character, portrait)
486475

487-
if dialogic.current_state_info.portraits[character.resource_path].portrait == portrait:
476+
if dialogic.current_state_info.portraits[character.get_identifier()].portrait == portrait:
488477
return
489478

490479
if fade_animation == "":
@@ -493,11 +482,11 @@ func change_character_portrait(character: DialogicCharacter, portrait: String, f
493482

494483
fade_animation = DialogicPortraitAnimationUtil.guess_animation(fade_animation, DialogicPortraitAnimationUtil.AnimationType.CROSSFADE)
495484

496-
var info := await _change_portrait(dialogic.current_state_info.portraits[character.resource_path].node, portrait, fade_animation, fade_length)
497-
dialogic.current_state_info.portraits[character.resource_path].portrait = info.portrait
485+
var info := await _change_portrait(dialogic.current_state_info.portraits[character.get_identifier()].node, portrait, fade_animation, fade_length)
486+
dialogic.current_state_info.portraits[character.get_identifier()].portrait = info.portrait
498487
_change_portrait_mirror(
499-
dialogic.current_state_info.portraits[character.resource_path].node,
500-
dialogic.current_state_info.portraits[character.resource_path].get('custom_mirror', false)
488+
dialogic.current_state_info.portraits[character.get_identifier()].node,
489+
dialogic.current_state_info.portraits[character.get_identifier()].get('custom_mirror', false)
501490
)
502491
character_portrait_changed.emit(info)
503492

@@ -507,26 +496,26 @@ func change_character_mirror(character:DialogicCharacter, mirrored:= false, forc
507496
if !is_character_joined(character):
508497
return
509498

510-
_change_portrait_mirror(dialogic.current_state_info.portraits[character.resource_path].node, mirrored, force)
511-
dialogic.current_state_info.portraits[character.resource_path]['custom_mirror'] = mirrored
499+
_change_portrait_mirror(dialogic.current_state_info.portraits[character.get_identifier()].node, mirrored, force)
500+
dialogic.current_state_info.portraits[character.get_identifier()]['custom_mirror'] = mirrored
512501

513502

514503
## Changes the z_index of a character. Only works with joined characters
515504
func change_character_z_index(character:DialogicCharacter, z_index:int, update_zindex:= true) -> void:
516505
if !is_character_joined(character):
517506
return
518507

519-
_change_portrait_z_index(dialogic.current_state_info.portraits[character.resource_path].node, z_index, update_zindex)
508+
_change_portrait_z_index(dialogic.current_state_info.portraits[character.get_identifier()].node, z_index, update_zindex)
520509
if update_zindex:
521-
dialogic.current_state_info.portraits[character.resource_path]['z_index'] = z_index
510+
dialogic.current_state_info.portraits[character.get_identifier()]['z_index'] = z_index
522511

523512

524513
## Changes the extra data on the given character. Only works with joined characters
525514
func change_character_extradata(character:DialogicCharacter, extra_data:="") -> void:
526515
if !is_character_joined(character):
527516
return
528-
_change_portrait_extradata(dialogic.current_state_info.portraits[character.resource_path].node, extra_data)
529-
dialogic.current_state_info.portraits[character.resource_path]['extra_data'] = extra_data
517+
_change_portrait_extradata(dialogic.current_state_info.portraits[character.get_identifier()].node, extra_data)
518+
dialogic.current_state_info.portraits[character.get_identifier()]['extra_data'] = extra_data
530519

531520

532521
## Starts the given animation on the given character. Only works with joined characters
@@ -536,7 +525,7 @@ func animate_character(character: DialogicCharacter, animation_path: String, len
536525

537526
animation_path = DialogicPortraitAnimationUtil.guess_animation(animation_path)
538527

539-
var character_node: Node = dialogic.current_state_info.portraits[character.resource_path].node
528+
var character_node: Node = dialogic.current_state_info.portraits[character.get_identifier()].node
540529

541530
return _animate_node(character_node, animation_path, length, repeats, is_reversed)
542531

@@ -546,11 +535,11 @@ func move_character(character:DialogicCharacter, position_id:String, time:= 0.0,
546535
if !is_character_joined(character):
547536
return
548537

549-
if dialogic.current_state_info.portraits[character.resource_path].position_id == position_id:
538+
if dialogic.current_state_info.portraits[character.get_identifier()].position_id == position_id:
550539
return
551540

552-
_move_character(dialogic.current_state_info.portraits[character.resource_path].node, position_id, time, easing, trans)
553-
dialogic.current_state_info.portraits[character.resource_path].position_id = position_id
541+
_move_character(dialogic.current_state_info.portraits[character.get_identifier()].node, position_id, time, easing, trans)
542+
dialogic.current_state_info.portraits[character.get_identifier()].position_id = position_id
554543
character_moved.emit({'character':character, 'position_id':position_id, 'time':time})
555544

556545

@@ -592,8 +581,8 @@ func leave_all_characters(animation_name:="", animation_length:=0.0, animation_w
592581
## Return `null` if the [param character] is not part of the scene.
593582
func get_character_node(character: DialogicCharacter) -> Node:
594583
if is_character_joined(character):
595-
if is_instance_valid(dialogic.current_state_info['portraits'][character.resource_path].node):
596-
return dialogic.current_state_info['portraits'][character.resource_path].node
584+
if is_instance_valid(dialogic.current_state_info['portraits'][character.get_identifier()].node):
585+
return dialogic.current_state_info['portraits'][character.get_identifier()].node
597586
return null
598587

599588

@@ -609,12 +598,12 @@ func remove_character(character: DialogicCharacter) -> void:
609598
character_node.queue_free()
610599
character_left.emit({'character': character})
611600

612-
dialogic.current_state_info['portraits'].erase(character.resource_path)
601+
dialogic.current_state_info['portraits'].erase(character.get_identifier())
613602

614603

615604
## Returns true if the given character is currently joined.
616605
func is_character_joined(character: DialogicCharacter) -> bool:
617-
if character == null or not character.resource_path in dialogic.current_state_info['portraits']:
606+
if character == null or not character.get_identifier() in dialogic.current_state_info['portraits']:
618607
return false
619608

620609
return true
@@ -624,8 +613,8 @@ func is_character_joined(character: DialogicCharacter) -> bool:
624613
func get_joined_characters() -> Array[DialogicCharacter]:
625614
var chars: Array[DialogicCharacter] = []
626615

627-
for char_path: String in dialogic.current_state_info.get('portraits', {}).keys():
628-
chars.append(load(char_path))
616+
for char_identifier: String in dialogic.current_state_info.get('portraits', {}).keys():
617+
chars.append(DialogicResourceUtil.get_character_resource(char_identifier))
629618

630619
return chars
631620

@@ -635,7 +624,7 @@ func get_joined_characters() -> Array[DialogicCharacter]:
635624
## Only joined is included (and false) for not joined characters
636625
func get_character_info(character:DialogicCharacter) -> Dictionary:
637626
if is_character_joined(character):
638-
var info: Dictionary = dialogic.current_state_info['portraits'][character.resource_path]
627+
var info: Dictionary = dialogic.current_state_info['portraits'][character.get_identifier()]
639628
info['joined'] = true
640629
return info
641630
else:
@@ -672,18 +661,18 @@ func change_speaker(speaker: DialogicCharacter = null, portrait := "") -> void:
672661
continue
673662

674663
if just_joined:
675-
ResourceLoader.load_threaded_request(speaker.resource_path)
664+
ResourceLoader.load_threaded_request(speaker.get_identifier())
676665

677-
var load_status = ResourceLoader.load_threaded_get_status(speaker.resource_path)
666+
var load_status = ResourceLoader.load_threaded_get_status(speaker.get_identifier())
678667
while load_status == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
679668
await get_tree().process_frame
680-
load_status = ResourceLoader.load_threaded_get_status(speaker.resource_path)
669+
load_status = ResourceLoader.load_threaded_get_status(speaker.get_identifier())
681670

682671
if load_status == ResourceLoader.THREAD_LOAD_LOADED:
683-
speaker = ResourceLoader.load_threaded_get(speaker.resource_path)
672+
speaker = ResourceLoader.load_threaded_get(speaker.get_identifier())
684673
_create_character_node(speaker, container)
685674
else:
686-
push_error('[Dialogic] Failed to load speaker "' + str(speaker.resource_path) + '".')
675+
push_error('[Dialogic] Failed to load speaker "' + str(speaker.get_identifier()) + '".')
687676
continue
688677

689678
elif portrait.is_empty():
@@ -728,10 +717,10 @@ func change_speaker(speaker: DialogicCharacter = null, portrait := "") -> void:
728717
var prev_speaker: DialogicCharacter = dialogic.Text.get_current_speaker()
729718
if speaker != prev_speaker:
730719
if is_character_joined(prev_speaker):
731-
dialogic.current_state_info["portraits"][prev_speaker.resource_path].node.get_child(-1)._unhighlight()
720+
dialogic.current_state_info["portraits"][prev_speaker.get_identifier()].node.get_child(-1)._unhighlight()
732721

733722
if is_character_joined(speaker):
734-
dialogic.current_state_info["portraits"][speaker.resource_path].node.get_child(-1)._highlight()
723+
dialogic.current_state_info["portraits"][speaker.get_identifier()].node.get_child(-1)._highlight()
735724

736725
#endregion
737726

addons/dialogic/Modules/Style/DialogicStylesUtil.gd

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ static func get_fallback_style() -> DialogicStyle:
4848

4949

5050
static func get_style_path(name_or_path:String) -> String:
51-
print(style_directory)
5251
if name_or_path.begins_with("res://"):
5352
if not ResourceLoader.exists(name_or_path):
5453
name_or_path = ""

addons/dialogic/Modules/Text/event_text.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func _execute() -> void:
7676

7777
var current_portrait: String = portrait
7878
if portrait.is_empty():
79-
portrait = dialogic.current_state_info["portraits"].get(character.resource_path, {}).get("portrait", "")
79+
current_portrait = dialogic.current_state_info["portraits"].get(character.get_identifier(), {}).get("portrait", "")
8080

8181
var current_portrait_sound_mood: String = character.portraits.get(current_portrait, {}).get("sound_mood", "")
8282
dialogic.Text.update_typing_sound_mood_from_character(character, current_portrait_sound_mood)

addons/dialogic/Resources/character.gd

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,21 +139,18 @@ func get_character_name() -> String:
139139
else:
140140
return "UnnamedCharacter"
141141

142-
#
143-
### Sets the unique identifier-string of this resource.
144-
### In editor (if the resource is already saved) the identifier will be stored.
145-
### In game (if the resource is not stored) the resource will be temporarily registered.
146-
#func set_identifier(new_identifier:String) -> bool:
147-
#if resource_path and Engine.is_editor_hint():
148-
#DialogicResourceUtil.change_unique_identifier(resource_path, new_identifier)
149-
#return true
150-
#if not resource_path and not Engine.is_editor_hint():
151-
#DialogicResourceUtil.register_runtime_resource(self, new_identifier, "dch")
152-
#return true
153-
#return false
154-
155142

156143
## Returns the info of the given portrait.
157144
## Uses the default portrait if the given portrait doesn't exist.
158145
func get_portrait_info(portrait_name:String) -> Dictionary:
159146
return portraits.get(portrait_name, portraits.get(default_portrait, {}))
147+
148+
149+
## Helper method intended for a simplified creation of portraits at runtime.
150+
## For more complex needs, manually writing to the portraits dict is recommended.
151+
func add_portrait(name:String, image:String, scene:= "") -> void:
152+
portraits[name] = {
153+
"scene": scene,
154+
"export_overrides": {
155+
"image": image}
156+
}

0 commit comments

Comments
 (0)