Add sprite selection and weapon viewer to weapon creation plugin

This commit is contained in:
MaddoScientisto 2026-02-08 14:58:58 +01:00
commit 04cb3da0cd
8 changed files with 327 additions and 10 deletions

View file

@ -12,6 +12,14 @@ var item_key_field: LineEdit
var ammo_key_field: LineEdit
var short_name_field: LineEdit
var description_field: TextEdit
# Sprite selection fields
var sprite_resource: Texture2D
var sprite_picker: EditorResourcePicker
var sprite_preview: TextureRect
var editor_interface: EditorInterface
# Bullet selection fields
var bullet_dropdown: OptionButton
var bullet_path_field: LineEdit
@ -32,13 +40,21 @@ var random_spread_field: SpinBox
var create_button: Button
var cancel_button: Button
func setup(editor_iface: EditorInterface) -> void:
editor_interface = editor_iface
# If sprite picker already exists, ensure it has editor context
if sprite_picker:
_setup_sprite_picker()
func _ready() -> void:
# Window configuration
title = "Create New Weapon"
size = Vector2i(600, 700)
size = Vector2i(750, 950)
transient = true
exclusive = true
popup_window = true
# Connect close request (X button) to cancel action
close_requested.connect(_on_cancel_pressed)
# Center on screen
position = (DisplayServer.screen_get_size() - size) / 2
@ -133,6 +149,16 @@ func _build_basic_info_section(parent: Control) -> void:
section.add_child(HSeparator.new())
# Sprite Selection
var sprite_header = Label.new()
sprite_header.text = "Item Sprite"
sprite_header.add_theme_font_size_override("font_size", 14)
section.add_child(sprite_header)
_build_sprite_selector(section)
section.add_child(HSeparator.new())
# Bullet Selection
var bullet_header = Label.new()
bullet_header.text = "Bullet Configuration"
@ -161,6 +187,70 @@ func _build_basic_info_section(parent: Control) -> void:
bullet_path_field.editable = false
bullet_path_field.text = "res://Resources/Bullets/simple_ice_bullet.tres"
func _build_sprite_selector(parent: Control) -> void:
# Container for sprite selector with preview
var sprite_container = HBoxContainer.new()
sprite_container.add_theme_constant_override("separation", 8)
parent.add_child(sprite_container)
# Left side: Label and resource picker
var left_vbox = VBoxContainer.new()
left_vbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL
left_vbox.add_theme_constant_override("separation", 4)
sprite_container.add_child(left_vbox)
# Resource picker
var picker_hbox = HBoxContainer.new()
picker_hbox.add_theme_constant_override("separation", 4)
left_vbox.add_child(picker_hbox)
var picker_label = Label.new()
picker_label.text = "Sprite:"
picker_label.custom_minimum_size = Vector2(120, 0)
picker_hbox.add_child(picker_label)
sprite_picker = EditorResourcePicker.new()
sprite_picker.base_type = "Texture2D"
sprite_picker.editable = true
sprite_picker.size_flags_horizontal = Control.SIZE_EXPAND_FILL
sprite_picker.resource_changed.connect(_on_sprite_resource_changed)
picker_hbox.add_child(sprite_picker)
# Setup editor integration if interface is available
if editor_interface:
_setup_sprite_picker()
# Right side: Preview
var preview_container = PanelContainer.new()
preview_container.custom_minimum_size = Vector2(64, 64)
sprite_container.add_child(preview_container)
sprite_preview = TextureRect.new()
sprite_preview.custom_minimum_size = Vector2(64, 64)
sprite_preview.expand_mode = TextureRect.EXPAND_FIT_WIDTH_PROPORTIONAL
sprite_preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
preview_container.add_child(sprite_preview)
func _on_sprite_resource_changed(resource: Resource) -> void:
# Update sprite resource and preview when changed via EditorResourcePicker
if resource is Texture2D:
sprite_resource = resource
sprite_preview.texture = resource
print("Sprite resource changed: ", resource.resource_path if resource.resource_path else "[Unsaved Resource]")
elif resource == null:
sprite_resource = null
sprite_preview.texture = null
print("Sprite resource cleared")
else:
push_warning("Selected resource is not a Texture2D")
func _setup_sprite_picker() -> void:
# Ensure sprite picker is properly integrated with editor
if sprite_picker and editor_interface:
# EditorResourcePicker automatically integrates with editor when in editor context
# Just ensure toggle_mode is set correctly
sprite_picker.toggle_mode = false
func _build_stats_section(parent: Control) -> void:
var section = VBoxContainer.new()
section.add_theme_constant_override("separation", 4)
@ -299,6 +389,7 @@ func _on_bullet_selected(index: int) -> void:
var selected_path = bullet_dropdown.get_item_metadata(index)
bullet_path_field.text = selected_path
func _on_weapon_name_changed(new_name: String) -> void:
# Auto-generate item key from weapon name
var generated_key = new_name.to_upper().replace(" ", "_")
@ -317,6 +408,7 @@ func _on_create_pressed() -> void:
"ammo_key": ammo_key_field.text,
"weapon_short_name": short_name_field.text,
"weapon_description": description_field.text,
"sprite_resource": sprite_resource,
"default_bullet_path": bullet_path_field.text,
"priority": int(priority_field.value),
"ammo_per_shot": int(ammo_per_shot_field.value),