No Description
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.

Portrait.gd 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. extends Control
  2. var character_data = {
  3. 'name': 'Default',
  4. 'image': "res://addons/dialogic/Images/portraits/df-3.png",
  5. 'color': Color(0.973511, 1, 0.152344),
  6. 'file': ''
  7. }
  8. var positions = {
  9. 'left': Vector2(-400, 0),
  10. 'right': Vector2(+400, 0),
  11. 'center': Vector2(0, 0),
  12. 'center_right': Vector2(200, 0),
  13. 'center_left': Vector2(-200, 0)}
  14. var direction = 'left'
  15. var debug = false
  16. func init(expression: String = '', position_offset = 'left') -> void:
  17. rect_position += positions[position_offset]
  18. direction = position_offset
  19. modulate = Color(1,1,1,0)
  20. # Setting the scale of the portrait
  21. var custom_scale = Vector2(1, 1)
  22. if character_data.has('data'):
  23. if character_data['data'].has('scale'):
  24. custom_scale = Vector2(
  25. float(character_data['data']['scale']) / 100,
  26. float(character_data['data']['scale']) / 100
  27. )
  28. rect_scale = custom_scale
  29. if character_data['data'].has('offset_x'):
  30. rect_position += Vector2(
  31. character_data['data']['offset_x'],
  32. character_data['data']['offset_y']
  33. )
  34. set_portrait(expression)
  35. if $TextureRect.texture:
  36. rect_position -= Vector2(
  37. $TextureRect.texture.get_width() * 0.5,
  38. $TextureRect.texture.get_height()
  39. ) * custom_scale
  40. func _ready():
  41. if debug:
  42. print('Character data loaded: ', character_data)
  43. print(rect_position, $TextureRect.rect_size)
  44. func set_portrait(expression: String) -> void:
  45. if expression == '':
  46. expression = 'Default'
  47. var portraits = character_data['portraits']
  48. for p in portraits:
  49. if p['name'] == expression:
  50. if ResourceLoader.exists(p['path']):
  51. $TextureRect.texture = load(p['path'])
  52. else:
  53. $TextureRect.texture = Texture.new()
  54. # Tween stuff
  55. func fade_in(node = self, time = 0.5):
  56. tween_modulate(Color(1,1,1,0), Color(1,1,1,1), time)
  57. var end_pos = Vector2(0, -40) # starting at center
  58. if direction == 'right':
  59. end_pos = Vector2(+40, 0)
  60. elif direction == 'left':
  61. end_pos = Vector2(-40, 0)
  62. else:
  63. node.rect_position += Vector2(0, 40)
  64. var tween_node = node.get_node('Tween')
  65. tween_node.interpolate_property(
  66. node, "rect_position", node.rect_position, node.rect_position + end_pos, time,
  67. Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
  68. )
  69. tween_node.start()
  70. func fade_out(node = self, time = 0.5):
  71. tween_modulate(modulate, Color(1,1,1,0), time)
  72. $Tween.connect("tween_all_completed", self, "queue_free")
  73. func focus():
  74. tween_modulate(modulate, Color(1,1,1,1))
  75. func focusout():
  76. tween_modulate(modulate, Color(0.5,0.5,0.5,1))
  77. func tween_modulate(from_value, to_value, time = 0.5):
  78. var tween_node = $Tween
  79. tween_node.interpolate_property(
  80. self, "modulate", from_value, to_value, time,
  81. Tween.TRANS_LINEAR, Tween.EASE_IN_OUT
  82. )
  83. tween_node.start()
  84. return tween_node