Skip to content

Npc: Implement SessionMusicianManager - #1130

Closed
guymakinggames wants to merge 1 commit into
MonsterDruide1:masterfrom
guymakinggames:SessionMusicianManager
Closed

Npc: Implement SessionMusicianManager#1130
guymakinggames wants to merge 1 commit into
MonsterDruide1:masterfrom
guymakinggames:SessionMusicianManager

Conversation

@guymakinggames

@guymakinggames guymakinggames commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

This change is Reviewable


Report for 1.0 (d6735da - 350ebe3)

📈 Matched code: 14.64% (+0.03%, +3160 bytes)

✅ 30 new matches
Unit Item Bytes Before After
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryCreateSessionMusicianManager(al::IUseSceneObjHolder const*) +232 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryAddJoinedSessionMusicianDemoActor(al::IUseSceneObjHolder const*) +220 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::exeWait() +216 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::initAfterPlacementSceneObj(al::ActorInitInfo const&) +200 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryStartWarpToSessionMayor(al::IUseSceneObjHolder const*, al::PlacementInfo*) +188 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::tryAppearPowerPlant() +184 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::SessionMusicianManager(char const*) +168 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryGetSessionMoonGetDemoPlayerPose(sead::Quat<float>*, al::IUseSceneObjHolder const*) +168 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::SessionMusicianManager(char const*) +164 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryGetSessionMoonGetDemoPlayerPos(sead::Vector3<float>*, al::IUseSceneObjHolder const*) +160 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::tryStartWarp(al::PlacementInfo*) +152 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::trySetJoinedSessionMusicianTransformForMoonGetDemo(al::IUseSceneObjHolder const*) +152 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::isSubscribed(SessionMusicianType) const +116 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::tryGetJoinedSessionMusicanActor(al::IUseSceneObjHolder const*) +112 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::isJoinedSessionMusician(al::IUseSceneObjHolder const*) +108 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::findPowerPlant() const +92 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::getJoinedMusician() const +88 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::addDemoAllMusicians(al::IUseSceneObjHolder const*) +88 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::isJoinedMusician() const +84 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::addDemoAllMusicians() +72 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::entrySessionMayorToManager(SessionMayorNpc*) +64 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::entryMusician(SessionMusicianNpc*) +44 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::getSessionMusicianManager(al::IUseSceneObjHolder const*) +36 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::exeComplete() +16 0.00% 100.00%
Npc/SessionMusicianManager non-virtual thunk to SessionMusicianManager::initAfterPlacementSceneObj(al::ActorInitInfo const&) +8 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianLocalFunction::isExistSessionMusicianManager(al::IUseSceneObjHolder const*) +8 0.00% 100.00%
Npc/SessionMusicianManager non-virtual thunk to SessionMusicianManager::~SessionMusicianManager() +8 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::~SessionMusicianManager() +4 0.00% 100.00%
Npc/SessionMusicianManager SessionMusicianManager::~SessionMusicianManager() +4 0.00% 100.00%
Npc/SessionMusicianManager non-virtual thunk to SessionMusicianManager::~SessionMusicianManager() +4 0.00% 100.00%

@github-actions github-actions Bot added the status:waiting for review This PR is ready to take the first or another look at it! label Apr 27, 2026
@guymakinggames
guymakinggames force-pushed the SessionMusicianManager branch from 451026b to fd5746b Compare April 27, 2026 17:48
@guymakinggames guymakinggames changed the title Npc: Implement SessionMusicianManager Npc: Implement SessionMusicianManager Apr 27, 2026

@german77 german77 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The AI didn't fair well in this one

@german77 made 30 comments.
Reviewable status: 0 of 8 files reviewed, 29 unresolved discussions (waiting on guymakinggames).


src/Npc/SessionMayorNpc.h line 16 at r1 (raw file):

class SessionMusicianNpc;

