1#pragma once
2
3#include <math/seadQuat.h>
4#include <math/seadVector.h>
5#include <prim/seadEnum.h>
6
7namespace al {
8struct ActorInitInfo;
9class LiveActor;
10class HitSensor;
11class SensorMsg;
12} // namespace al
13class Shine;
14
15namespace rs {
16// TODO: Replace this with SEAD_ENUM_EX when its ValueArray constructor matches
17SEAD_ENUM(ItemType, None = -1, Coin, Coin2D, CoinBlow, CoinBlowVeryLittle, CoinPopUp,
18CoinPopUpWithoutHitReaction, Coin3, Coin5, Coin10, Coin10Auto, Coin5Count, Coin100, LifeUpItem,
19LifeUpItemBack, LifeUpItem2D, LifeMaxUpItem, LifeMaxUpItem2D, Shine, AirBubble, DotMarioCat,
20KuriboMini3, KuriboMini8, CoinStackBound, Random);
21
22ItemType::ValueType getItemType(const al::ActorInitInfo& info);
23ItemType::ValueType getItemType(const char* name);
24bool isItemTypeKuriboMini(s32* out, s32 type);
25
26void initItemByPlacementInfo(al::LiveActor* actor, const al::ActorInitInfo& info,
27 bool isAppearAbove);
28bool tryInitItemByPlacementInfo(al::LiveActor* actor, const al::ActorInitInfo& info,
29 bool isAppearAbove);
30void initItem2DByPlacementInfo(al::LiveActor* actor, const al::ActorInitInfo& info);
31bool tryInitItem2DByPlacementInfo(al::LiveActor* actor, const al::ActorInitInfo& info);
32bool tryInitItem(al::LiveActor* actor, s32 itemType, const al::ActorInitInfo& info,
33 bool isAppearAbove);
34
35Shine* tryInitShineByPlacementInfoWithItemMenu(const al::ActorInitInfo& info);
36Shine* initShineByPlacementInfo(const al::ActorInitInfo& info);
37Shine* tryInitLinkShine(const al::ActorInitInfo& info, const char* name, s32 linkIndex);
38Shine* tryInitLinkShineHintPhoto(const al::ActorInitInfo& info, const char* name, s32 linkIndex);
39Shine* initLinkShine(const al::ActorInitInfo& info, const char* name, s32 linkIndex);
40Shine* initLinkShopShine(const al::ActorInitInfo& info, const char* name);
41Shine* initLinkShineChipShine(const al::ActorInitInfo& info);
42Shine* initLinkBossShine(const al::ActorInitInfo& info);
43
44void createShineEffectInsideObject(Shine* shine, const al::LiveActor* actor,
45 const al::ActorInitInfo& info);
46
47void appearPopupShine(Shine* shine);
48void appearPopupShine(Shine* shine, const al::LiveActor* actor);
49void appearPopupShine(Shine* shine, const sead::Vector3f& trans);
50void appearPopupShineWithoutDemo(Shine* shine);
51void appearPopupShineWithoutDemo(Shine* shine, const al::LiveActor* actor);
52void appearPopupShineWithoutDemo(Shine* shine, const sead::Vector3f& trans);
53void appearPopupShineWithoutWarp(Shine* shine);
54void appearPopupShineGrandByBoss(Shine* shine, s32 a2);
55void appearWaitShine(Shine* shine);
56void appearWaitShine(Shine* shine, const sead::Vector3f& trans);
57
58bool isEndAppearShine(const Shine* shine);
59bool isGotShine(const Shine* shine);
60bool isAliveShine(const Shine* shine);
61bool isMainShine(const Shine* shine);
62
63void updateHintTrans(const Shine* shine, const sead::Vector3f& trans);
64void appearShineAndJoinBossDemo(Shine* shine, const char* name, const sead::Quatf& quat,
65 const sead::Vector3f& trans);
66void endShineBossDemo(Shine* shine);
67void endShineBossDemoAndStartFall(Shine* shine, f32 a2);
68
69void setAppearItemFactorByMsg(const al::LiveActor* actor, const al::SensorMsg* msg,
70 const al::HitSensor* sensor);
71void setAppearItemFactorAndOffsetByMsg(const al::LiveActor* actor, const al::SensorMsg* msg,
72 const al::HitSensor* sensor);
73void setAppearItemFactorAndOffsetForCombo(const al::LiveActor* actor, const al::SensorMsg* msg,
74 const al::HitSensor* sensor, bool isSuperCombo);
75void appearItemFromObj(al::LiveActor* actor, const sead::Vector3f& trans, const sead::Quatf& quat,
76 f32 offset);
77void appearItemFromObj(al::LiveActor* actor, al::HitSensor* sensor, f32 offset);
78void appearItemFromObj(al::LiveActor* actor, al::HitSensor* sensor, const sead::Vector3f& offset);
79void appearItemFromObjGravity(al::LiveActor* actor, al::HitSensor* sensor,
80 const sead::Vector3f& offset);
81void appearRandomItemFromObj(al::LiveActor* actor, al::HitSensor* sensor, f32 offset);
82bool tryAppearMultiCoinFromObj(al::LiveActor* actor, const sead::Vector3f& trans, s32 step,
83 f32 offsetAbove);
84bool tryAppearMultiCoinFromObj(al::LiveActor* actor, const sead::Vector3f& trans,
85 const sead::Quatf& quat, s32 step, f32 offsetAbove);
86bool tryAppearMultiCoinFromObj(al::LiveActor* actor, al::HitSensor* sensor, s32 step,
87 f32 offsetAbove);
88bool tryAppearMultiCoinFromObj(al::LiveActor* actor, al::HitSensor* sensor, s32 step,
89 const sead::Vector3f& offset);
90
91void syncCoin2DAnimFrame(al::LiveActor* actor, const char* name);
92
93const char* getStageCoinCollectArchiveName(const al::LiveActor* actor);
94const char* getStageCoinCollectEmptyArchiveName(const al::LiveActor* actor);
95const char* getStageCoinCollect2DArchiveName(const al::LiveActor* actor);
96const char* getStageCoinCollect2DEmptyArchiveName(const al::LiveActor* actor);
97
98s32 getStageShineAnimFrame(const al::LiveActor* actor);
99s32 getStageShineAnimFrame(const al::LiveActor* actor, s32 worldId);
100s32 getStageShineAnimFrame(const al::LiveActor* actor, const char* stageName);
101void setStageShineAnimFrame(al::LiveActor* actor, const char* stageName, s32 shineAnimFrame,
102 bool isMatAnim);
103
104const char* getStageShineArchiveName(const al::LiveActor* actor, const char* stageName);
105const char* getStageShineEmptyArchiveName(const al::LiveActor* actor, const char* stageName);
106
107void setMaterialAsEmptyModel(al::LiveActor* actor);
108void setProjectionMtxAsEmptyModel2d(al::LiveActor* actor, const sead::Vector2f& vec);
109void addDemoRacePrizeCoin(al::LiveActor* actor);
110
111} // namespace rs
112
113namespace StageSceneFunction {
114void appearPlayerDeadCoin(al::LiveActor* actor);
115}
116