Combat State system

I made a combat controller with Knit framework, and I would like to know if I should change anything or improve anything.

Code is as follows:

local Knit: Knit = require(game:GetService("ReplicatedStorage").Knit)
local Signal = require(Knit.Util.Signal)

-- Constants:

-- Variables:
local Limits = {
        -- Active States
        Attacking = {"Stunned", "Downed", "Blocking"};
        Charging  = {"Stunned", "Downed", "Blocking"};
        Blocking  = {"Stunned", "Downed"};
    
        -- Override States
        Stunned   = {};
        Downed    = {};
    
        -- Passive States
        Sprinting = {"Crouching", "Attacking", "Charging", "Blocking"};
        Crouching = {"Sprinting", "Attacking", "Charging", "Blocking"}
}

-- Create Controller:
local Controller: Dictionary = Knit.CreateController {
    Name = "CombatController";
    State = {
        -- Active States
        Attacking = false;
        Charging  = false;
        Blocking  = false;
    
        -- Override States
        Stunned   = false;
        Downed    = false;
    
        -- Passive States
        Sprinting = false;
        Crouching = false;
    };
    Changed = Signal.new();
}
local State = Controller.State

-- Populate Controllers:
function Controller:ChangeState(Index: string, Status: boolean, Override: boolean)
    if not Override then
        for i,v in ipairs(Limits[Index]) do
            if State[v] == true then
                print(v)
                return false
            end
        end
    end
    Controller.Changed:Fire(Index, Status)
    State[Index] = Status
    return true
end

function Controller:Attack(Status: boolean, Override: boolean)
    return Controller:ChangeState("Attacking", Status, Override) and (State.Charging and Controller:ChangeState("Charging", false, true))
end

function Controller:Charge(Status: boolean, Override: boolean)
    return Controller:ChangeState("Charging", Status, Override)
end

function Controller:Block(Status: boolean, Override: boolean)
    return Controller:ChangeState("Blocking", Status, Override)
end

function Controller:Stunned(Status: boolean, Override: boolean)
    return Controller:ChangeState("Stunned", Status, Override)
end

function Controller:Downed(Status: boolean, Override: boolean)
    return Controller:ChangeState("Downed", Status, Override)
end

function Controller:Sprint(Status: boolean, Override: boolean)
    return Controller:ChangeState("Sprinting", Status, Override)
end

function Controller:Crouch(Status: boolean, Override: boolean)
    return Controller:ChangeState("Crouching", Status, Override)
end
2 Likes