Skip to content

Commit a334069

Browse files
committed
Improve runtime characters ability to have portraits.
Changes the portrait subsystem to index characters by their identifier instead of the resource path and removes an unnecessary threaded loading loop.
1 parent e533bb0 commit a334069

File tree

6 files changed

+52
-68
lines changed

6 files changed

+52
-68
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: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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
@@ -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)