| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860 |
- using UnityEngine;
- using UnityEngine.UIElements;
- /// <summary>
- /// Integration script that connects the new battle action system with existing character selection
- /// This allows switching between the old click-drag system and the new action wheel system
- /// </summary>
- public class BattleActionIntegration : MonoBehaviour
- {
- [Header("System References")]
- public PlayerDecisionController playerDecisionController;
- public BattleActionSystem battleActionSystem;
- public BattleActionWheel actionWheel; // Legacy Canvas-based wheel
- public EnemySelectionUI enemySelectionUI; // TODO: Add after compilation
- public BattleItemSelector itemSelectionUI;
- [Header("Settings")]
- [Tooltip("Enable new action wheel system (false = use old click-drag system)")]
- public bool useNewActionSystem = false; // Changed to false by default for simpler testing
- [Space]
- [Tooltip("Press this key to toggle between action systems")]
- public KeyCode toggleSystemKey = KeyCode.T;
- private Character lastSelectedCharacter;
- private MonoBehaviour simpleWheelComponent;
- private string currentInstruction = "";
- private float instructionTimer = 0f;
- private float instructionDuration = 5f;
- void Start()
- {
- Debug.Log("🚀 BattleActionIntegration starting...");
- // FORCE useNewActionSystem to false to preserve drag functionality
- useNewActionSystem = false;
- // Find components if not assigned
- if (playerDecisionController == null)
- playerDecisionController = FindFirstObjectByType<PlayerDecisionController>();
- if (battleActionSystem == null)
- battleActionSystem = FindFirstObjectByType<BattleActionSystem>();
- if (actionWheel == null)
- actionWheel = FindFirstObjectByType<BattleActionWheel>();
- if (enemySelectionUI == null)
- enemySelectionUI = FindFirstObjectByType<EnemySelectionUI>();
- if (itemSelectionUI == null)
- itemSelectionUI = FindFirstObjectByType<BattleItemSelector>();
- // Ensure PlayerDecisionController is always enabled for drag functionality
- if (playerDecisionController != null)
- {
- playerDecisionController.enabled = true;
- playerDecisionController.SetEnabled(true);
- Debug.Log("🎮 PlayerDecisionController enabled for drag functionality");
- }
- // Try to find or create a simple wheel component
- var existingWheels = FindObjectsByType<MonoBehaviour>(FindObjectsSortMode.None);
- foreach (var comp in existingWheels)
- {
- if (comp.GetType().Name == "SimpleActionWheel")
- {
- simpleWheelComponent = comp;
- Debug.Log("🎮 Found existing SimpleActionWheel");
- break;
- }
- }
- if (simpleWheelComponent == null)
- {
- // Create simple wheel if it doesn't exist
- GameObject wheelObj = new GameObject("SimpleActionWheel");
- // Use reflection to add the component
- var componentType = System.Type.GetType("SimpleActionWheel");
- if (componentType != null)
- {
- simpleWheelComponent = wheelObj.AddComponent(componentType) as MonoBehaviour;
- Debug.Log("🎮 Created SimpleActionWheel automatically");
- }
- else
- {
- Debug.LogError("❌ Could not find SimpleActionWheel type");
- }
- }
- // Subscribe to events
- if (battleActionSystem != null)
- {
- battleActionSystem.OnActionCompleted += OnCharacterActionCompleted;
- }
- // Connect SimpleActionWheel events using reflection
- if (simpleWheelComponent != null)
- {
- ConnectSimpleWheelEvents();
- }
- Debug.Log($"✅ BattleActionIntegration initialized - useNewActionSystem: {useNewActionSystem}");
- }
- void Update()
- {
- // Allow toggling between systems
- if (Input.GetKeyDown(toggleSystemKey))
- {
- ToggleActionSystem();
- }
- // Handle action wheel key from SimpleActionWheel
- // Get the key from SimpleActionWheel component if available
- KeyCode wheelKey = KeyCode.Q; // Default fallback
- if (simpleWheelComponent != null)
- {
- var toggleKeyField = simpleWheelComponent.GetType().GetField("toggleKey");
- if (toggleKeyField != null)
- {
- wheelKey = (KeyCode)toggleKeyField.GetValue(simpleWheelComponent);
- }
- }
- if (Input.GetKeyDown(wheelKey))
- {
- // Clear any existing instruction when opening wheel
- currentInstruction = "";
- instructionTimer = 0f;
- // When using old system, get the selected character from PlayerDecisionController
- Character characterForWheel = lastSelectedCharacter;
- if (!useNewActionSystem && playerDecisionController != null)
- {
- Character currentlySelected = playerDecisionController.GetSelectedCharacter();
- if (currentlySelected != null)
- {
- characterForWheel = currentlySelected;
- lastSelectedCharacter = currentlySelected; // Update for consistency
- }
- }
- if (characterForWheel != null)
- {
- // Allow reopening the action wheel even if an action is already selected
- // This enables canceling/changing the selected action
- Debug.Log($"⌨️ {wheelKey} pressed, showing wheel for {characterForWheel.CharacterName}");
- ShowActionWheelForCharacter(characterForWheel);
- }
- else
- {
- Debug.Log($"⌨️ {wheelKey} pressed but no character selected");
- }
- }
- if (useNewActionSystem)
- {
- HandleNewActionSystemInput();
- }
- else
- {
- // When using old system, track character selection for action wheel
- // Monitor PlayerDecisionController's targeting state to update lastSelectedCharacter
- if (playerDecisionController != null && playerDecisionController.IsInTargetingMode)
- {
- Character currentlySelected = playerDecisionController.GetSelectedCharacter();
- if (currentlySelected != null && currentlySelected != lastSelectedCharacter)
- {
- lastSelectedCharacter = currentlySelected;
- Debug.Log($"🖱️ Character selected for action wheel: {currentlySelected.CharacterName}");
-
- // Clear any old instructions and show current action status
- ShowCharacterActionStatus(currentlySelected);
- }
- }
- }
- // Note: When useNewActionSystem is false, the old PlayerDecisionController.Update()
- // will handle input automatically - no need to interfere
- // Update instruction timer
- if (instructionTimer > 0f)
- {
- instructionTimer -= Time.deltaTime;
- if (instructionTimer <= 0f)
- {
- currentInstruction = "";
- }
- }
- }
- /// <summary>
- /// Get the action wheel key from SimpleActionWheel component
- /// </summary>
- private KeyCode GetActionWheelKey()
- {
- if (simpleWheelComponent != null)
- {
- var toggleKeyField = simpleWheelComponent.GetType().GetField("toggleKey");
- if (toggleKeyField != null)
- {
- return (KeyCode)toggleKeyField.GetValue(simpleWheelComponent);
- }
- }
- return KeyCode.Q; // Default fallback
- }
- void OnGUI()
- {
- // Show instruction message if active
- if (!string.IsNullOrEmpty(currentInstruction))
- {
- GUIStyle instructionStyle = new GUIStyle(GUI.skin.label);
- instructionStyle.fontSize = 18;
- instructionStyle.fontStyle = FontStyle.Bold;
- instructionStyle.alignment = TextAnchor.MiddleCenter;
- instructionStyle.normal.textColor = Color.yellow;
- Rect instructionRect = new Rect(0, 50, Screen.width, 30);
- // Background
- GUI.color = new Color(0, 0, 0, 0.7f);
- GUI.Box(instructionRect, "");
- // Text
- GUI.color = Color.white;
- GUI.Label(instructionRect, currentInstruction, instructionStyle);
- }
- // Simple UI for testing - show regardless of system mode
- GUILayout.BeginArea(new Rect(10, 10, 300, 250));
- GUILayout.Label($"Battle Action System (Mode: {(useNewActionSystem ? "New" : "Old")})");
- GUILayout.Label($"Action Key: {GetActionWheelKey()}");
- GUILayout.Label($"Simple Wheel: {(simpleWheelComponent != null ? "✅" : "❌")}");
- if (lastSelectedCharacter != null)
- {
- GUILayout.Label($"Selected: {lastSelectedCharacter.CharacterName}");
- var actionData = lastSelectedCharacter.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null && actionData.hasValidAction)
- {
- GUILayout.Label($"Action: {actionData.GetActionDescription()}");
- GUILayout.Label($"Press {GetActionWheelKey()} again to change action", GUI.skin.box);
- }
- else
- {
- GUILayout.Label($"Press {GetActionWheelKey()} to choose action");
- }
- }
- else
- {
- GUILayout.Label("No character selected");
- GUILayout.Label("Click a player character to select");
- }
- GUILayout.Label($"Press {GetActionWheelKey()} to show action wheel");
- if (GUILayout.Button("Test Action Wheel"))
- {
- var testCharacter = FindFirstObjectByType<Character>();
- if (testCharacter != null)
- {
- ShowActionWheelForCharacter(testCharacter);
- }
- }
- if (GUILayout.Button("Reset PlayerDecisionController"))
- {
- if (playerDecisionController != null)
- {
- playerDecisionController.ResetState();
- }
- }
- GUILayout.EndArea();
- }
- private void HandleNewActionSystemInput()
- {
- // Don't interfere with mouse input if PlayerDecisionController is in targeting mode
- if (playerDecisionController != null && playerDecisionController.IsInTargetingMode)
- {
- // Let PlayerDecisionController handle the input for targeting
- return;
- }
- // Check for character selection
- if (Input.GetMouseButtonDown(0))
- {
- Character selectedCharacter = GetCharacterAtMousePosition();
- if (selectedCharacter != null)
- {
- Debug.Log($"🖱️ Clicked on character: {selectedCharacter.CharacterName} - Tag: {selectedCharacter.tag}");
- if (selectedCharacter.CompareTag("Player"))
- {
- Debug.Log($"✅ Confirmed player character: {selectedCharacter.CharacterName}");
- SelectCharacterForAction(selectedCharacter);
- }
- else
- {
- Debug.Log($"❌ Not a player character: {selectedCharacter.CharacterName} (Tag: {selectedCharacter.tag})");
- // Try to force selection anyway for testing
- Debug.Log($"🧪 Trying to select anyway for testing...");
- SelectCharacterForAction(selectedCharacter);
- }
- }
- else
- {
- Debug.Log("🖱️ Clicked but no character found");
- }
- }
- }
- private Character GetCharacterAtMousePosition()
- {
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit))
- {
- return hit.collider.GetComponent<Character>();
- }
- return null;
- }
- private void SelectCharacterForAction(Character character)
- {
- // Only clear visual state of previous selection if they don't have an action
- if (lastSelectedCharacter != null)
- {
- var prevActionData = lastSelectedCharacter.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (prevActionData == null || !prevActionData.hasValidAction)
- {
- // Only reset to NoAction if they don't have a valid action
- lastSelectedCharacter.SetVisualState(ActionDecisionState.NoAction);
- }
- else
- {
- // Preserve their action state
- lastSelectedCharacter.SetVisualState(ActionDecisionState.ActionSelected);
- }
- }
- lastSelectedCharacter = character;
- // Initialize enhanced action data if needed
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData == null)
- {
- // Create instance at runtime to avoid compilation issues
- actionData = new EnhancedCharacterActionData();
- character.SetEnhancedActionData(actionData);
- }
- // Highlight selected character (use a different state for "currently selected")
- character.SetVisualState(ActionDecisionState.NoAction);
- // Update all character visual states to maintain proper color coding
- UpdateAllCharacterVisualStates();
- Debug.Log($"🎯 Selected character for action: {character.CharacterName}");
- // Don't auto-show wheel - let user press Q manually
- // if (useNewActionSystem)
- // {
- // ShowActionWheelForCharacter(character);
- // }
- }
- /// <summary>
- /// Update visual states for all characters to properly show action status
- /// </summary>
- private void UpdateAllCharacterVisualStates()
- {
- Character[] allCharacters = FindObjectsByType<Character>(FindObjectsSortMode.None);
- foreach (Character character in allCharacters)
- {
- if (character.CompareTag("Player"))
- {
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (character == lastSelectedCharacter)
- {
- // Currently selected character - show selection highlight
- character.SetVisualState(ActionDecisionState.NoAction); // Pink for selection
- }
- else if (actionData != null && actionData.hasValidAction)
- {
- // Has valid action selected - show action confirmed state
- character.SetVisualState(ActionDecisionState.ActionSelected); // Green for confirmed action
- }
- else
- {
- // No action selected
- character.SetVisualState(ActionDecisionState.NoAction); // Pink for no action
- }
- }
- }
- }
- private void ShowActionWheelForCharacter(Character character)
- {
- Debug.Log($"🎯 ShowActionWheelForCharacter called for: {character.CharacterName}");
- // Clear any existing instruction when showing the wheel
- currentInstruction = "";
- instructionTimer = 0f;
- // Reset PlayerDecisionController state to ensure clean state
- if (playerDecisionController != null)
- {
- playerDecisionController.ResetState();
- }
- // Reset any existing action for this character to allow changing selection
- var existingActionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (existingActionData != null && existingActionData.hasValidAction)
- {
- Debug.Log($"🔄 Resetting existing action for {character.CharacterName}: {existingActionData.GetActionDescription()}");
- existingActionData.Reset();
- character.SetVisualState(ActionDecisionState.NoAction);
- }
- // Try simple wheel first
- if (simpleWheelComponent != null)
- {
- Debug.Log($"🎮 Found SimpleActionWheel component: {simpleWheelComponent.GetType().Name}");
- // Use reflection to call ShowWheelForCharacter
- var method = simpleWheelComponent.GetType().GetMethod("ShowWheelForCharacter");
- if (method != null)
- {
- Debug.Log("🔧 Calling ShowWheelForCharacter via reflection...");
- method.Invoke(simpleWheelComponent, new object[] { character });
- return;
- }
- else
- {
- Debug.LogError("❌ ShowWheelForCharacter method not found on SimpleActionWheel!");
- }
- }
- else
- {
- Debug.LogError("❌ simpleWheelComponent is null!");
- }
- // Fallback to battle action system
- if (battleActionSystem != null)
- {
- Debug.Log("🔄 Falling back to BattleActionSystem...");
- battleActionSystem.ShowActionWheel(character);
- }
- else
- {
- Debug.LogError("BattleActionIntegration: No action wheel system found!");
- }
- }
- private void ConnectSimpleWheelEvents()
- {
- if (simpleWheelComponent == null)
- {
- Debug.LogError("❌ simpleWheelComponent is null in ConnectSimpleWheelEvents");
- return;
- }
- Debug.Log($"🔧 Connecting events for SimpleActionWheel component: {simpleWheelComponent.GetType().Name}");
- // Use reflection to connect to OnActionSelected event
- var eventInfo = simpleWheelComponent.GetType().GetEvent("OnActionSelected");
- if (eventInfo != null)
- {
- Debug.Log($"✅ Found OnActionSelected event: {eventInfo.EventHandlerType}");
- // Create delegate that matches the event signature: Action<BattleActionType>
- var delegateType = eventInfo.EventHandlerType;
- var methodInfo = this.GetType().GetMethod("OnActionSelected", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
- if (methodInfo != null)
- {
- Debug.Log($"✅ Found OnActionSelected method: {methodInfo.Name}");
- var handler = System.Delegate.CreateDelegate(delegateType, this, methodInfo);
- eventInfo.AddEventHandler(simpleWheelComponent, handler);
- Debug.Log("✅ Successfully connected SimpleActionWheel.OnActionSelected event");
- }
- else
- {
- Debug.LogError("❌ Could not find OnActionSelected method in BattleActionIntegration");
- }
- }
- else
- {
- Debug.LogError("❌ Could not find OnActionSelected event in SimpleActionWheel");
- }
- }
- private void OnActionSelected(BattleActionType actionType)
- {
- Debug.Log($"🔥 OnActionSelected called with: {actionType}");
- if (lastSelectedCharacter == null)
- {
- Debug.LogWarning("❌ Action selected but no character selected!");
- return;
- }
- Debug.Log($"🎯 {lastSelectedCharacter.CharacterName} selected action: {actionType}");
- // Set action data for the character
- var actionData = lastSelectedCharacter.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData == null)
- {
- actionData = new EnhancedCharacterActionData();
- lastSelectedCharacter.SetEnhancedActionData(actionData);
- Debug.Log($"📝 Created new EnhancedCharacterActionData for {lastSelectedCharacter.CharacterName}");
- }
- // Configure action based on type and enable targeting mode
- switch (actionType)
- {
- case BattleActionType.Attack:
- actionData.actionType = actionType;
- Debug.Log("🗡️ Attack selected - Now drag from character to target enemy!");
- ShowInstructionMessage("ATTACK: Drag from character to enemy");
- StartTargetingMode(lastSelectedCharacter, actionType);
- break;
- case BattleActionType.Move:
- actionData.actionType = actionType;
- Debug.Log("👟 Move selected - Now drag from character to target position!");
- ShowInstructionMessage("MOVE: Drag from character to target position");
- StartTargetingMode(lastSelectedCharacter, actionType);
- break;
- case BattleActionType.UseItem:
- actionData.actionType = actionType;
- Debug.Log("🧪 Use Item selected - showing item selection UI");
- ShowInstructionMessage("USE ITEM: Select item from list");
- ShowItemSelection(lastSelectedCharacter);
- break;
- case BattleActionType.CastSpell:
- actionData.actionType = actionType;
- actionData.state = ActionDecisionState.ActionSelected;
- lastSelectedCharacter.SetVisualState(ActionDecisionState.ActionSelected);
- Debug.Log("✨ Cast Spell selected - implement spell selection UI");
- break;
- case BattleActionType.Defend:
- actionData.actionType = actionType;
- actionData.state = ActionDecisionState.ActionSelected;
- lastSelectedCharacter.SetVisualState(ActionDecisionState.ActionSelected);
- Debug.Log("🛡️ Defend action set - character will defend this turn");
- break;
- case BattleActionType.RunAway:
- actionData.actionType = actionType;
- actionData.state = ActionDecisionState.ActionSelected;
- lastSelectedCharacter.SetVisualState(ActionDecisionState.ActionSelected);
- Debug.Log("💨 Run Away action set - character will attempt to flee");
- break;
- }
- Debug.Log($"✅ Action {actionType} configured for {lastSelectedCharacter.CharacterName}");
- // Update all character visual states to show proper action status
- UpdateAllCharacterVisualStates();
- }
- private void StartTargetingMode(Character character, BattleActionType actionType)
- {
- Debug.Log($"🎯 Starting targeting mode for {character.CharacterName} with action {actionType}");
- // Enable the PlayerDecisionController to handle targeting
- if (playerDecisionController != null)
- {
- // Use the new public method to start targeting
- playerDecisionController.StartTargetingForCharacter(character, actionType);
- Debug.Log($"✅ PlayerDecisionController targeting started for {actionType}");
- }
- else
- {
- Debug.LogError("❌ PlayerDecisionController not found - cannot start targeting mode");
- }
- }
- private void ShowItemSelection(Character character)
- {
- Debug.Log($"🧪 Showing item selection for {character.CharacterName}");
- if (itemSelectionUI != null)
- {
- // Subscribe to item selection events
- itemSelectionUI.OnItemSelected -= OnItemSelected;
- itemSelectionUI.OnSelectionCancelled -= OnItemSelectionCancelled;
- itemSelectionUI.OnItemSelected += OnItemSelected;
- itemSelectionUI.OnSelectionCancelled += OnItemSelectionCancelled;
- itemSelectionUI.ShowItemSelection(character);
- }
- else
- {
- Debug.LogError("❌ BattleItemSelector not found!");
- // Fallback: Complete action immediately
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null)
- {
- actionData.state = ActionDecisionState.ActionSelected;
- character.SetVisualState(ActionDecisionState.ActionSelected);
- }
- }
- }
- private void OnItemSelected(string itemName, int itemIndex)
- {
- Debug.Log($"📦 Item selected: {itemName} (index: {itemIndex})");
- if (lastSelectedCharacter != null)
- {
- var actionData = lastSelectedCharacter.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null)
- {
- // Check if item requires targeting (healing potions, etc. might target allies)
- bool requiresTargeting = IsItemRequiringTargeting(itemName);
-
- // Properly set the item action using the SetItemAction method
- actionData.SetItemAction(itemName, itemIndex, requiresTargeting);
-
- if (!requiresTargeting)
- {
- lastSelectedCharacter.SetVisualState(ActionDecisionState.ActionSelected);
- Debug.Log($"✅ {lastSelectedCharacter.CharacterName} will use {itemName}");
-
- // Show the updated action status
- ShowCharacterActionStatus(lastSelectedCharacter);
- }
- else
- {
- Debug.Log($"🎯 {itemName} requires targeting - start targeting mode");
- ShowInstructionMessage($"TARGET: Select target for {itemName}");
- StartTargetingMode(lastSelectedCharacter, BattleActionType.UseItem);
- }
- }
- }
- }
- /// <summary>
- /// Check if an item requires targeting (healing items, targeted attacks, etc.)
- /// </summary>
- private bool IsItemRequiringTargeting(string itemName)
- {
- // Add logic here to determine if item needs targeting
- // For now, assume most items are self-use (like health potions)
- // Healing items that can target others would return true
-
- if (itemName.ToLower().Contains("heal") && itemName.ToLower().Contains("other"))
- return true;
- if (itemName.ToLower().Contains("revive"))
- return true;
- if (itemName.ToLower().Contains("bomb") || itemName.ToLower().Contains("throw"))
- return true;
-
- return false; // Most items are self-use
- }
- private void OnItemSelectionCancelled()
- {
- Debug.Log("❌ Item selection cancelled");
- if (lastSelectedCharacter != null)
- {
- var actionData = lastSelectedCharacter.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null)
- {
- actionData.Reset();
- lastSelectedCharacter.SetVisualState(ActionDecisionState.NoAction);
- }
- }
- }
- private void OnCharacterActionCompleted(Character character)
- {
- Debug.Log($"✅ Action completed for {character.CharacterName}");
- // Clear selection after action is complete
- if (character == lastSelectedCharacter)
- {
- lastSelectedCharacter = null;
- }
- }
- /// <summary>
- /// Manually trigger action selection for a character (for use by other systems)
- /// </summary>
- public void SelectCharacter(Character character)
- {
- SelectCharacterForAction(character);
- }
- /// <summary>
- /// Execute all selected actions (for turn-based systems)
- /// </summary>
- public void ExecuteAllPlayerActions()
- {
- Character[] playerCharacters = FindObjectsByType<Character>(FindObjectsSortMode.None);
- foreach (Character character in playerCharacters)
- {
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (character.CompareTag("Player") && actionData != null && actionData.hasValidAction)
- {
- if (battleActionSystem != null)
- {
- battleActionSystem.ExecuteCharacterAction(character);
- }
- }
- }
- }
- /// <summary>
- /// Switch between old and new action systems
- /// </summary>
- public void ToggleActionSystem()
- {
- useNewActionSystem = !useNewActionSystem;
- // Enable/disable appropriate systems
- if (playerDecisionController != null)
- {
- // Keep PlayerDecisionController enabled for targeting support
- // Just control its input handling behavior
- playerDecisionController.enabled = true;
- playerDecisionController.SetEnabled(true);
- }
- // Clear any instruction messages when switching
- currentInstruction = "";
- instructionTimer = 0f;
- Debug.Log($"🎯 Action system switched to: {(useNewActionSystem ? "New Action Wheel (Q to open wheel)" : "Old Click-Drag (direct drag to move/attack)")}");
- }
- /// <summary>
- /// Check if all players have selected actions
- /// </summary>
- public bool AllPlayersHaveActions()
- {
- Character[] playerCharacters = FindObjectsByType<Character>(FindObjectsSortMode.None);
- foreach (Character character in playerCharacters)
- {
- if (character.CompareTag("Player"))
- {
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData == null || !actionData.hasValidAction)
- {
- return false;
- }
- }
- }
- return true;
- }
- /// <summary>
- /// Reset all player actions (useful for new turns)
- /// </summary>
- public void ResetAllPlayerActions()
- {
- Character[] playerCharacters = FindObjectsByType<Character>(FindObjectsSortMode.None);
- foreach (Character character in playerCharacters)
- {
- if (character.CompareTag("Player"))
- {
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null)
- actionData.Reset();
- character.SetVisualState(ActionDecisionState.NoAction);
- }
- }
- lastSelectedCharacter = null;
- Debug.Log("🔄 All player actions reset");
- }
- /// <summary>
- /// Cancel action for a specific character (useful for undoing individual selections)
- /// </summary>
- public void CancelCharacterAction(Character character)
- {
- if (character == null) return;
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null && actionData.hasValidAction)
- {
- Debug.Log($"❌ Canceling action for {character.CharacterName}: {actionData.GetActionDescription()}");
- actionData.Reset();
- character.SetVisualState(ActionDecisionState.NoAction);
- ShowInstructionMessage($"Action canceled for {character.CharacterName}");
- }
- else
- {
- Debug.Log($"No action to cancel for {character.CharacterName}");
- }
- }
- private void ShowInstructionMessage(string message)
- {
- currentInstruction = message;
- instructionTimer = instructionDuration;
- Debug.Log($"📢 Instruction: {message}");
- }
- /// <summary>
- /// Show the current action status for a character or clear instructions if no action
- /// </summary>
- private void ShowCharacterActionStatus(Character character)
- {
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null && actionData.hasValidAction)
- {
- // Show current action
- ShowInstructionMessage($"Current action: {actionData.GetActionDescription()}");
- }
- else
- {
- // Clear instructions if no action set
- currentInstruction = "";
- instructionTimer = 0f;
- Debug.Log($"📢 No action set for {character.CharacterName} - instructions cleared");
- }
- }
- /// <summary>
- /// Called by PlayerDecisionController when targeting is complete
- /// </summary>
- public void OnTargetingComplete(Character character)
- {
- Debug.Log($"✅ Targeting complete for {character.CharacterName}");
- // Update lastSelectedCharacter so action wheel knows which character was last used
- lastSelectedCharacter = character;
- // Update all character visual states to reflect the completed action
- UpdateAllCharacterVisualStates();
- // Show instruction that action is set
- var actionData = character.GetEnhancedActionData<EnhancedCharacterActionData>();
- if (actionData != null && actionData.hasValidAction)
- {
- ShowInstructionMessage($"Action set: {actionData.GetActionDescription()}");
- }
- }
- }
|