You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
4.3 KiB
179 lines
4.3 KiB
extends Control |
|
|
|
var character_data = { |
|
'name': 'Default', |
|
'image': "res://addons/dialogic/Example Assets/portraits/df-3.png", |
|
'color': Color(0.973511, 1, 0.152344), |
|
'file': '', |
|
'mirror_portraits': false |
|
} |
|
|
|
var single_portrait_mode = false |
|
var direction = 'left' |
|
var debug = false |
|
var fading_out = false |
|
|
|
var current_state := {'character':'', 'portrait':'', 'position':'', 'mirrored':false} |
|
|
|
|
|
func init(expression: String = '') -> void: |
|
set_portrait(expression) |
|
|
|
|
|
func _ready(): |
|
if debug: |
|
print('Character data loaded: ', character_data) |
|
print(rect_position, $TextureRect.rect_size) |
|
|
|
|
|
func set_portrait(expression: String) -> void: |
|
current_state['portrait'] = expression |
|
if expression == "(Don't change)": |
|
return |
|
|
|
if expression == '': |
|
expression = 'Default' |
|
|
|
# Clearing old custom scenes |
|
for n in get_children(): |
|
if 'DialogicCustomPortraitScene' in n.name: |
|
n.queue_free() |
|
|
|
var default |
|
for p in character_data['portraits']: |
|
if p['name'] == expression: |
|
if is_scene(p['path']): |
|
var custom_node = load(p['path']) |
|
var instance = custom_node.instance() |
|
instance.name = 'DialogicCustomPortraitScene' |
|
add_child(instance) |
|
|
|
$TextureRect.texture = ImageTexture.new() |
|
return |
|
else: |
|
if ResourceLoader.exists(p['path']): |
|
$TextureRect.texture = load(p['path']) |
|
else: |
|
$TextureRect.texture = ImageTexture.new() |
|
return |
|
# Saving what the default is to fallback to it. |
|
if p['name'] == 'Default': |
|
default = p['path'] |
|
|
|
# Everything failed, go with the default one |
|
if ResourceLoader.exists(default): |
|
$TextureRect.texture = load(default) |
|
else: |
|
$TextureRect.texture = ImageTexture.new() |
|
|
|
|
|
func set_mirror(value): |
|
current_state['mirrored'] = value |
|
if character_data["data"].has('mirror_portraits'): |
|
if character_data["data"]['mirror_portraits']: |
|
$TextureRect.flip_h = !value |
|
else: |
|
$TextureRect.flip_h = value |
|
else: |
|
$TextureRect.flip_h = value |
|
|
|
|
|
func move_to_position(position_offset, time = 0.5): |
|
var positions = { |
|
'left': Vector2(-400, 0), |
|
'right': Vector2(+400, 0), |
|
'center': Vector2(0, 0), |
|
'center_right': Vector2(200, 0), |
|
'center_left': Vector2(-200, 0)} |
|
|
|
direction = position_offset |
|
modulate = Color(1,1,1,0) |
|
tween_modulate(modulate, Color(1,1,1, 1), time) |
|
rect_position = positions[position_offset] |
|
|
|
# Setting the scale of the portrait |
|
var custom_scale = Vector2(1, 1) |
|
if character_data.has('data'): |
|
if character_data['data'].has('scale'): |
|
custom_scale = Vector2( |
|
float(character_data['data']['scale']) / 100, |
|
float(character_data['data']['scale']) / 100 |
|
) |
|
rect_scale = custom_scale |
|
if character_data['data'].has('offset_x'): |
|
rect_position += Vector2( |
|
character_data['data']['offset_x'], |
|
character_data['data']['offset_y'] |
|
) |
|
|
|
if $TextureRect.get('texture'): |
|
rect_position -= Vector2( |
|
$TextureRect.texture.get_width() * 0.5, |
|
$TextureRect.texture.get_height() |
|
) * custom_scale |
|
|
|
fade_in() |
|
|
|
|
|
# Tween stuff |
|
func fade_in(time = 0.5): |
|
tween_modulate(modulate, Color(1,1,1, 1), time) |
|
|
|
if single_portrait_mode == false: |
|
var end_pos = Vector2(0, -40) # starting at center |
|
if direction == 'right': |
|
end_pos = Vector2(+40, 0) |
|
elif direction == 'left': |
|
end_pos = Vector2(-40, 0) |
|
else: |
|
rect_position += Vector2(0, 40) |
|
|
|
$TweenPosition.interpolate_property( |
|
self, "rect_position", rect_position, rect_position + end_pos, time, |
|
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT |
|
) |
|
$TweenPosition.start() |
|
|
|
|
|
func fade_out(time = 0.5): |
|
fading_out = true |
|
var end = modulate |
|
end.a = 0 |
|
tween_modulate(modulate, end, time) |
|
$Tween.connect("tween_all_completed", self, "queue_free") |
|
|
|
|
|
func focus(): |
|
if not fading_out: |
|
tween_modulate(modulate, Color(1,1,1, 1)) |
|
var _parent = get_parent() |
|
if _parent: |
|
# Make sure that this portrait is the last to be _draw -ed |
|
_parent.move_child(self, _parent.get_child_count()) |
|
|
|
|
|
func focusout(): |
|
var alpha = 1 |
|
if single_portrait_mode: |
|
alpha = 0 |
|
if not fading_out: |
|
tween_modulate(modulate, Color(0.5,0.5,0.5, alpha)) |
|
var _parent = get_parent() |
|
if _parent: |
|
# Render this portrait first |
|
_parent.move_child(self, 0) |
|
|
|
|
|
func tween_modulate(from_value, to_value, time = 0.5): |
|
$Tween.interpolate_property( |
|
self, "modulate", from_value, to_value, time, |
|
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT |
|
) |
|
$Tween.start() |
|
return $Tween |
|
|
|
|
|
func is_scene(path) -> bool: |
|
if '.tscn' in path.to_lower(): |
|
return true |
|
return false
|
|
|