OdysseyDecomp/lib/al/Library/Layout/LayoutActionFunction.cpp

118 lines
4.5 KiB
C++

#include "Library/Layout/LayoutActionFunction.h"
#include "Library/Base/StringUtil.h"
#include "Library/Layout/IUseLayoutAction.h"
#include "Library/Layout/LayoutActionKeeper.h"
#include "Library/Layout/LayoutActor.h"
#include "Library/Layout/LayoutPaneGroup.h"
#include "Library/Math/MathUtil.h"
#include "Library/Nerve/NerveUtil.h"
namespace al {
inline LayoutPaneGroup* getLayoutPaneGroup(const IUseLayoutAction* layout, const char* paneName) {
return layout->getLayoutActionKeeper()->getLayoutPaneGroup(paneName);
}
void startAction(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
layout->getLayoutActionKeeper()->startAction(actionName, paneName);
}
s32 startActionAtRandomFrame(IUseLayoutAction* layout, const char* actionName,
const char* paneName) {
startAction(layout, actionName, paneName);
LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
f32 animFrameMax = paneGroup->getAnimFrameMax(actionName);
f32 randomFrame = getRandom(0.0f, animFrameMax);
paneGroup->setAnimFrame((s32)randomFrame);
return randomFrame;
}
void startFreezeAction(IUseLayoutAction* layout, const char* actionName, f32 frame,
const char* paneName) {
startAction(layout, actionName, paneName);
LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
paneGroup->setAnimFrame(frame);
paneGroup->setAnimFrameRate(0.0f);
}
void startFreezeActionEnd(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
f32 animFrameEnd = getActionFrameMax(layout, actionName, paneName);
startFreezeAction(layout, actionName, animFrameEnd, paneName);
}
f32 getActionFrameMax(const IUseLayoutAction* layout, const char* actionName,
const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->getAnimFrameMax(actionName);
}
void startFreezeGaugeAction(IUseLayoutAction* layout, f32 value, f32 minFrame, f32 maxFrame,
const char* actionName, const char* paneName) {
f32 frame =
calcRate01(value, minFrame, maxFrame) * getActionFrameMax(layout, actionName, paneName);
startFreezeAction(layout, actionName, frame, paneName);
}
bool tryStartAction(IUseLayoutAction* layout, const char* actionName, const char* paneName) {
if (!isExistAction(layout, actionName, paneName))
return false;
startAction(layout, actionName, paneName);
return true;
}
bool isExistAction(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
return isExistAction(layout, paneName) &&
getLayoutPaneGroup(layout, paneName)->isAnimExist(actionName);
}
bool isActionEnd(const IUseLayoutAction* layout, const char* paneName) {
LayoutPaneGroup* paneGroup = getLayoutPaneGroup(layout, paneName);
if (paneGroup && paneGroup->isAnimPlaying() && paneGroup->isAnimOneTime())
return paneGroup->isAnimEnd();
return true;
}
bool isExistAction(const IUseLayoutAction* layout, const char* paneName) {
return layout->getLayoutActionKeeper()->getLayoutPaneGroup(paneName) != nullptr;
}
bool isActionOneTime(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->isAnimOneTime(actionName);
}
f32 getActionFrame(const IUseLayoutAction* layout, const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->getAnimFrame();
}
void setActionFrame(IUseLayoutAction* layout, f32 frame, const char* paneName) {
getLayoutPaneGroup(layout, paneName)->setAnimFrame(frame);
}
f32 getActionFrameRate(const IUseLayoutAction* layout, const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->getAnimFrameRate();
}
void setActionFrameRate(IUseLayoutAction* layout, f32 frameRate, const char* paneName) {
getLayoutPaneGroup(layout, paneName)->setAnimFrameRate(frameRate);
}
const char* getActionName(const IUseLayoutAction* layout, const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->getPlayingAnimName();
}
bool isActionPlaying(const IUseLayoutAction* layout, const char* actionName, const char* paneName) {
return isEqualString(getLayoutPaneGroup(layout, paneName)->getPlayingAnimName(), actionName);
}
bool isAnyActionPlaying(const IUseLayoutAction* layout, const char* paneName) {
return getLayoutPaneGroup(layout, paneName)->isAnimPlaying();
}
void setNerveAtActionEnd(LayoutActor* layout, const Nerve* nerve) {
if (isActionEnd(layout, nullptr))
setNerve(layout, nerve);
}
} // namespace al