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.

CharacterEditor.gd 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. tool
  2. extends ScrollContainer
  3. var editor_reference
  4. onready var master_tree = get_node('../MasterTree')
  5. var opened_character_data
  6. var portrait_entry = load("res://addons/dialogic/Editor/CharacterEditor/PortraitEntry.tscn")
  7. onready var nodes = {
  8. 'editor': $HBoxContainer/Container,
  9. 'name': $HBoxContainer/Container/Name/LineEdit,
  10. 'description': $HBoxContainer/Container/Description/TextEdit,
  11. 'file': $HBoxContainer/Container/FileName/LineEdit,
  12. 'color': $HBoxContainer/Container/Color/ColorPickerButton,
  13. 'default_speaker': $HBoxContainer/Container/Actions/DefaultSpeaker,
  14. 'display_name_checkbox': $HBoxContainer/Container/Name/CheckBox,
  15. 'display_name': $HBoxContainer/Container/DisplayName/LineEdit,
  16. 'new_portrait_button': $HBoxContainer/Container/ScrollContainer/VBoxContainer/HBoxContainer/Button,
  17. 'portrait_preview': $HBoxContainer/VBoxContainer/Control/TextureRect,
  18. 'scale': $HBoxContainer/VBoxContainer/HBoxContainer/Scale,
  19. 'offset_x': $HBoxContainer/VBoxContainer/HBoxContainer/OffsetX,
  20. 'offset_y': $HBoxContainer/VBoxContainer/HBoxContainer/OffsetY,
  21. }
  22. func _ready():
  23. nodes['new_portrait_button'].connect('pressed', self, '_on_New_Portrait_Button_pressed')
  24. nodes['display_name_checkbox'].connect('toggled', self, '_on_display_name_toggled')
  25. nodes['name'].connect('text_changed', self, '_on_name_changed')
  26. nodes['color'].connect('color_changed', self, '_on_color_changed')
  27. func is_selected(file: String):
  28. return nodes['file'].text == file
  29. func _on_display_name_toggled(button_pressed):
  30. $HBoxContainer/Container/DisplayName.visible = button_pressed
  31. func _on_name_changed(value):
  32. var item = master_tree.get_selected()
  33. item.set_text(0, value)
  34. save_character()
  35. master_tree.build_characters(nodes['file'].text)
  36. func _on_color_changed(color):
  37. var item = master_tree.get_selected()
  38. item.set_icon_modulate(0, color)
  39. func clear_character_editor():
  40. nodes['file'].text = ''
  41. nodes['name'].text = ''
  42. nodes['description'].text = ''
  43. nodes['color'].color = Color('#ffffff')
  44. nodes['default_speaker'].pressed = false
  45. nodes['display_name_checkbox'].pressed = false
  46. nodes['display_name'].text = ''
  47. nodes['portraits'] = []
  48. nodes['scale'].value = 100
  49. nodes['offset_x'].value = 0
  50. nodes['offset_y'].value = 0
  51. # Clearing portraits
  52. for p in $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList.get_children():
  53. p.queue_free()
  54. nodes['portrait_preview'].texture = null
  55. # Character Creation
  56. func create_character():
  57. var character_file = 'character-' + str(OS.get_unix_time()) + '.json'
  58. var character = {
  59. 'color': '#ffffff',
  60. 'id': character_file,
  61. 'default_speaker': false,
  62. 'portraits': []
  63. }
  64. DialogicResources.set_character(character)
  65. character['metadata'] = {'file': character_file}
  66. return character
  67. func new_character():
  68. # This event creates and selects the new character
  69. master_tree.build_characters(create_character()['metadata']['file'])
  70. # Saving and Loading
  71. func generate_character_data_to_save():
  72. var default_speaker: bool = nodes['default_speaker'].pressed
  73. var portraits = []
  74. for p in $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList.get_children():
  75. var entry = {}
  76. entry['name'] = p.get_node("NameEdit").text
  77. entry['path'] = p.get_node("PathEdit").text
  78. portraits.append(entry)
  79. var info_to_save = {
  80. 'id': nodes['file'].text,
  81. 'description': nodes['description'].text,
  82. 'color': '#' + nodes['color'].color.to_html(),
  83. 'default_speaker': default_speaker,
  84. 'portraits': portraits,
  85. 'display_name_bool': nodes['display_name_checkbox'].pressed,
  86. 'display_name': nodes['display_name'].text,
  87. 'scale': nodes['scale'].value,
  88. 'offset_x': nodes['offset_x'].value,
  89. 'offset_y': nodes['offset_y'].value,
  90. }
  91. # Adding name later for cases when no name is provided
  92. if nodes['name'].text != '':
  93. info_to_save['name'] = nodes['name'].text
  94. return info_to_save
  95. func save_character():
  96. var info_to_save = generate_character_data_to_save()
  97. if info_to_save['id']:
  98. DialogicResources.set_character(info_to_save)
  99. opened_character_data = info_to_save
  100. func load_character(filename: String):
  101. clear_character_editor()
  102. var data = DialogicResources.get_character_json(filename)
  103. opened_character_data = data
  104. nodes['file'].text = data['id']
  105. nodes['default_speaker'].pressed = false
  106. if data.has('name'):
  107. nodes['name'].text = data['name']
  108. if data.has('description'):
  109. nodes['description'].text = data['description']
  110. if data.has('color'):
  111. nodes['color'].color = Color(data['color'])
  112. if data.has('default_speaker'):
  113. if data['default_speaker']:
  114. nodes['default_speaker'].pressed = true
  115. if data.has('display_name_bool'):
  116. nodes['display_name_checkbox'].pressed = data['display_name_bool']
  117. if data.has('display_name'):
  118. nodes['display_name'].text = data['display_name']
  119. if data.has('scale'):
  120. nodes['scale'].value = float(data['scale'])
  121. if data.has('offset_x'):
  122. nodes['offset_x'].value = data['offset_x']
  123. nodes['offset_y'].value = data['offset_y']
  124. # Portraits
  125. var default_portrait = create_portrait_entry()
  126. default_portrait.get_node('NameEdit').text = 'Default'
  127. default_portrait.get_node('NameEdit').editable = false
  128. if data.has('portraits'):
  129. for p in data['portraits']:
  130. if p['name'] == 'Default':
  131. default_portrait.get_node('PathEdit').text = p['path']
  132. default_portrait.update_preview(p['path'])
  133. else:
  134. create_portrait_entry(p['name'], p['path'])
  135. # Portraits
  136. func _on_New_Portrait_Button_pressed():
  137. create_portrait_entry('', '', true)
  138. func create_portrait_entry(p_name = '', path = '', grab_focus = false):
  139. var p = portrait_entry.instance()
  140. p.editor_reference = editor_reference
  141. p.image_node = nodes['portrait_preview']
  142. var p_list = $HBoxContainer/Container/ScrollContainer/VBoxContainer/PortraitList
  143. p_list.add_child(p)
  144. if p_name != '':
  145. p.get_node("NameEdit").text = p_name
  146. if path != '':
  147. p.get_node("PathEdit").text = path
  148. if grab_focus:
  149. p.get_node("NameEdit").grab_focus()
  150. p._on_ButtonSelect_pressed()
  151. return p