mirror of
https://github.com/MonsterDruide1/OdysseyDecomp
synced 2026-04-27 11:04:16 +00:00
118 lines
4.5 KiB
C++
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
|