class SessionMayorNpc : public al::LiveActor {

Suggestion:

class SessionMayorNpc : public al::LiveActor, public  al::IEventFlowEventReceiver{

src/Npc/SessionMayorNpc.h line 38 at r1 (raw file):

    void exeDance();
    void exeDemo();
};

static_assert(sizeof(SessionMayorNpc ) == 0x170);


src/Npc/SessionMusicianManager.cpp line 62 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Cursed code

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        if (mMusicians[i]->isJoined())
            return true;
    }

src/Npc/SessionMusicianManager.cpp line 79 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        // Might need SessionMusicianNpc* npc=mMusicians[i] to match
        if (mMusicians[i]->isJoined())
            return mMusicians[i];
    }

src/Npc/SessionMusicianManager.cpp line 97 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        SessionMusicianNpc* musician=mMusicians[i];
        if (SessionMusicianLocalFunction::isMusicianType(musician, type) &&
            SessionMusicianLocalFunction::isAlreadySessionMember(musician))
            return true;
    }

src/Npc/SessionMusicianManager.cpp line 110 at r1 (raw file):

    if (GameDataFunction::getSessionEventProgress(accessor).value() <
        SessionEventProgress::WaitThePowerPlantWorks)
        return false;

Suggestion:

    if (GameDataFunction::getSessionEventProgress(this).value() <
        SessionEventProgress::WaitThePowerPlantWorks)
        return false;

src/Npc/SessionMusicianManager.cpp line 128 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        SessionMusicianNpc* musician=mMusicians[i];
        if (SessionMusicianLocalFunction::getMusicianType(*musician) == SessionMusicianType::Vocal)
            return musician;
    }

src/Npc/SessionMusicianManager.cpp line 151 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        SessionMusicianNpc* musician=mMusicians[i];
        SessionMusicianWarpAgent* warpAgent = musician->getWarpAgent();
        if (warpAgent->tryGetWarpTargetInfo(placementInfo) && warpAgent->tryStartWarp()){
            musician->doneWarp();
            al::invalidateClipping(mMayor);
            return true;
        }
    }

src/Npc/SessionMusicianManager.cpp line 166 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Suggestion:

    for(s32 i=0;i<mMusicians.size();i++){
        rs::addDemoActor(musician[i], true);
    }

src/Npc/SessionMusicianManager.cpp line 173 at r1 (raw file):

        mBgmController->updateNerve();

    if (!(SessionMusicianLocalFunction::getMemberMusicianNum(this) < 5))

invert this condition


src/Npc/SessionMusicianManager.cpp line 183 at r1 (raw file):

            powerPlant->appear();
    }
    return;

Suggestion:

    tryAppearPowerPlant();

src/Npc/SessionMusicianManager.cpp line 194 at r1 (raw file):

