From 20a10078979155881283fb27aa1aaee4c2e62535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Wed, 23 Dec 2020 15:51:52 +0100 Subject: uking: Implement RandomChoiceExceptOnFlag query --- .../AI/Query/queryRandomChoiceExceptOnFlag.cpp | 46 +++++++++++++++++++++- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'src/Game/AI/Query/queryRandomChoiceExceptOnFlag.cpp') diff --git a/src/Game/AI/Query/queryRandomChoiceExceptOnFlag.cpp b/src/Game/AI/Query/queryRandomChoiceExceptOnFlag.cpp index 923985be..0dbf20c9 100644 --- a/src/Game/AI/Query/queryRandomChoiceExceptOnFlag.cpp +++ b/src/Game/AI/Query/queryRandomChoiceExceptOnFlag.cpp @@ -1,5 +1,8 @@ #include "Game/AI/Query/queryRandomChoiceExceptOnFlag.h" #include +#include +#include +#include "KingSystem/GameData/gdtManager.h" namespace uking::query { @@ -8,9 +11,48 @@ RandomChoiceExceptOnFlag::RandomChoiceExceptOnFlag(const InitArg& arg) RandomChoiceExceptOnFlag::~RandomChoiceExceptOnFlag() = default; -// FIXME: implement +static bool isFlagForbidden(const sead::SafeString& flag) { + bool value = false; + if (flag.isEmpty()) + return true; + if (!ksys::gdt::Manager::instance()->getParamBypassPerm().get().getBool(&value, flag)) + return true; + return value; +} + +// TODO: stack issues for the booleans in isFlagForbidden int RandomChoiceExceptOnFlag::doQuery() { - return -1; + using Manager = ksys::gdt::Manager; + if (!Manager::instance()) + return 10; + + sead::BitFlag16 forbidden_values; +#define CHECK_FLAG_(BIT) forbidden_values.changeBit(BIT, isFlagForbidden(mCheckFlag##BIT)); + CHECK_FLAG_(0) + CHECK_FLAG_(1) + CHECK_FLAG_(2) + CHECK_FLAG_(3) + CHECK_FLAG_(4) + CHECK_FLAG_(5) + CHECK_FLAG_(6) + CHECK_FLAG_(7) + CHECK_FLAG_(8) + CHECK_FLAG_(9) +#undef CHECK_FLAG_ + + const auto num_allowed_values = 10 - forbidden_values.countOnBit(); + if (num_allowed_values == 0) + return 10; + + s32 count = sead::GlobalRandom::instance()->getU32(num_allowed_values) + 1; + for (s32 i = 0; i < 10; ++i) { + if (forbidden_values.isOffBit(i)) { + if (count < 2) + return i; + --count; + } + } + return 10; } void RandomChoiceExceptOnFlag::loadParams(const evfl::QueryArg& arg) { -- cgit v1.2.3