@@ -29,6 +29,8 @@ void TwistsConfig::toggleCappyDisable() {
2929 sCappyForceEnabled = !sCappyForceEnabled ;
3030}
3131
32+ static bool weDisabledCappy = false ;
33+
3234void TwistsConfig::updateCappyProximity (PlayerActorHakoniwa* player, StageScene* stageScene) {
3335 if (!player || !stageScene) return ;
3436
@@ -37,45 +39,61 @@ void TwistsConfig::updateCappyProximity(PlayerActorHakoniwa* player, StageScene*
3739
3840 GameDataHolderWriter writer;
3941 writer.mData = stageScene->mHolder .mData ;
40-
41- if (sCappyForceEnabled ) {
42- // Forced toggle ON — force enable Cappy
43- writer.mData ->mGameDataFile ->mIsEnableCap = true ;
44- cappyDisabled = false ;
45- Logger::log (" Cappy forced enabled by toggle\n " );
46- return ;
47- }
48-
49- // Forced toggle OFF — fallback to normal proximity logic
42+
5043 GameDataHolderAccessor accessor (stageScene);
51- bool isCappyEnabled = GameDataFunction::isEnableCap (accessor);
44+ bool isCappyCurrentlyEnabled = GameDataFunction::isEnableCap (accessor);
45+
5246 ShineTowerRocket* odyssey = rs::tryGetShineTowerRocketFromDemoDirector ((al::LiveActor*)playerBase);
5347
54- if (!odyssey) {
55- if (isCappyEnabled) {
48+ if (!sCappyForceEnabled ) {
49+ // Toggle is OFF - use normal proximity logic
50+ if (!odyssey) {
51+ if (isCappyCurrentlyEnabled) {
52+ writer.mData ->mGameDataFile ->mIsEnableCap = false ;
53+ cappyDisabled = true ;
54+ weDisabledCappy = true ;
55+ Logger::log (" Cappy disabled - no Odyssey\n " );
56+ }
57+ return ;
58+ }
59+
60+ f32 distance = al::calcDistance ((al::LiveActor*)player, (al::LiveActor*)odyssey);
61+ bool shouldEnable = (distance <= cappyThreshold);
62+
63+ if (shouldEnable && !isCappyCurrentlyEnabled) {
64+ writer.mData ->mGameDataFile ->mIsEnableCap = true ;
65+ cappyDisabled = false ;
66+ weDisabledCappy = false ;
67+ Logger::log (" Cappy enabled - near Odyssey (%.1f)\n " , distance);
68+ } else if (!shouldEnable && isCappyCurrentlyEnabled) {
5669 writer.mData ->mGameDataFile ->mIsEnableCap = false ;
5770 cappyDisabled = true ;
58- Logger::log (" Cappy disabled - no Odyssey\n " );
71+ weDisabledCappy = true ;
72+ Logger::log (" Cappy disabled - far from Odyssey (%.1f)\n " , distance);
5973 }
6074 return ;
6175 }
6276
63- f32 distance = al::calcDistance ((al::LiveActor*)player, (al::LiveActor*)odyssey);
64- bool shouldEnable = (distance <= cappyThreshold);
65-
66- if (shouldEnable && !isCappyEnabled) {
67- writer.mData ->mGameDataFile ->mIsEnableCap = true ;
68- cappyDisabled = false ;
69- Logger::log (" Cappy enabled - near Odyssey (%.1f)\n " , distance);
70- } else if (!shouldEnable && isCappyEnabled) {
71- writer.mData ->mGameDataFile ->mIsEnableCap = false ;
72- cappyDisabled = true ;
73- Logger::log (" Cappy disabled - far from Odyssey (%.1f)\n " , distance);
77+ // Toggle is ON - force enable, but only if we're not in a naturally capless area
78+
79+ if (!isCappyCurrentlyEnabled) {
80+ // Cappy is disabled. Was it us who disabled it, or the game naturally?
81+ if (weDisabledCappy || cappyDisabled) {
82+ // We disabled it due to proximity, safe to re-enable
83+ writer.mData ->mGameDataFile ->mIsEnableCap = true ;
84+ cappyDisabled = false ;
85+ weDisabledCappy = false ;
86+ Logger::log (" Cappy forced enabled by toggle\n " );
87+ } else {
88+ // Game naturally disabled it (capless area), don't override
89+ Logger::log (" Cappy remains disabled - naturally disabled by game\n " );
90+ }
7491 }
92+ // If Cappy is already enabled, no need to do anything
7593}
7694
7795void TwistsConfig::handleStageInit () {
7896 cappyDisabled = false ; // Changed: Cappy starts enabled
7997 needsCappyDisable = false ; // Changed: We don't need to disable it
8098 Logger::log (" Stage init: Cappy will be enabled\n " ); // Updated log message
81- }
99+ }
0 commit comments