summaryrefslogtreecommitdiff
path: root/src/Game/Actor/AI/aiCookPotRoot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Game/Actor/AI/aiCookPotRoot.cpp')
-rw-r--r--src/Game/Actor/AI/aiCookPotRoot.cpp109
1 files changed, 109 insertions, 0 deletions
diff --git a/src/Game/Actor/AI/aiCookPotRoot.cpp b/src/Game/Actor/AI/aiCookPotRoot.cpp
new file mode 100644
index 00000000..da09eec4
--- /dev/null
+++ b/src/Game/Actor/AI/aiCookPotRoot.cpp
@@ -0,0 +1,109 @@
+#include "Game/Actor/AI/aiCookPotRoot.h"
+#include "Game/DLC/aocHardModeManager.h"
+#include "Game/UI/uiPauseMenuDataMgr.h"
+#include "KingSystem/ActorSystem/Attention/actAttention.h"
+#include "KingSystem/ActorSystem/actActor.h"
+#include "KingSystem/Utils/Thread/Message.h"
+#include "KingSystem/World/worldEnvMgr.h"
+#include "KingSystem/World/worldManager.h"
+
+namespace uking::ai {
+
+CookPotRoot::CookPotRoot(const InitArg& arg) : ksys::act::ai::Ai(arg) {}
+
+CookPotRoot::~CookPotRoot() = default;
+
+// NON_MATCHING
+bool CookPotRoot::init_(sead::Heap* heap) {
+ auto* ingredients =
+ new (heap, std::nothrow) sead::FixedSafeString<64>[CookingMgr::NumIngredientsMax];
+ mCookIngredients.setBuffer(CookingMgr::NumIngredientsMax, ingredients);
+ if (!mCookIngredients.isBufferReady()) {
+ return false;
+ }
+ if (*mInitBurnState_m) {
+ // TODO
+ }
+ mActor->getChemicalStuff();
+ mProcLink.reset();
+ return true;
+}
+
+void CookPotRoot::enter_(ksys::act::ai::InlineParamPack* params) {
+ ksys::act::ai::Ai::enter_(params);
+}
+
+void CookPotRoot::leave_() {
+ ksys::act::ai::Ai::leave_();
+}
+
+void CookPotRoot::loadParams_() {
+ getMapUnitParam(&mInitBurnState_m, "InitBurnState");
+ getAITreeVariable(&mCurrentCookResultHolder_a, "CurrentCookResultHolder");
+}
+
+// NON_MATCHING
+bool CookPotRoot::handleMessage_(const ksys::Message& message) {
+ if (message.getType().value == (u32)ksys::act::AttActionCode::Cook) {
+ // 着火: "ignition" or "on fire"
+ // This is checking if the pot is lit.
+ if (isCurrentChild("着火")) {
+ // TODO: sub_7100EDC4B8
+ // TODO: GameSceneSubsys12 class
+ // GameSceneSubsys12 handles carried items.
+ // This needs to check if the player is targeting the pot.
+ if (true /* TODO */) {
+ if (!_48 /* TODO */) {
+ _48 = true;
+
+ const int num_ingredients = 5; // TODO
+ auto* cooking_mgr = CookingMgr::instance();
+
+ cooking_mgr->resetArgCookData(mCookArg, mCookIngredients, num_ingredients,
+ mCookItem);
+
+ CookingMgr::BoostArg boost_arg{.always_boost = false,
+ .enable_random_boost = true};
+
+ if (ksys::world::Manager::instance()->getEnvMgr()->isInBloodMoonTimeRange()) {
+ boost_arg.always_boost = true;
+ }
+
+ if (cooking_mgr->cook(mCookArg, mCookItem, boost_arg)) {
+ if (const auto* hard_mode_manager = aoc::HardModeManager::instance()) {
+ if (hard_mode_manager->checkFlag(
+ aoc::HardModeManager::Flag::EnableHardMode)) {
+ if (hard_mode_manager->isHardModeChangeOn(
+ aoc::HardModeManager::HardModeChange::NerfHpRestore)) {
+ hard_mode_manager->nerfHpRestore(&mCookItem.life_recover);
+ }
+ }
+ }
+ if (true /* TODO: callCookingDemo */) {
+ ui::PauseMenuDataMgr::instance()->removeGrabbedItems();
+ cooking_mgr->setCookItem(mCookItem);
+ mHasFinishedCookItem = true;
+ return true;
+ }
+ _48 = false;
+ mHasFinishedCookItem = false;
+ // TODO
+ } else {
+ _48 = false;
+ mHasFinishedCookItem = false;
+ // TODO
+ }
+ }
+ }
+ }
+ }
+
+ if (message.getType().value != (u32)ksys::act::AttActionCode::KillTime) {
+ return false;
+ }
+
+ // TODO: callDemo007_1
+ return isCurrentChild("着火");
+}
+
+} // namespace uking::ai