diff --git a/soh/soh/Enhancements/randomizer/logic_expression.cpp b/soh/soh/Enhancements/randomizer/logic_expression.cpp index cacb4744d..58d512078 100644 --- a/soh/soh/Enhancements/randomizer/logic_expression.cpp +++ b/soh/soh/Enhancements/randomizer/logic_expression.cpp @@ -560,6 +560,7 @@ void LogicExpression::Impl::PopulateFunctionAdapters() { REGISTER_LOGIC_FUNCTION(GetGSCount), REGISTER_LOGIC_FUNCTION(HasBossSoul), REGISTER_LOGIC_FUNCTION(HasProjectile), + REGISTER_LOGIC_FUNCTION(CanOpenUnderwaterChest), }; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp index 17df0bf5d..40ac19feb 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp @@ -24,6 +24,7 @@ struct ExpressionTable { std::optional AdultDay; std::optional AdultNight; bool Expanded = false; + std::string ErrorMessage; }; ExpressionRow Root; @@ -106,47 +107,66 @@ static std::tuple CalculateCombines(const ExpressionTable::Exp } static void PopulateConnectionExpression(LogicTrackerNode::Connection& connection, std::string expressionStr) { - connection.ExpressionTable.Root = CreateExpressionRows(LogicExpression::Parse(expressionStr)); + std::shared_ptr expression; - if (connection.ChildDayAccess) { - logic->IsChild = true; - logic->AtDay = true; - - const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); - PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::ChildDay); - - logic->IsChild = false; - logic->AtDay = false; + try { + expression = LogicExpression::Parse(expressionStr); } - if (connection.ChildNightAccess) { - logic->IsChild = true; - logic->AtNight = true; - - const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); - PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::ChildNight); - - logic->IsChild = false; - logic->AtNight = false; + catch (const std::exception& e) { + connection.ExpressionTable.Root.ErrorMessage = std::string("Parse Error: ") + e.what(); + connection.ExpressionTable.Root.Children.clear(); + connection.ExpressionTable.CombineAll = true; + return; } - if (connection.AdultDayAccess) { - logic->IsAdult = true; - logic->AtDay = true; - const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); - PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::AdultDay); + try { + connection.ExpressionTable.Root = CreateExpressionRows(expression); - logic->IsAdult = false; - logic->AtDay = false; - } - if (connection.AdultNightAccess) { - logic->IsAdult = true; - logic->AtNight = true; + if (connection.ChildDayAccess) { + logic->IsChild = true; + logic->AtDay = true; - const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); - PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::AdultNight); + const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); + PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::ChildDay); - logic->IsAdult = false; - logic->AtNight = false; + logic->IsChild = false; + logic->AtDay = false; + } + if (connection.ChildNightAccess) { + logic->IsChild = true; + logic->AtNight = true; + + const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); + PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::ChildNight); + + logic->IsChild = false; + logic->AtNight = false; + } + if (connection.AdultDayAccess) { + logic->IsAdult = true; + logic->AtDay = true; + + const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); + PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::AdultDay); + + logic->IsAdult = false; + logic->AtDay = false; + } + if (connection.AdultNightAccess) { + logic->IsAdult = true; + logic->AtNight = true; + + const auto& eval = EvaluateExpression(connection.ExpressionTable.Root.Expression); + PopulateExpressionValues(connection.ExpressionTable.Root, eval, AgeTime::AdultNight); + + logic->IsAdult = false; + logic->AtNight = false; + } + } catch (const std::exception& e) { + connection.ExpressionTable.Root.ErrorMessage = std::string("Eval Error: ") + e.what(); + connection.ExpressionTable.Root.Children.clear(); + connection.ExpressionTable.CombineAll = true; + return; } auto [combineAll, combineChild, combineAdult] = CalculateCombines(connection.ExpressionTable.Root); @@ -293,7 +313,7 @@ static void DrawColoredWrappedText(const std::vector