Amiibo: Implement HelpAmiiboYoshi (#215)

This commit is contained in:
Narr the Reg 2025-01-02 14:30:11 -06:00 committed by GitHub
parent 769899d634
commit 8f3de4c9d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 167 additions and 9 deletions

View file

@ -167,12 +167,12 @@ Address,Quality,Size,Name
0x0000007100004804,U,000008,_ZN26HelpAmiiboPlayerInvincible11isEnableUseEv
0x000000710000480c,U,000080,_ZN26HelpAmiiboPlayerInvincible7executeEv
0x000000710000485c,U,000008,_ZNK26HelpAmiiboPlayerInvincible7getTypeEv
0x0000007100004864,U,000060,_ZN15HelpAmiiboYoshiC2EP18HelpAmiiboDirectorPN2al9LiveActorE
0x00000071000048a0,U,000096,_ZN15HelpAmiiboYoshi18initAfterPlacementERKN2al13ActorInitInfoE
0x0000007100004900,U,000008,_ZNK15HelpAmiiboYoshi14isTriggerTouchERKN2al7NfpInfoE
0x0000007100004908,U,000112,_ZN15HelpAmiiboYoshi8activateEv
0x0000007100004978,U,000032,_ZN15HelpAmiiboYoshi7executeEv
0x0000007100004998,U,000008,_ZNK15HelpAmiiboYoshi7getTypeEv
0x0000007100004864,O,000060,_ZN15HelpAmiiboYoshiC2EP18HelpAmiiboDirectorPN2al9LiveActorE
0x00000071000048a0,O,000096,_ZN15HelpAmiiboYoshi18initAfterPlacementERKN2al13ActorInitInfoE
0x0000007100004900,O,000008,_ZNK15HelpAmiiboYoshi14isTriggerTouchERKN2al7NfpInfoE
0x0000007100004908,O,000112,_ZN15HelpAmiiboYoshi8activateEv
0x0000007100004978,O,000032,_ZN15HelpAmiiboYoshi7executeEv
0x0000007100004998,O,000008,_ZNK15HelpAmiiboYoshi7getTypeEv
0x00000071000049a0,O,000120,_ZN15ItemAmiiboKoopaC2EPKc
0x0000007100004a18,O,000132,_ZN15ItemAmiiboKoopaC1EPKc
0x0000007100004a9c,O,000112,_ZN15ItemAmiiboKoopa4initERKN2al13ActorInitInfoE

Can't render this file because it is too large.

View file

@ -0,0 +1,8 @@
#pragma once
namespace al {
class NfpInfo;
bool isCharacterIdBaseYoshi(const NfpInfo& nfpInfo);
} // namespace al

View file

@ -8,25 +8,40 @@ namespace al {
class NfpInfo;
class LiveActor;
class ActorInitInfo;
} // namespace al
} // namespace al
class HelpAmiiboDirector;
enum class HelpAmiiboType : s32 {
PlayerInvincible = 0,
FallCoin = 1,
LifeMaxUpItem = 1,
CoinCollect = 2,
InvincibleAttack = 2,
NavigateCoinCollect = 2,
Yoshi = 3,
CountUpCoin = 4,
};
class HelpAmiiboExecutor : public al::IUseHioNode {
public:
HelpAmiiboExecutor(HelpAmiiboDirector*, al::LiveActor*, const char*);
virtual void initAfterPlacement(const al::ActorInitInfo&);
virtual bool isTriggerTouch(const al::NfpInfo&) = 0;
virtual bool isTriggerTouch(const al::NfpInfo&) const = 0;
virtual bool isEnableUse() = 0;
virtual bool execute() = 0;
virtual void activate();
virtual void deactivate();
virtual s32 getType() = 0;
virtual HelpAmiiboType getType() const = 0;
bool tryTouch(const al::NfpInfo&);
void tryExecute();
al::LiveActor* getActor() const {
return mHelpAmiiboActor;
}
private:
HelpAmiiboDirector* mHelpAmiiboDirector = nullptr;
bool mIsActivated = false;

View file

@ -0,0 +1,42 @@
#include "Amiibo/HelpAmiiboYoshi.h"
#include <math/seadVector.h>
#include "Library/LiveActor/ActorDrawFunction.h"
#include "Library/LiveActor/ActorInitInfo.h"
#include "Library/LiveActor/ActorMovementFunction.h"
#include "Library/Nfp/NfpFunction.h"
#include "Player/Yoshi.h"
#include "Util/PlayerUtil.h"
HelpAmiiboYoshi::HelpAmiiboYoshi(HelpAmiiboDirector* director, al::LiveActor* amiiboActor)
: HelpAmiiboExecutor(director, amiiboActor, "ヨッシーお助け") {}
void HelpAmiiboYoshi::initAfterPlacement(const al::ActorInitInfo& actorInitInfo) {
HelpAmiiboExecutor::initAfterPlacement(actorInitInfo);
mYoshi = new Yoshi("amiiboヨッシー");
al::initCreateActorNoPlacementInfo(mYoshi, actorInitInfo);
mYoshi->makeActorDead();
}
bool HelpAmiiboYoshi::isTriggerTouch(const al::NfpInfo& nfpInfo) const {
return al::isCharacterIdBaseYoshi(nfpInfo);
}
bool HelpAmiiboYoshi::execute() {
return !al::isAlive(mYoshi);
}
void HelpAmiiboYoshi::activate() {
HelpAmiiboExecutor::activate();
const sead::Vector3f& playerPos = rs::getPlayerPos(getActor());
al::resetPosition(mYoshi, playerPos + sead::Vector3f(0, 1000.0f, 0));
mYoshi->appearEgg();
}
HelpAmiiboType HelpAmiiboYoshi::getType() const {
return HelpAmiiboType::Yoshi;
}

View file

@ -0,0 +1,26 @@
#pragma once
#include "Amiibo/HelpAmiiboExecutor.h"
namespace al {
class NfpInfo;
class LiveActor;
class ActorInitInfo;
} // namespace al
class HelpAmiiboDirector;
class Yoshi;
class HelpAmiiboYoshi : public HelpAmiiboExecutor {
public:
HelpAmiiboYoshi(HelpAmiiboDirector* director, al::LiveActor* amiiboActor);
void initAfterPlacement(const al::ActorInitInfo& actorInitInfo) override;
bool isTriggerTouch(const al::NfpInfo& nfpInfo) const override;
bool execute() override;
void activate() override;
HelpAmiiboType getType() const override;
private:
Yoshi* mYoshi = nullptr;
};

67
src/Player/Yoshi.h Normal file
View file

@ -0,0 +1,67 @@
#pragma once
#include <math/seadMatrix.h>
#include "Library/LiveActor/LiveActor.h"
namespace al {
class HitSensor;
class SensorMsg;
class WaterSurfaceFinder;
} // namespace al
class CapTargetInfo;
class PlayerAnimator;
class PlayerColliderYoshi;
class PlayerConst;
class PlayerEffect;
class PlayerJumpMessageRequest;
class PlayerModelHolder;
class PlayerModelChangerYoshi;
class PlayerPushReceiver;
class PlayerTrigger;
class YoshiJointControlKeeper;
class YoshiStateEgg;
class YoshiStateHack;
class YoshiStateNpc;
class Yoshi : public al::LiveActor {
public:
Yoshi(const char* actorName);
void init(const al::ActorInitInfo& info) override;
void initAfterPlacement() override;
void movement() override;
void attackSensor(al::HitSensor*, al::HitSensor*) override;
bool receiveMsg(const al::SensorMsg*, al::HitSensor*, al::HitSensor*) override;
void control() override;
void updateCollider() override;
void updateCollisionShape();
void sendCollisionMsg();
void appearEgg();
void startFruitShineGetDemo();
void exeEgg();
void exeNpc();
void exeHack();
private:
PlayerConst* mPlayerConst = nullptr;
PlayerModelHolder* mModelHolder = nullptr;
PlayerModelChangerYoshi* mModelChanger = nullptr;
PlayerAnimator* mAnimator = nullptr;
PlayerColliderYoshi* mCollider = nullptr;
PlayerEffect* mEffect = nullptr;
PlayerTrigger* mTrigger = nullptr;
PlayerJumpMessageRequest* mJumpMessageRequest = nullptr;
PlayerPushReceiver* mPushReceiver = nullptr;
al::WaterSurfaceFinder* mWaterSurfaceFinder = nullptr;
YoshiJointControlKeeper* mJointControlKeeper = nullptr;
CapTargetInfo* mCapTargetInfo = nullptr;
YoshiStateEgg* mStateEgg = nullptr;
YoshiStateNpc* mStateNpc = nullptr;
YoshiStateHack* mStateHack = nullptr;
al::HitSensor* mHitSensor = nullptr;
sead::Matrix34f mLocalMtx = sead::Matrix34f::ident;
};