Add enemy creation and viewer functionality with filtering options

This commit is contained in:
MaddoScientisto 2026-02-26 21:58:48 +01:00
commit 18683c0680
32 changed files with 1009 additions and 411 deletions

View file

@ -25,6 +25,8 @@ func _enter_tree() -> void:
dock_instance.create_bullet_requested.connect(_on_create_bullet_requested)
if dock_instance.has_signal("create_item_requested"):
dock_instance.create_item_requested.connect(_on_create_item_requested)
if dock_instance.has_signal("create_enemy_requested"):
dock_instance.create_enemy_requested.connect(_on_create_enemy_requested)
# Add the dock to the editor (bottom dock area)
add_control_to_bottom_panel(dock_instance, "Weapon Creator")
@ -428,3 +430,85 @@ func _create_bullet_resource(path: String, bullet_data: Dictionary) -> bool:
return false
return true
func _on_create_enemy_requested(enemy_data: Dictionary) -> void:
var settings: Resource = null
if ResourceLoader.exists(SETTINGS_PATH):
settings = ResourceLoader.load(SETTINGS_PATH)
if not settings:
settings = WeaponCreatorSettings.new()
var enemy_name: String = enemy_data.get("enemy_name", "New Enemy")
var enemy_key: String = enemy_data.get("enemy_key", "NEW_ENEMY")
var is_3d: bool = enemy_data.get("is_3d", true)
var enemies_dir = settings.get("enemies_dir")
var dimension_suffix = "_3D" if is_3d else "_2D"
var enemy_resource_path: String = enemies_dir + enemy_key + dimension_suffix + ".tres"
dock_instance.call("add_log", "=== Starting Enemy Creation ===")
dock_instance.call("add_log", "Enemy Name: " + enemy_name)
dock_instance.call("add_log", "Enemy Key: " + enemy_key)
dock_instance.call("add_log", "Mode: " + ("3D" if is_3d else "2D"))
if _create_enemy_resource(enemy_resource_path, enemy_data):
dock_instance.call("add_log", "✓ Created EnemyResource at: " + enemy_resource_path, Color.GREEN)
else:
dock_instance.call("add_log", "✗ Failed to create EnemyResource", Color.RED)
dock_instance.call("set_creation_complete")
return
dock_instance.call("add_log", "=== Enemy Creation Complete ===", Color.CYAN)
dock_instance.call("add_log", "Next steps:")
dock_instance.call("add_log", "1. Add animation frames and sounds if needed")
dock_instance.call("add_log", "2. Configure loot drops")
dock_instance.call("add_log", "3. Test the enemy in-game")
dock_instance.call("set_creation_complete")
get_editor_interface().get_resource_filesystem().scan()
func _create_enemy_resource(path: String, enemy_data: Dictionary) -> bool:
if ResourceLoader.exists(path):
dock_instance.call("add_log", "Warning: EnemyResource already exists at " + path, Color.YELLOW)
return false
var enemy_script = load("res://Scripts/Resources/EnemyResource.cs")
if enemy_script == null:
dock_instance.call("add_log", "Error: Could not load EnemyResource.cs script", Color.RED)
return false
var enemy_resource = Resource.new()
enemy_resource.set_script(enemy_script)
enemy_resource.set("EnemyName", enemy_data.get("enemy_name", "New Enemy"))
enemy_resource.set("EnemyKey", enemy_data.get("enemy_key", "NEW_ENEMY"))
enemy_resource.set("PrefabPath", enemy_data.get("prefab_path", "res://Scenes/Actors/Generic_Enemy_FSM_3D.tscn"))
enemy_resource.set("MaxHealth", enemy_data.get("max_health", 6.0))
enemy_resource.set("MovementSpeed", enemy_data.get("movement_speed", 1.5))
enemy_resource.set("MotivationReward", enemy_data.get("motivation_reward", 4.0))
var weapon_resource = enemy_data.get("weapon_resource", null)
if weapon_resource:
enemy_resource.set("Weapon", weapon_resource)
enemy_resource.set("PlayerDetectionRange", enemy_data.get("player_detection_range", 12.0))
enemy_resource.set("ViewRange", enemy_data.get("view_range", 8.0))
enemy_resource.set("AlarmReactRange", enemy_data.get("alarm_react_range", 20.0))
enemy_resource.set("PlayerDisengageRange", enemy_data.get("player_disengage_range", 15.0))
enemy_resource.set("StrafeSpeed", enemy_data.get("strafe_speed", 0.0))
enemy_resource.set("MaxStrafeDistance", enemy_data.get("max_strafe_distance", 0.0))
enemy_resource.set("MinStrafeDistance", enemy_data.get("min_strafe_distance", 0.0))
enemy_resource.set("ResponseTime", enemy_data.get("response_time", 0.5))
enemy_resource.set("PredictPlayer", enemy_data.get("predict_player", false))
var icon_sprite = enemy_data.get("icon_sprite", null)
if icon_sprite:
enemy_resource.set("IconSprite", icon_sprite)
var err = ResourceSaver.save(enemy_resource, path)
if err != OK:
dock_instance.call("add_log", "Error saving EnemyResource: " + str(err), Color.RED)
return false
return true