Input Buffer System

 avatar
unknown
csharp
5 months ago
6.3 kB
6
Indexable
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class InputBuffer : MonoBehaviour
{
    public Text specialMoveText; // Display for special move execution
    public GameObject buttonPrefab; // Prefab for displaying buffer icons
    public Transform bufferDisplayParent; // Parent for buffer display UI

    // Define button sprites
    public Sprite upImage, downImage, leftImage, rightImage, lightImage, mediumImage, heavyImage, specialImage;

    // Input buffer settings
    private List<string> buffer = new List<string>();
    private float bufferStoreTime = 0.4f;
    private int maxBufferSize = 10;
    private float lastInputTime;

    // Dictionary to store virtual buttons mapped to Unity's Input system
    private Dictionary<string, string> inputButtons = new Dictionary<string, string>
    {
        {"up", "Vertical"},
        {"down", "Vertical"},
        {"left", "Horizontal"},
        {"right", "Horizontal"},
        {"light", "LightAttack"},
        {"medium", "MediumAttack"},
        {"heavy", "HeavyAttack"},
        {"special", "SpecialAttack"}
    };

    // Special moves
    private List<SpecialMove> specialMoves = new List<SpecialMove>
    {
        new SpecialMove("Flame Punch", new List<string>{"down", "right", "light"}),
        new SpecialMove("Tornado Kick", new List<string>{"down", "left", "light"}),
        new SpecialMove("Rising Uppercut", new List<string>{"right", "down", "right", "special"}),
        new SpecialMove("Surging Heat", new List<string>{"down", "down", "special"}),
        new SpecialMove("Inferno Overdrive", new List<string>{"down", "down", "left", "heavy", "special"}),
        new SpecialMove("Volcanic Vortex", new List<string>{"left", "down", "right", "left", "down", "right", "heavy", "special"}),
        new SpecialMove("Quick Rise", new List<string>{"up", "up"})
    };

    private Dictionary<string, bool> specialMoveExecuted;

    void Start()
    {
        lastInputTime = Time.time;
        specialMoveExecuted = new Dictionary<string, bool>();
        foreach (var move in specialMoves)
        {
            specialMoveExecuted[move.name] = false;
        }
    }

    void Update()
    {
        HandleInput();
        ClearBufferIfNeeded();
        UpdateBufferDisplay();
        UpdateSpecialMoveDisplay();
    }

    void HandleInput()
    {
        // Movement inputs
        float vertical = Input.GetAxisRaw("Vertical");
        float horizontal = Input.GetAxisRaw("Horizontal");

        // Check directional inputs based on axis values
        if (vertical > 0) AddInput("up");
        else if (vertical < 0) AddInput("down");

        if (horizontal > 0) AddInput("right");
        else if (horizontal < 0) AddInput("left");

        // Check for attack button presses
        if (Input.GetButtonDown("LightAttack")) AddInput("light");
        if (Input.GetButtonDown("MediumAttack")) AddInput("medium");
        if (Input.GetButtonDown("HeavyAttack")) AddInput("heavy");
        if (Input.GetButtonDown("SpecialAttack")) AddInput("special");

        // Check for special moves in buffer
        foreach (var move in specialMoves)
        {
            if (IsSequenceMatch(buffer, move.sequence))
            {
                specialMoveExecuted[move.name] = true;
            }
        }

        // Update last input time
        lastInputTime = Time.time;
    }

    void AddInput(string input)
    {
        buffer.Add(input);

        if (buffer.Count > maxBufferSize)
        {
            buffer.RemoveAt(0); // Keep buffer size within max limit
        }
    }

    void ClearBufferIfNeeded()
    {
        if (Time.time - lastInputTime >= bufferStoreTime)
        {
            buffer.Clear();
            foreach (var move in specialMoves)
            {
                specialMoveExecuted[move.name] = false;
            }
        }
    }

    void UpdateBufferDisplay()
    {
        // Clear existing buttons
        foreach (Transform child in bufferDisplayParent)
        {
            Destroy(child.gameObject);
        }

        // Display buffer images in sequence
        float xPosition = 20f;
        foreach (var button in buffer)
        {
            GameObject buttonImage = Instantiate(buttonPrefab, bufferDisplayParent);
            buttonImage.transform.localPosition = new Vector3(xPosition, 0, 0);

            // Set the correct sprite based on button
            SpriteRenderer spriteRenderer = buttonImage.GetComponent<SpriteRenderer>();
            spriteRenderer.sprite = GetButtonSprite(button);

            xPosition += spriteRenderer.bounds.size.x + 10f;
        }
    }

    Sprite GetButtonSprite(string button)
    {
        switch (button)
        {
            case "up": return upImage;
            case "down": return downImage;
            case "left": return leftImage;
            case "right": return rightImage;
            case "light": return lightImage;
            case "medium": return mediumImage;
            case "heavy": return heavyImage;
            case "special": return specialImage;
            default: return null;
        }
    }

    void UpdateSpecialMoveDisplay()
    {
        string displayText = "";
        foreach (var move in specialMoves)
        {
            if (specialMoveExecuted[move.name])
            {
                displayText += move.name + " Executed!\n";
            }
        }
        specialMoveText.text = displayText;
    }

    bool IsSequenceMatch(List<string> buffer, List<string> sequence)
    {
        if (buffer.Count < sequence.Count) return false;
        for (int i = 0; i < sequence.Count; i++)
        {
            if (buffer[buffer.Count - sequence.Count + i] != sequence[i])
            {
                return false;
            }
        }
        return true;
    }
}

// Helper class for defining special moves
[System.Serializable]
public class SpecialMove
{
    public string name;
    public List<string> sequence;

    public SpecialMove(string name, List<string> sequence)
    {
        this.name = name;
        this.sequence = sequence;
    }
}
Editor is loading...
Leave a Comment