Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Can I get help with if statement logic on checking components?

Asked by 4 years ago

I am in a situation where I am checking if a certain object contains certain components and does NOT contain other components.

To put it concretely, let's make ice cream.

There are 3 orders. Vanilla Sprinkles Gummies

"Sprinkles" and "Gummies" must have "Vanilla" as a component as well.

-- All their orders will be represented in strings
-- The problem I have is, how can I detect if the ice cream has vanilla and not the other ingredients? Also, how can I detect if the ice cream has vanilla and whatever was ordered as the topping? This is my if statement.

-- My main goal is to solve this problem on a scalable level, so if i add more ingredients I don't have to complicate my logic even further. I need help with constructing a sort of algorithm.

local ingredients = {"Vanilla", "Sprinkles", "Gummies"}
local iceCreamObj = obj -- doesn't matter. Just say it is a table
-- :Has() function is for simplicity.

local order = "Gummies"
function check()
    if iceCreamObj:Has(order) and iceCreamObj:Has("Vanilla") then
        return true
    end
    return false
end

check() -- true

-- See, this looks innocent, right? There is something missing here. What the ice cream has the order "Gummies" as well as "Sprinkles"? The if statement wouldn't detect that the sprinkles were there. How can I solve this? Should I make a table of ingredients excluding the vanilla and the ordered topping and loop through the ice cream's components to see if anything extra was added?

1 answer

Log in to vote
2
Answered by
Shawnyg 4330 Trusted Badge of Merit Snack Break Moderation Voter Community Moderator
4 years ago

This could be accomplished with a loop, if I'm understanding you right. Since you've got to have some sort of base component, Vanilla in this case, to be the ice cream (since gummies alone isn't ice cream), I would create a separate table for base ingredients, then a table for your toppings. I'm assuming you would have a physical aspect to this (whether it be decals on a sphere or whatever) to show their order in-hand. Let me know if you have any questions to my approach.

local ingredients = {"Vanilla", "Chocolate", "Strawberry"} -- flavors
local toppings = {"Sprinkles, Gummies"}

local function hasIngredient(obj)
    for _,v in pairs(ingredients) do
        if v == obj.ingredient then -- simplicity, edit of course
            return v -- or true. i return the ingredient name for future use
        end
    end
    return false -- doesnt have a base ingredient
end

local function isATopping(toppingName)
    for _,v in pairs(toppings) do
        if v == toppingName then
            return true
        end
    end
    return false
end

local function getToppings(obj)
    local tab = {}
    for _,objTopping in pairs(obj.toppings) do -- simplicity again. would use a :GetChildren() or whatever you need on the object
        if isATopping(objTopping) then
            table.insert(tab, objTopping)
        end
    end
    return tab
end

-- start your check here on an order            

if hasIngredient(iceCreamObj) then
    local tops = getToppings(obj) 
    if #topps > 0 then -- has toppings
        print'has toppings'
        for _,v in pairs(tops) do
            print('topping: '..v)
        end
    else
        print'no toppings :('
    end
else
    print'not a valid order!'
end

Ad

Answer this question