void tryCreateSessionMusicianManager(const al::IUseSceneObjHolder* holder) {
    if (al::isExistSceneObj(holder, SceneObjID_SessionMusicianManager))

Suggestion:

    if (isExistSessionMusicianManager(holder)

src/Npc/SessionMusicianManager.cpp line 210 at r1 (raw file):

bool tryStartWarpToSessionMayor(const al::IUseSceneObjHolder* holder,
                                al::PlacementInfo* placementInfo) {
    if (!al::isExistSceneObj(holder, SceneObjID_SessionMusicianManager))

Suggestion:

    if (isExistSessionMusicianManager(holder)

src/Npc/SessionMusicianManager.cpp line 214 at r1 (raw file):

    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(holder);
    return manager->tryStartWarp(placementInfo);

Suggestion:

    return getSessionMusicianManager(holder)->tryStartWarp(placementInfo);

src/Npc/SessionMusicianManager.cpp line 219 at r1 (raw file):

void entrySessionMayorToManager(SessionMayorNpc* mayor) {
    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(mayor);
    manager->setSessionMayor(mayor);

Suggestion:

    return getSessionMusicianManager(holder)->setSessionMayor(mayor);

src/Npc/SessionMusicianManager.cpp line 240 at r1 (raw file):

    }

    return false;

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    return manager->isJoinedMusician();

src/Npc/SessionMusicianManager.cpp line 262 at r1 (raw file):

    }

    return nullptr;

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    return manager->getJoinedMusician();

src/Npc/SessionMusicianManager.cpp line 283 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    if(!manager->isJoinedMusician())
        return false;

src/Npc/SessionMusicianManager.cpp line 285 at r1 (raw file):

    }

    SessionMusicianNpc* musician = *musicianPtr;

Suggestion:

SessionMusicianNpc* musician = manager->getMusicians();

src/Npc/SessionMusicianManager.cpp line 301 at r1 (raw file):

    } while (demoActorIndex < musician->getDemoActorNum());

    return result;

Suggestion:

    for(s32 i=0;i< musician->getDemoActorNum();i++) {
        rs::addDemoActor(musician->tryGetDemoActor(i), true);
    } 
    return true;

src/Npc/SessionMusicianManager.cpp line 321 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    if(!manager->isJoinedMusician())
        return false;

src/Npc/SessionMusicianManager.cpp line 327 at r1 (raw file):

        return false;

    new (out) sead::Vector3f(musician->getMoonGetDemoPlayerPos());

Suggestion:

    SessionMusicianNpc* musician = manager->getMusicians();
    if (musician == nullptr)
        return false;

    out->set(musician->getMoonGetDemoPlayerPos());

src/Npc/SessionMusicianManager.cpp line 348 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    if(!manager->isJoinedMusician())
        return false;

src/Npc/SessionMusicianManager.cpp line 354 at r1 (raw file):

        return false;

    new (out) sead::Quatf(musician->getMoonGetDemoPlayerPose());

Suggestion:

    SessionMusicianNpc* musician = manager->getMusicians();
    if (musician == nullptr)
        return false;

    out->set(musician->getMoonGetDemoPlayerPose());

src/Npc/SessionMusicianManager.cpp line 375 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Suggestion:

    SessionMusicianManager* manager = getSessionMusicianManager(holder);
    if (manager == nullptr)
        return false;
        
    if(!manager->isJoinedMusician())
        return false;

src/Npc/SessionMusicianManager.cpp line 383 at r1 (raw file):

    sead::Vector3f pos = musician->getMoonGetDemoPlayerPos();
    al::faceToTarget(musician, pos);
    return true;

Suggestion:

    SessionMusicianNpc* musician = manager->getMusicians();
    if (musician == nullptr)
        return false;
        
    al::faceToTarget(musician, musician->getMoonGetDemoPlayerPos());
    return true;

src/Npc/SessionMusicianManager.cpp line 388 at r1 (raw file):

void addDemoAllMusicians(const al::IUseSceneObjHolder* holder) {
    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(holder);
    manager->addDemoAllMusicians();

Suggestion:

    getSessionMusicianManager(holder)->addDemoAllMusicians();

src/Npc/SessionMusicianNpc.h line 19 at r1 (raw file):

class SessionMusicianWarpAgent;

class SessionMusicianNpc : public al::LiveActor {

Suggestion:

class SessionMusicianNpc : public al::LiveActor, public al::IEventFlowEventReceiver, public al::IEventFlowQueryJudge

src/Npc/SessionMusicianNpc.h line 57 at r1 (raw file):

            return nullptr;

        return mDemoActors.data()[index];

Suggestion:

        return mDemoActors[index];

@github-actions github-actions Bot added status:waiting for author Reviews have shown that the author of this PR needs to change some things. and removed status:waiting for review This PR is ready to take the first or another look at it! labels Apr 28, 2026
@guymakinggames
guymakinggames force-pushed the SessionMusicianManager branch from fd5746b to 350ebe3 Compare May 1, 2026 07:21

@guymakinggames guymakinggames left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's a tricky one to uncurse!

@guymakinggames made 30 comments.
Reviewable status: 0 of 8 files reviewed, 29 unresolved discussions (waiting on german77).


src/Npc/SessionMayorNpc.h line 38 at r1 (raw file):

Previously, german77 (Narr the Reg) wrote…

static_assert(sizeof(SessionMayorNpc ) == 0x170);

Done.


src/Npc/SessionMusicianManager.cpp line 62 at r1 (raw file):

Previously, german77 (Narr the Reg) wrote…

Cursed code

Did not match. Also tried with

Code snippet:

bool SessionMusicianManager::isJoinedMusician() const {
    for (s32 i = 0; i < mMusicians.size(); i++) {
        SessionMusicianNpc* npc = mMusicians[i];
        if (npc->isJoined())
            return true;
    }

    return false;
}

src/Npc/SessionMusicianManager.cpp line 173 at r1 (raw file):

Previously, german77 (Narr the Reg) wrote…

invert this condition

Mismatch when doing:

Code snippet:

if (SessionMusicianLocalFunction::getMemberMusicianNum(this) >= 5)

src/Npc/SessionMayorNpc.h line 16 at r1 (raw file):

class SessionMusicianNpc;

class SessionMayorNpc : public al::LiveActor {

Done.


src/Npc/SessionMusicianManager.cpp line 79 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Neither version matches


src/Npc/SessionMusicianManager.cpp line 97 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Also does not match


src/Npc/SessionMusicianManager.cpp line 110 at r1 (raw file):

    if (GameDataFunction::getSessionEventProgress(accessor).value() <
        SessionEventProgress::WaitThePowerPlantWorks)
        return false;

Done.


src/Npc/SessionMusicianManager.cpp line 128 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Does not match


src/Npc/SessionMusicianManager.cpp line 151 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Not a match


src/Npc/SessionMusicianManager.cpp line 166 at r1 (raw file):

        if (musician == &mMusicians.data()[mMusicians.size()])
            break;
    }

Mismatch


src/Npc/SessionMusicianManager.cpp line 183 at r1 (raw file):

            powerPlant->appear();
    }
    return;

Done.


src/Npc/SessionMusicianManager.cpp line 194 at r1 (raw file):

void tryCreateSessionMusicianManager(const al::IUseSceneObjHolder* holder) {
    if (al::isExistSceneObj(holder, SceneObjID_SessionMusicianManager))

Done.


src/Npc/SessionMusicianManager.cpp line 210 at r1 (raw file):

bool tryStartWarpToSessionMayor(const al::IUseSceneObjHolder* holder,
                                al::PlacementInfo* placementInfo) {
    if (!al::isExistSceneObj(holder, SceneObjID_SessionMusicianManager))

Done.


src/Npc/SessionMusicianManager.cpp line 214 at r1 (raw file):

    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(holder);
    return manager->tryStartWarp(placementInfo);

Done.


src/Npc/SessionMusicianManager.cpp line 219 at r1 (raw file):

void entrySessionMayorToManager(SessionMayorNpc* mayor) {
    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(mayor);
    manager->setSessionMayor(mayor);

Done.


src/Npc/SessionMusicianManager.cpp line 240 at r1 (raw file):

    }

    return false;

Done.


src/Npc/SessionMusicianManager.cpp line 262 at r1 (raw file):

    }

    return nullptr;

Done.


src/Npc/SessionMusicianManager.cpp line 283 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

See below


src/Npc/SessionMusicianManager.cpp line 285 at r1 (raw file):

    }

    SessionMusicianNpc* musician = *musicianPtr;

getMusicians returns PtrArray so the code after doesn't work unless I'm confusing myself here


src/Npc/SessionMusicianManager.cpp line 301 at r1 (raw file):

    } while (demoActorIndex < musician->getDemoActorNum());

    return result;

See above


src/Npc/SessionMusicianManager.cpp line 321 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Also clashing with the change below


src/Npc/SessionMusicianManager.cpp line 327 at r1 (raw file):

        return false;

    new (out) sead::Vector3f(musician->getMoonGetDemoPlayerPos());

Same issue


src/Npc/SessionMusicianManager.cpp line 348 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

See below


src/Npc/SessionMusicianManager.cpp line 354 at r1 (raw file):

        return false;

    new (out) sead::Quatf(musician->getMoonGetDemoPlayerPose());

For all of these, unless I'm reading this wrong, the original code was trying to find the first joined musician, but getMusicians will return all of them


src/Npc/SessionMusicianManager.cpp line 375 at r1 (raw file):

        if (musicianPtr == &musicians.data()[musicians.size()])
            return false;
    }

