1#include "Amiibo/HelpAmiiboLifeMaxUpItem.h"
2
3#include "Library/LiveActor/ActorFlagFunction.h"
4#include "Library/LiveActor/ActorInitUtil.h"
5#include "Library/Nfp/NfpFunction.h"
6#include "Library/Se/SeFunction.h"
7
8#include "Amiibo/HelpAmiiboDirector.h"
9#include "Amiibo/HelpAmiiboFunction.h"
10#include "Item/LifeMaxUpItem.h"
11#include "Item/LifeMaxUpItem2D.h"
12#include "Util/PlayerUtil.h"
13
14HelpAmiiboLifeMaxUpItem::HelpAmiiboLifeMaxUpItem(HelpAmiiboDirector* director, al::LiveActor* actor)
15 : HelpAmiiboExecutor(director, actor, "ライフアップアイテムお助け") {}
16
17void HelpAmiiboLifeMaxUpItem::initAfterPlacement(const al::ActorInitInfo& initInfo) {
18 HelpAmiiboExecutor::initAfterPlacement(initInfo);
19 mItem = new LifeMaxUpItem("最大ライフアップアイテム[amiibo]");
20 al::initCreateActorNoPlacementInfo(actor: mItem, initInfo);
21 mItem->makeActorDead();
22
23 mItem2D = new LifeMaxUpItem2D("最大ライフアップアイテム2D[amiibo]");
24 al::initCreateActorNoPlacementInfo(actor: mItem2D, initInfo);
25 mItem2D->makeActorDead();
26}
27
28bool HelpAmiiboLifeMaxUpItem::isTriggerTouch(const al::NfpInfo& nfpInfo) const {
29 return al::isCharacterIdBasePeach(nfpInfo);
30}
31
32bool HelpAmiiboLifeMaxUpItem::isEnableUse() {
33 return true;
34}
35
36bool HelpAmiiboLifeMaxUpItem::execute() {
37 bool isAlive = true;
38 if (!al::isDead(actor: mItem) || !al::isDead(actor: mItem2D))
39 isAlive = false;
40
41 return isAlive;
42}
43
44void HelpAmiiboLifeMaxUpItem::activate() {
45 al::LiveActor* actor = getActor();
46 const sead::Vector3f& playerPos = rs::getPlayerPos(actor);
47 HelpAmiiboExecutor::activate();
48
49 if (rs::isPlayer2D(actor)) {
50 sead::Vector3f appearOffset = sead::Vector3f::zero;
51 HelpAmiiboFunction::calcLifeUpItemAppearOffset(&appearOffset, actor);
52 sead::Vector3f frontDir = sead::Vector3f::zero;
53 rs::calcPlayerFrontDir(&frontDir, actor);
54 mItem2D->appearByAmiibo(playerPos + appearOffset, frontDir);
55 al::startSe(getDirector(), "AmiiboPeach");
56 return;
57 }
58
59 sead::Vector3f appearOffset = sead::Vector3f::zero;
60 HelpAmiiboFunction::calcLifeUpItemAppearOffset(&appearOffset, actor);
61 if (!rs::isPlayerHack(actor)) {
62 mItem->appearAmiiboTouch(playerPos + appearOffset);
63 } else {
64 sead::Vector3f basePos = sead::Vector3f::zero;
65 rs::calcPlayerAmiiboPeachAppearBasePos(&basePos, actor);
66 mItem->appearAmiiboTouch(basePos);
67 }
68 al::startSe(getDirector(), "AmiiboPeach");
69}
70