diff --git a/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.md5 b/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.md5 new file mode 100644 index 00000000..82b9daa2 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.md5 @@ -0,0 +1,3 @@ +source_md5="3386c5f924ab454d044de923826a8863" +dest_md5="89c345643a6ed38f4f5e69c507b3a7fe" + diff --git a/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.stex b/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.stex new file mode 100644 index 00000000..5a50a8cb Binary files /dev/null and b/Phase2/Godot_Toolset/Main/.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.stex differ diff --git a/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.md5 b/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.md5 new file mode 100644 index 00000000..a3dff158 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.md5 @@ -0,0 +1,3 @@ +source_md5="2c84ab820e6ab4fd3edac0e8021dc46b" +dest_md5="f999f4cf7e7b734127087a318237503c" + diff --git a/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.stex b/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.stex new file mode 100644 index 00000000..b2844074 Binary files /dev/null and b/Phase2/Godot_Toolset/Main/.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.stex differ diff --git a/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.md5 b/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.md5 new file mode 100644 index 00000000..e70fef90 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.md5 @@ -0,0 +1,3 @@ +source_md5="a53ac63cf06100eacb004d186a71fced" +dest_md5="1d771ff18448ae2586bc9f65bb2ac41a" + diff --git a/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.stex b/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.stex new file mode 100644 index 00000000..73c901e0 Binary files /dev/null and b/Phase2/Godot_Toolset/Main/.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.stex differ diff --git a/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.md5 b/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.md5 new file mode 100644 index 00000000..b8ff3506 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.md5 @@ -0,0 +1,3 @@ +source_md5="feb0f2665450f2f4c618fb985bcc5ffc" +dest_md5="f5865bc9861031704e2be9e39c2f56ce" + diff --git a/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.stex b/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.stex new file mode 100644 index 00000000..ae90e9a2 Binary files /dev/null and b/Phase2/Godot_Toolset/Main/.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.stex differ diff --git a/Phase2/Godot_Toolset/Main/assets/add_button_texture.png b/Phase2/Godot_Toolset/Main/assets/add_button_texture.png new file mode 100644 index 00000000..811e9776 Binary files /dev/null and b/Phase2/Godot_Toolset/Main/assets/add_button_texture.png differ diff --git a/Phase2/Godot_Toolset/Main/assets/add_button_texture.png.import b/Phase2/Godot_Toolset/Main/assets/add_button_texture.png.import new file mode 100644 index 00000000..32394ffc --- /dev/null +++ b/Phase2/Godot_Toolset/Main/assets/add_button_texture.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/add_button_texture.png" +dest_files=[ "res://.import/add_button_texture.png-98a4c039ca15f3d568027e4f1424e999.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png b/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png new file mode 100644 index 00000000..3249e84f Binary files /dev/null and b/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png differ diff --git a/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png.import b/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png.import new file mode 100644 index 00000000..1456e760 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/assets/add_button_texture_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/add_button_texture_2.png" +dest_files=[ "res://.import/add_button_texture_2.png-b44fd960bb4c5d20fcb1af17f813f357.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png b/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png new file mode 100644 index 00000000..bedb7c02 Binary files /dev/null and b/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png differ diff --git a/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png.import b/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png.import new file mode 100644 index 00000000..3d0335bd --- /dev/null +++ b/Phase2/Godot_Toolset/Main/assets/remove_button_texture.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/remove_button_texture.png" +dest_files=[ "res://.import/remove_button_texture.png-15cbc37d7deab63dc33e5542837efac4.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png b/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png new file mode 100644 index 00000000..9ebe232a Binary files /dev/null and b/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png differ diff --git a/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png.import b/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png.import new file mode 100644 index 00000000..4d7cb033 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/assets/remove_button_texture_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/remove_button_texture_2.png" +dest_files=[ "res://.import/remove_button_texture_2.png-0e5b8f541716f13afdc7ff9ae04ab75e.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/Phase2/Godot_Toolset/Main/project.godot b/Phase2/Godot_Toolset/Main/project.godot index 8e684ea2..b650b05a 100644 --- a/Phase2/Godot_Toolset/Main/project.godot +++ b/Phase2/Godot_Toolset/Main/project.godot @@ -21,13 +21,18 @@ _global_script_class_icons={ [application] config/name="bcirpg_toolset" -run/main_scene="res://screens/wizards/character_creation/character_creation_wizard.tscn" +run/main_scene="res://screens/main_menu.tscn" config/icon="res://icon.png" [autoload] SpecialAbility="*res://middleware/specialabliities/SpecialAbility.gd" +[display] + +window/stretch/mode="viewport" +window/stretch/aspect="expand" + [global] filters=false diff --git a/Phase2/Godot_Toolset/Main/screens/main_menu.tscn b/Phase2/Godot_Toolset/Main/screens/main_menu.tscn new file mode 100644 index 00000000..193fb1f6 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/screens/main_menu.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://user_interface/button_opene_scene_in_window.gd" type="Script" id=2] + +[node name="menu" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +anchor_left = 0.333 +anchor_top = 0.125 +anchor_right = 0.666 +anchor_bottom = 0.875 + +[node name="ButtonCharacterCreation" type="Button" parent="VBoxContainer"] +margin_right = 340.0 +margin_bottom = 20.0 +text = "Character Creation" +script = ExtResource( 2 ) +scene_path = "res://screens/wizards/character_creation/character_creation_wizard.tscn" +window_title = "Character Editor" + +[node name="ButtonGenreSubstitution" type="Button" parent="VBoxContainer"] +margin_top = 24.0 +margin_right = 340.0 +margin_bottom = 44.0 +text = "Genre Substitution" +script = ExtResource( 2 ) +scene_path = "res://screens/wizards/genre_substitution/genre_substitution_wizard.tscn" +window_title = "Genre Substitution" diff --git a/Phase2/Godot_Toolset/Main/screens/wizards/character_creation/character_creation_wizard.tscn b/Phase2/Godot_Toolset/Main/screens/wizards/character_creation/character_creation_wizard.tscn index 606acce5..77a78c91 100644 --- a/Phase2/Godot_Toolset/Main/screens/wizards/character_creation/character_creation_wizard.tscn +++ b/Phase2/Godot_Toolset/Main/screens/wizards/character_creation/character_creation_wizard.tscn @@ -12,8 +12,6 @@ script = ExtResource( 3 ) [node name="ColorRect" type="ColorRect" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -margin_top = -6.0 -margin_bottom = -6.0 color = Color( 0.537255, 0.537255, 0.537255, 1 ) [node name="RootVBoxContainer" type="VBoxContainer" parent="."] diff --git a/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.gd b/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.gd new file mode 100644 index 00000000..01661ce6 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.gd @@ -0,0 +1,163 @@ +extends Control + +export var display_tree_path : NodePath +onready var display_tree = get_node(display_tree_path) + +export var file_dialog_path : NodePath +onready var file_dialog = get_node(file_dialog_path) + +export var add_button_texture : Texture +export var add_button_texture_2 : Texture +export var remove_button_texture : Texture + +#var replacements_dict : Dictionary = {} +#var genre_array : Array = [] # doesn't seem strictly necessary; for export into expected format + + +# Called when the node enters the scene tree for the first time. +func _ready(): + display_tree.set_hide_root(true) + display_tree.columns = 4 + display_tree.set_column_min_width(0, 32) + display_tree.set_column_expand(0, false) + display_tree.set_column_min_width(2, 32) + display_tree.set_column_expand(2, false) + display_tree.connect("button_pressed", self, "_on_tree_button_pressed") + +func _get_data_as_json(): + var tree_dict = _display_tree_to_dict() + var json_data = {"GENRES":tree_dict.keys(), "REPLACEMENTS":tree_dict} + return to_json(json_data) + +func _load_data_from_json(json_text): + var parsed_json = parse_json(json_text) + print(parsed_json) + var replacements_dict = parsed_json.get("REPLACEMENTS") + #genre_array = parsed_json.get("GENRES") + _refresh_tree() + _fill_tree(replacements_dict) + +func _add_genre(genre_name : String): + # add genre to tree + # todo: prevent duplicates???? + + var new_genre = display_tree.create_item(display_tree.get_root()) + new_genre.set_text(1, genre_name) + new_genre.set_editable(1, true) + new_genre.set_expand_right(1, true) + new_genre.add_button(0, remove_button_texture, -1, false, "Remove Genre") + + return new_genre + +func _add_replacement(genre_node, generic, replacement): + var new_replacement = display_tree.create_item(genre_node) + new_replacement.set_text(1, generic) + new_replacement.set_text(2, " -> ") + new_replacement.set_text(3, replacement) + + new_replacement.set_editable(1, true) + new_replacement.set_editable(3, true) + + new_replacement.set_selectable(2, false) + + new_replacement.add_button(0, remove_button_texture, -1, false, "Remove Replacement") + + return new_replacement + +func _add_genre_button(): + var add_genre_button = display_tree.create_item(display_tree.get_root()) + add_genre_button.add_button(0, add_button_texture_2, -1, false, "Add Genre") + add_genre_button.set_selectable(1, false) + add_genre_button.set_selectable(2, false) + add_genre_button.set_selectable(3, false) + +func _add_replacement_button(genre_node): + var add_replacement_button = display_tree.create_item(genre_node) + add_replacement_button.add_button(0, add_button_texture, -1, false, "Add Replacement") + add_replacement_button.set_selectable(1, false) + add_replacement_button.set_selectable(2, false) + add_replacement_button.set_selectable(3, false) + + +func _display_tree_to_dict(): + var tree_dict = {} # make a dict to store our tree in + var current_genre = display_tree.get_root().get_children() # the root exists to store our subtrees; we don't want it in the dict + + while current_genre != null: + var current_genre_text = current_genre.get_text(1) + if current_genre_text != "": # currently, the buttons are blank tree items with texture buttons in them, so we'll skip them + tree_dict[current_genre_text] = {} + var current_generic = current_genre.get_children() # fyi, get_children actually just gets the first child item + + while current_generic != null: + var current_generic_text = current_generic.get_text(1) + if current_generic_text != "": + tree_dict[current_genre_text][current_generic_text] = current_generic.get_text(3) + current_generic = current_generic.get_next() + + current_genre = current_genre.get_next() + return tree_dict + +func _fill_tree(replacements_dict): # why, yes, i am iterating through dicts. cry about it + for genre in replacements_dict.keys(): + var genre_node = _add_genre(genre) + + for generic in replacements_dict[genre].keys(): + var replacement = replacements_dict[genre][generic] + _add_replacement(genre_node, generic, replacement) + + _add_replacement_button(genre_node) + _add_genre_button() + #_add_tree_buttons() + +func _refresh_tree(): + display_tree.clear() + var root_node = display_tree.create_item() + root_node.set_text(0,"Genres") + + +func _on_LoadButton_pressed(): + file_dialog.set_mode(FileDialog.MODE_OPEN_FILE) + file_dialog.popup_centered() + +func _on_SaveButton_pressed(): + file_dialog.set_mode(FileDialog.MODE_SAVE_FILE) + file_dialog.popup() + +func _on_FileDialog_file_selected(path): + var file = File.new() + if file_dialog.get_mode() == FileDialog.MODE_OPEN_FILE: + file.open(path, File.READ) + var file_text = file.get_as_text() + _load_data_from_json(file_text) + + #_fill_tree() + elif file_dialog.get_mode() == FileDialog.MODE_SAVE_FILE: + if file.file_exists(path): + print("existing file; just fyi it's gonna overwrite") + file.open(path, File.WRITE) + file.store_string(_get_data_as_json()) + file.close() + +func _on_NewButton_pressed(): + _refresh_tree() + _add_genre_button() + +func _on_tree_button_pressed(button_tree_item, column, id): + var button_index = button_tree_item.get_button_by_id(0, id) + var button_texture = button_tree_item.get_button(0, button_index) + + if button_texture == remove_button_texture: + button_tree_item.get_parent().remove_child(button_tree_item) + button_tree_item.free() + elif button_texture == add_button_texture: + if button_tree_item.get_parent() == display_tree.get_root(): + print("adding genre") + var new_genre_node = _add_genre("") + _add_replacement_button(new_genre_node) + else: + print("adding replacement") + _add_replacement(button_tree_item.get_parent(), "", "") + button_tree_item.move_to_bottom() + else: + print("unrecognized button! Initializing self-destruct sequence.") diff --git a/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.tscn b/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.tscn new file mode 100644 index 00000000..ff699616 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/screens/wizards/genre_substitution/genre_substitution_wizard.tscn @@ -0,0 +1,241 @@ +[gd_scene load_steps=6 format=2] + +[ext_resource path="res://assets/remove_button_texture_2.png" type="Texture" id=1] +[ext_resource path="res://assets/add_button_texture.png" type="Texture" id=2] +[ext_resource path="res://assets/remove_button_texture.png" type="Texture" id=3] +[ext_resource path="res://assets/add_button_texture_2.png" type="Texture" id=4] + +[sub_resource type="GDScript" id=1] +script/source = "extends Control + +export var display_tree_path : NodePath +onready var display_tree = get_node(display_tree_path) + +export var file_dialog_path : NodePath +onready var file_dialog = get_node(file_dialog_path) + +export var add_button_texture : Texture +export var add_button_texture_2 : Texture +export var remove_button_texture : Texture +export var remove_button_texture_2 : Texture + +#var replacements_dict : Dictionary = {} +#var genre_array : Array = [] # doesn't seem strictly necessary; for export into expected format + + +# Called when the node enters the scene tree for the first time. +func _ready(): + display_tree.set_hide_root(true) + display_tree.columns = 4 + display_tree.set_column_min_width(0, 32) + display_tree.set_column_expand(0, false) + display_tree.set_column_min_width(2, 32) + display_tree.set_column_expand(2, false) + display_tree.connect(\"button_pressed\", self, \"_on_tree_button_pressed\") + +func _get_data_as_json(): + var tree_dict = _display_tree_to_dict() + var json_data = {\"GENRES\":tree_dict.keys(), \"REPLACEMENTS\":tree_dict} + return to_json(json_data) + +func _load_data_from_json(json_text): + var parsed_json = parse_json(json_text) + print(parsed_json) + var replacements_dict = parsed_json.get(\"REPLACEMENTS\") + #genre_array = parsed_json.get(\"GENRES\") + _refresh_tree() + _fill_tree(replacements_dict) + +func _add_genre(genre_name : String): + # add genre to tree + # todo: prevent duplicates???? + + var new_genre = display_tree.create_item(display_tree.get_root()) + new_genre.set_text(1, genre_name) + new_genre.set_editable(1, true) + new_genre.set_expand_right(1, true) + new_genre.add_button(0, remove_button_texture_2, -1, false, \"Remove Genre\") + + return new_genre + +func _add_replacement(genre_node, generic, replacement): + var new_replacement = display_tree.create_item(genre_node) + new_replacement.set_text(1, generic) + new_replacement.set_text(2, \" -> \") + new_replacement.set_text(3, replacement) + + new_replacement.set_editable(1, true) + new_replacement.set_editable(3, true) + + new_replacement.set_selectable(2, false) + + new_replacement.add_button(0, remove_button_texture, -1, false, \"Remove Replacement\") + + return new_replacement + +func _add_genre_button(): + var add_genre_button = display_tree.create_item(display_tree.get_root()) + add_genre_button.add_button(0, add_button_texture_2, -1, false, \"Add Genre\") + add_genre_button.set_selectable(1, false) + add_genre_button.set_selectable(2, false) + add_genre_button.set_selectable(3, false) + +func _add_replacement_button(genre_node): + var add_replacement_button = display_tree.create_item(genre_node) + add_replacement_button.add_button(0, add_button_texture, -1, false, \"Add Replacement\") + add_replacement_button.set_selectable(1, false) + add_replacement_button.set_selectable(2, false) + add_replacement_button.set_selectable(3, false) + + +func _display_tree_to_dict(): + var tree_dict = {} # make a dict to store our tree in + var current_genre = display_tree.get_root().get_children() # the root exists to store our subtrees; we don't want it in the dict + + while current_genre != null: + var current_genre_text = current_genre.get_text(1) + if current_genre_text != \"\": # currently, the buttons are blank tree items with texture buttons in them, so we'll skip them + tree_dict[current_genre_text] = {} + var current_generic = current_genre.get_children() # fyi, get_children actually just gets the first child item + + while current_generic != null: + var current_generic_text = current_generic.get_text(1) + if current_generic_text != \"\": + tree_dict[current_genre_text][current_generic_text] = current_generic.get_text(3) + current_generic = current_generic.get_next() + + current_genre = current_genre.get_next() + return tree_dict + +func _fill_tree(replacements_dict): # why, yes, i am iterating through dicts. cry about it + for genre in replacements_dict.keys(): + var genre_node = _add_genre(genre) + + for generic in replacements_dict[genre].keys(): + var replacement = replacements_dict[genre][generic] + _add_replacement(genre_node, generic, replacement) + + _add_replacement_button(genre_node) + _add_genre_button() + #_add_tree_buttons() + +func _refresh_tree(): + display_tree.clear() + var root_node = display_tree.create_item() + root_node.set_text(0,\"Genres\") + + +func _on_LoadButton_pressed(): + file_dialog.set_mode(FileDialog.MODE_OPEN_FILE) + file_dialog.popup_centered() + +func _on_SaveButton_pressed(): + file_dialog.set_mode(FileDialog.MODE_SAVE_FILE) + file_dialog.popup() + +func _on_FileDialog_file_selected(path): + var file = File.new() + if file_dialog.get_mode() == FileDialog.MODE_OPEN_FILE: + file.open(path, File.READ) + var file_text = file.get_as_text() + _load_data_from_json(file_text) + + #_fill_tree() + elif file_dialog.get_mode() == FileDialog.MODE_SAVE_FILE: + if file.file_exists(path): + print(\"existing file; just fyi it's gonna overwrite\") + file.open(path, File.WRITE) + file.store_string(_get_data_as_json()) + file.close() + +func _on_NewButton_pressed(): + _refresh_tree() + _add_genre_button() + +func _on_tree_button_pressed(button_tree_item, column, id): + var button_index = button_tree_item.get_button_by_id(0, id) + var button_texture = button_tree_item.get_button(0, button_index) + + if button_texture == remove_button_texture || button_texture == remove_button_texture_2: + button_tree_item.get_parent().remove_child(button_tree_item) + button_tree_item.free() + elif button_texture == add_button_texture || button_texture == add_button_texture_2: + if button_tree_item.get_parent() == display_tree.get_root(): + print(\"adding genre\") + var new_genre_node = _add_genre(\"\") + _add_replacement_button(new_genre_node) + else: + print(\"adding replacement\") + _add_replacement(button_tree_item.get_parent(), \"\", \"\") + button_tree_item.move_to_bottom() + else: + print(\"unrecognized button! Initializing self-destruct sequence.\") +" + +[node name="GenreSubstitutionWizard" type="Control"] +anchor_right = 1.0 +anchor_bottom = 1.0 +size_flags_horizontal = 7 +size_flags_vertical = 3 +script = SubResource( 1 ) +display_tree_path = NodePath("DisplayTree") +file_dialog_path = NodePath("FileDialog") +add_button_texture = ExtResource( 2 ) +add_button_texture_2 = ExtResource( 4 ) +remove_button_texture = ExtResource( 3 ) +remove_button_texture_2 = ExtResource( 1 ) + +[node name="FileDialog" type="FileDialog" parent="."] +margin_right = 1024.0 +margin_bottom = 600.0 +popup_exclusive = true +window_title = "Open a File" +resizable = true +mode = 0 +access = 2 + +[node name="DisplayTree" type="Tree" parent="."] +anchor_top = 0.075 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_right = 1.0 +margin_bottom = 1.0 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="HBoxContainer" type="HBoxContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 0.075 + +[node name="LoadButton" type="Button" parent="HBoxContainer"] +margin_right = 338.0 +margin_bottom = 45.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Load" + +[node name="SaveButton" type="Button" parent="HBoxContainer"] +margin_left = 342.0 +margin_right = 681.0 +margin_bottom = 45.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +text = "Save" + +[node name="NewButton" type="Button" parent="HBoxContainer"] +margin_left = 685.0 +margin_right = 1024.0 +margin_bottom = 45.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +text = "New" + +[connection signal="file_selected" from="FileDialog" to="." method="_on_FileDialog_file_selected"] +[connection signal="pressed" from="HBoxContainer/LoadButton" to="." method="_on_LoadButton_pressed"] +[connection signal="pressed" from="HBoxContainer/SaveButton" to="." method="_on_SaveButton_pressed"] +[connection signal="pressed" from="HBoxContainer/NewButton" to="." method="_on_NewButton_pressed"] diff --git a/Phase2/Godot_Toolset/Main/user_interface/PersistentWindow.tscn b/Phase2/Godot_Toolset/Main/user_interface/PersistentWindow.tscn new file mode 100644 index 00000000..71cf1967 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/PersistentWindow.tscn @@ -0,0 +1,126 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://user_interface/resize_parent.gd" type="Script" id=1] +[ext_resource path="res://user_interface/move_parent.gd" type="Script" id=2] +[ext_resource path="res://user_interface/remove_parent_button.gd" type="Script" id=3] + +[node name="PersistentWindow" type="Control"] +anchor_left = 0.25 +anchor_top = 0.25 +anchor_right = 0.75 +anchor_bottom = 0.75 + +[node name="Panel" type="Panel" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -10.0 +margin_top = -20.0 +margin_right = 10.0 +margin_bottom = 10.0 + +[node name="move" type="Control" parent="."] +anchor_right = 1.0 +margin_top = -15.0 +script = ExtResource( 2 ) + +[node name="ColorRect" type="ColorRect" parent="move"] +anchor_right = 1.0 +anchor_bottom = 1.0 +mouse_filter = 2 + +[node name="resize top left" type="Control" parent="."] +margin_left = -15.0 +margin_top = -25.0 +margin_right = 10.0 +script = ExtResource( 1 ) +resize_left = true +resize_top = true + +[node name="resize top right" type="Control" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -10.0 +margin_top = -25.0 +margin_right = 15.0 +script = ExtResource( 1 ) +resize_right = true +resize_top = true + +[node name="resize bottom left" type="Control" parent="."] +anchor_top = 1.0 +anchor_bottom = 1.0 +margin_left = -15.0 +margin_top = -10.0 +margin_right = 10.0 +margin_bottom = 15.0 +script = ExtResource( 1 ) +resize_left = true +resize_bottom = true + +[node name="resize bottom right" type="Control" parent="."] +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = -10.0 +margin_top = -10.0 +margin_right = 15.0 +margin_bottom = 15.0 +script = ExtResource( 1 ) +resize_right = true +resize_bottom = true + +[node name="resize top" type="Control" parent="."] +anchor_right = 1.0 +margin_left = 10.0 +margin_top = -25.0 +margin_right = -10.0 +margin_bottom = -15.0 +script = ExtResource( 1 ) +resize_top = true + +[node name="resize bottom" type="Control" parent="."] +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 10.0 +margin_top = 5.0 +margin_right = -10.0 +margin_bottom = 15.0 +script = ExtResource( 1 ) +resize_bottom = true + +[node name="resize left" type="Control" parent="."] +anchor_bottom = 1.0 +margin_left = -15.0 +margin_top = 10.0 +margin_right = -5.0 +margin_bottom = -10.0 +script = ExtResource( 1 ) +resize_left = true + +[node name="resize right" type="Control" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 5.0 +margin_top = 10.0 +margin_right = 15.0 +margin_bottom = -10.0 +script = ExtResource( 1 ) +resize_right = true + +[node name="close window" type="Button" parent="."] +anchor_left = 1.0 +anchor_right = 1.0 +margin_left = -10.0 +margin_top = -15.0 +margin_right = 10.0 +margin_bottom = 5.0 +grow_horizontal = 0 +rect_scale = Vector2( 0.75, 0.75 ) +text = "x" +icon_align = 1 +script = ExtResource( 3 ) + +[connection signal="button_up" from="close window" to="close window" method="_on_close_window_button_up"] diff --git a/Phase2/Godot_Toolset/Main/user_interface/button_change_scene.gd b/Phase2/Godot_Toolset/Main/user_interface/button_change_scene.gd new file mode 100644 index 00000000..fbf63dff --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/button_change_scene.gd @@ -0,0 +1,10 @@ +extends Button + + +export(String, FILE) var next_scene_path: = "" + +func _ready(): + connect("button_up", self, "_on_button_up") + +func _on_button_up(): + var _next_scene_load = get_tree().change_scene(next_scene_path) diff --git a/Phase2/Godot_Toolset/Main/user_interface/button_opene_scene_in_window.gd b/Phase2/Godot_Toolset/Main/user_interface/button_opene_scene_in_window.gd new file mode 100644 index 00000000..15792ba5 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/button_opene_scene_in_window.gd @@ -0,0 +1,22 @@ +extends Button + + +export(String, FILE) var scene_path: = "Scene Path" +export(String) var window_title = "New Window" + +var persistent_window_path = "res://user_interface/PersistentWindow.tscn" + +func _ready(): + connect("button_up", self, "_on_button_up") + +func _on_button_up(): + # see if our scene path exists. if so, load it and add it to a new panel in the main scene + # godot 4 has resizeable non-popup-style windows we could use here, but we're in 3.x, so we'll have to make our own instead + if ResourceLoader.exists(scene_path): + var new_scene = ResourceLoader.load(scene_path).instance() + var new_panel = ResourceLoader.load(persistent_window_path).instance() + new_panel.add_child(new_scene) + get_tree().current_scene.add_child(new_panel) + + else: + print("oh no") diff --git a/Phase2/Godot_Toolset/Main/user_interface/move_parent.gd b/Phase2/Godot_Toolset/Main/user_interface/move_parent.gd new file mode 100644 index 00000000..ce8f8b9b --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/move_parent.gd @@ -0,0 +1,27 @@ +extends Control + + +var mouse_in_move_area = false +var is_dragging = false + + +func _ready(): + connect("mouse_entered", self, "_mouse_entered_move_area") + connect("mouse_exited", self, "_mouse_exited_move_area") + +func _mouse_entered_move_area(): + mouse_in_move_area = true + +func _mouse_exited_move_area(): + mouse_in_move_area = false + +func _input(event): + if event is InputEventMouseButton: + if event.is_pressed(): + is_dragging = true + elif event.is_released(): + is_dragging = false + + if mouse_in_move_area && event is InputEventMouseMotion: + if is_dragging: + get_parent().rect_position += event.relative diff --git a/Phase2/Godot_Toolset/Main/user_interface/remove_parent_button.gd b/Phase2/Godot_Toolset/Main/user_interface/remove_parent_button.gd new file mode 100644 index 00000000..bec936bb --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/remove_parent_button.gd @@ -0,0 +1,4 @@ +extends Button + +func _on_close_window_button_up(): + get_parent().queue_free() diff --git a/Phase2/Godot_Toolset/Main/user_interface/resize_parent.gd b/Phase2/Godot_Toolset/Main/user_interface/resize_parent.gd new file mode 100644 index 00000000..44365ec7 --- /dev/null +++ b/Phase2/Godot_Toolset/Main/user_interface/resize_parent.gd @@ -0,0 +1,53 @@ +extends Control + + +# Declare member variables here. Examples: +# var a = 2 +# var b = "text" +var is_dragging = false +var mouse_in_resize_area = false + +export(bool) var resize_left = false +export(bool) var resize_right = false +export(bool) var resize_top = false +export(bool) var resize_bottom = false + +# Called when the node enters the scene tree for the first time. +func _ready(): + if resize_left || resize_right: + set_default_cursor_shape(Control.CURSOR_HSIZE) + if resize_top || resize_bottom: + set_default_cursor_shape(Control.CURSOR_VSIZE) + if (resize_left && resize_top) || (resize_right && resize_bottom): + set_default_cursor_shape(Control.CURSOR_FDIAGSIZE) + if (resize_left && resize_bottom) || (resize_right && resize_top): + set_default_cursor_shape(Control.CURSOR_BDIAGSIZE) + + connect("mouse_entered", self, "_mouse_entered_resize_area") + connect("mouse_exited", self, "_mouse_exited_resize_area") + + +func _mouse_entered_resize_area(): + mouse_in_resize_area = true + +func _mouse_exited_resize_area(): + mouse_in_resize_area = false + + +func _input(event): + if event is InputEventMouseButton: + if event.is_pressed(): + is_dragging = true + elif event.is_released(): + is_dragging = false + + if mouse_in_resize_area && event is InputEventMouseMotion: + if is_dragging: + if resize_left: + get_parent().margin_left += event.relative.x + if resize_right: + get_parent().margin_right += event.relative.x + if resize_top: + get_parent().margin_top += event.relative.y + if resize_bottom: + get_parent().margin_bottom += event.relative.y diff --git a/Phase2/MVP/Game/bcirpg_game_mvp_2024_0831A/project.godot b/Phase2/MVP/Game/bcirpg_game_mvp_2024_0831A/project.godot index 042e9f44..4a3e832a 100644 --- a/Phase2/MVP/Game/bcirpg_game_mvp_2024_0831A/project.godot +++ b/Phase2/MVP/Game/bcirpg_game_mvp_2024_0831A/project.godot @@ -120,17 +120,17 @@ GameCurrent="*res://globalScripts/gameCurrent.gd" open_file_hotkey={ "deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":79,"unicode":0,"echo":false,"script":null) +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":79,"unicode":0,"echo":false,"script":null) ] } save_character_file_hotkey={ "deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":83,"unicode":0,"echo":false,"script":null) +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":83,"unicode":0,"echo":false,"script":null) ] } back_to_main_menu_hotkey={ "deadzone": 0.5, -"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":false,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":77,"unicode":0,"echo":false,"script":null) +"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":true,"command":true,"pressed":false,"scancode":0,"physical_scancode":77,"unicode":0,"echo":false,"script":null) ] }