Same


src/Npc/SessionMusicianManager.cpp line 383 at r1 (raw file):

    sead::Vector3f pos = musician->getMoonGetDemoPlayerPos();
    al::faceToTarget(musician, pos);
    return true;

Same


src/Npc/SessionMusicianManager.cpp line 388 at r1 (raw file):

void addDemoAllMusicians(const al::IUseSceneObjHolder* holder) {
    SessionMusicianManager* manager = al::tryGetSceneObj<SessionMusicianManager>(holder);
    manager->addDemoAllMusicians();

Done.


src/Npc/SessionMusicianNpc.h line 19 at r1 (raw file):

class SessionMusicianWarpAgent;

class SessionMusicianNpc : public al::LiveActor {

Also causes a series of mismatches. What is doing on?


src/Npc/SessionMusicianNpc.h line 57 at r1 (raw file):

            return nullptr;

        return mDemoActors.data()[index];

Causes mismatches when used

@github-actions github-actions Bot added status:waiting for review This PR is ready to take the first or another look at it! and removed status:waiting for author Reviews have shown that the author of this PR needs to change some things. labels May 1, 2026
@german77

german77 commented May 1, 2026

Copy link
Copy Markdown
Contributor

src/Npc/SessionMusicianNpc.h line 19 at r1 (raw file):

Previously, guymakinggames wrote…

Also causes a series of mismatches. What is doing on?

For this one you got to see what's going on AI is usually useless on ctors. Most likely you need to change the members. See the 0x28 gap? those probably correspond to the event flow parents.

@german77

german77 commented May 1, 2026

Copy link
Copy Markdown
Contributor

Given the bast amount of mismatches from review I need to verify myself the issue.

@german77 german77 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@german77 made 1 comment and resolved 9 discussions.
Reviewable status: 0 of 8 files reviewed, 20 unresolved discussions (waiting on guymakinggames).


src/Npc/SessionMusicianManager.cpp line 62 at r1 (raw file):

Previously, guymakinggames wrote…

Did not match. Also tried with

This is an iterator on second look. Still not matching we need to see how to solve the loading issue

Code snippet:

    for(auto iter=mMusicians.begin(); iter!=mMusicians.end();++iter){
        if(iter->isJoined())
            return true;
    }

    return false;

@github-actions github-actions Bot added status:waiting for author Reviews have shown that the author of this PR needs to change some things. and removed status:waiting for review This PR is ready to take the first or another look at it! labels May 1, 2026
@german77

german77 commented May 1, 2026

Copy link
Copy Markdown
Contributor

Blocked by open-ead/sead#257

@MonsterDruide1 MonsterDruide1 added the ai This PR has been created with the help of AI tools and is handled with a lower priority. label May 8, 2026
@german77

Copy link
Copy Markdown
Contributor

Iterators have been fixed. Requires rebase and converting all loops to iterators

@GRAnimated

Copy link
Copy Markdown
Collaborator

Superseded by #1330

@GRAnimated GRAnimated closed this Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai This PR has been created with the help of AI tools and is handled with a lower priority. status:waiting for author Reviews have shown that the author of this PR needs to change some things.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants