From dda0cf02bb12c189313b70e61d8994e22a3e7605 Mon Sep 17 00:00:00 2001 From: MonsterDruide1 <5958456@gmail.com> Date: Sat, 10 Jan 2026 15:45:11 +0100 Subject: [PATCH] all: Fix function calls to unimplemented functions (#865) --- data/file_list.yml | 13 ++++--- lib/al/Library/Base/StringUtil.cpp | 36 +++++++++---------- lib/al/Library/Layout/LayoutInitInfo.h | 1 + .../LiveActor/ActorMovementFunction.cpp | 2 +- lib/al/Library/MapObj/WobbleMapParts.cpp | 2 +- lib/al/Library/Obj/EffectObjFollowCamera.cpp | 2 +- .../Play/Camera/CameraVerticalAbsorber.cpp | 4 +-- .../LiveActor/ActorExecuteFunction.cpp | 3 +- lib/al/Project/Memory/MemorySystem.cpp | 17 ++++----- lib/al/Project/Memory/MemorySystem.h | 6 ++-- src/Enemy/Kuribo2D.cpp | 2 +- src/Enemy/Togezo2D.cpp | 2 +- src/Item/CoinCollectEmpty2D.cpp | 2 +- src/MapObj/HackFork.cpp | 4 +-- src/Npc/AchievementHolder.cpp | 2 +- src/Player/PlayerJudgeCameraSubjective.cpp | 2 +- src/Player/PlayerStateCameraSubjective.cpp | 2 +- src/System/GameProgressData.cpp | 8 ++--- src/Util/ItemUtil.cpp | 6 ++-- 19 files changed, 59 insertions(+), 57 deletions(-) diff --git a/data/file_list.yml b/data/file_list.yml index ae71fb53..2ca3017b 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -10,8 +10,9 @@ UNKNOWN: status: NotDecompiled - offset: 0x00019c size: 8 - label: '' + label: __cxa_atexit status: NotDecompiled + guess: true - offset: 0x0001ac size: 4 label: __nnDetailNintendoSdkRuntimeObjectFileRefer @@ -200269,8 +200270,9 @@ Util/YoshiUtil.o: status: Matching - offset: 0x723d9c size: 556 - label: '' - status: NotDecompiled + label: _ZN2nn3gfx6detail12_GLOBAL__N_119SetupTextureBuilderEP17NVNtextureBuilderP9NVNdeviceRKNS0_11TextureInfoE + status: Matching + guess: true - offset: 0x723fc8 size: 64 label: _ZN2nn3gfx6detail11TextureImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE20CalculateMipDataSizeEPNS1_10DeviceImplIS8_EERKNS0_11TextureInfoE @@ -308274,8 +308276,9 @@ Unknown/SePlayer.o: status: Matching - offset: 0xae8298 size: 204 - label: '' - status: NotDecompiled + label: _ZN2nn3gfx6detail12_GLOBAL__N_116GetNvnCopyStrideEPlS3_RKNS0_23BufferTextureCopyRegionEP10NVNtexture + status: Matching + guess: true - offset: 0xae8364 size: 356 label: _ZN2nn3gfx6detail17CommandBufferImplINS0_12ApiVariationINS0_7ApiTypeILi4EEENS0_10ApiVersionILi8EEEEEE17CopyImageToBufferEPNS1_10BufferImplIS8_EEPKNS1_11TextureImplIS8_EERKNS0_23BufferTextureCopyRegionE diff --git a/lib/al/Library/Base/StringUtil.cpp b/lib/al/Library/Base/StringUtil.cpp index abe098e7..a5db46ce 100644 --- a/lib/al/Library/Base/StringUtil.cpp +++ b/lib/al/Library/Base/StringUtil.cpp @@ -34,36 +34,32 @@ void createFileNameBySuffix(sead::BufferedSafeString* out, const char* name, con u32 outputValueWithComma(char* out, u32 size, u64 value, bool usePadding, bool padToThousands) { if (value > 999999999) { - return sead::StringUtil::snprintf(out, size, "%3d,%03d,%03d,%03d", - (u32)(value / 1000000000), (u32)(value / 1000000 % 1000), - (u32)(value / 1000 % 1000), (u32)(value % 1000)); + return snprintf(out, size, "%3d,%03d,%03d,%03d", (u32)(value / 1000000000), + (u32)(value / 1000000 % 1000), (u32)(value / 1000 % 1000), + (u32)(value % 1000)); } if (value > 999999) { if (usePadding) { - return sead::StringUtil::snprintf(out, size, "%3d,%03d,%03d", (u32)(value / 1000000), - (u32)(value / 1000 % 1000), (u32)(value % 1000)); + return snprintf(out, size, "%3d,%03d,%03d", (u32)(value / 1000000), + (u32)(value / 1000 % 1000), (u32)(value % 1000)); } - return sead::StringUtil::snprintf(out, size, "%d,%03d,%03d", (u32)(value / 1000000), - (u32)(value / 1000 % 1000), (u32)(value % 1000)); + return snprintf(out, size, "%d,%03d,%03d", (u32)(value / 1000000), + (u32)(value / 1000 % 1000), (u32)(value % 1000)); } if (value > 999) { if (usePadding) { - if (padToThousands) { - return sead::StringUtil::snprintf(out, size, "%3d,%03d", (u32)(value / 1000), - (u32)(value % 1000)); - } - return sead::StringUtil::snprintf(out, size, " %3d,%03d", (u32)(value / 1000), - (u32)(value % 1000)); + if (padToThousands) + return snprintf(out, size, "%3d,%03d", (u32)(value / 1000), (u32)(value % 1000)); + return snprintf(out, size, " %3d,%03d", (u32)(value / 1000), (u32)(value % 1000)); } - return sead::StringUtil::snprintf(out, size, "%d,%03d", (u32)(value / 1000), - (u32)(value % 1000)); + return snprintf(out, size, "%d,%03d", (u32)(value / 1000), (u32)(value % 1000)); } if (usePadding) { if (padToThousands) - return sead::StringUtil::snprintf(out, size, " %3d", (u32)value); - return sead::StringUtil::snprintf(out, size, " %3d", (u32)value); + return snprintf(out, size, " %3d", (u32)value); + return snprintf(out, size, " %3d", (u32)value); } - return sead::StringUtil::snprintf(out, size, "%d", (u32)value); + return snprintf(out, size, "%d", (u32)value); } void extractString(char* out, const char* str, u32 len, u32 unused) { @@ -100,8 +96,8 @@ const char* searchSubString(const char* str, const char* substr, s32 substrLen) void removeExtensionString(char* out, u32 len, const char* str) { snprintf(out, len, "%s", str); - char* dot = strchr(out, '.'); - char* dirSeparator = strchr(out, '/'); + char* dot = strrchr(out, '.'); + char* dirSeparator = strrchr(out, '/'); if (!dot || dot < dirSeparator || ++dirSeparator == dot) return; diff --git a/lib/al/Library/Layout/LayoutInitInfo.h b/lib/al/Library/Layout/LayoutInitInfo.h index df8fe078..e3278e78 100644 --- a/lib/al/Library/Layout/LayoutInitInfo.h +++ b/lib/al/Library/Layout/LayoutInitInfo.h @@ -20,6 +20,7 @@ class OcclusionCullingJudge; class LayoutInitInfo : public LayoutSceneInfo { public: + LayoutInitInfo(); void init(ExecuteDirector*, const EffectSystemInfo*, SceneObjHolder*, const AudioDirector*, CameraDirector*, const LayoutSystem*, const MessageSystem*, const GamePadSystem*, PadRumbleDirector*); diff --git a/lib/al/Library/LiveActor/ActorMovementFunction.cpp b/lib/al/Library/LiveActor/ActorMovementFunction.cpp index 21138150..19f77424 100644 --- a/lib/al/Library/LiveActor/ActorMovementFunction.cpp +++ b/lib/al/Library/LiveActor/ActorMovementFunction.cpp @@ -1208,7 +1208,7 @@ bool turnFrontToDirGetIsFinished(LiveActor* actor, const sead::Vector3f& dir, f3 sead::Vector3f up; calcFrontDir(&up, actor); bool finished = turnDirectionDegree(actor, &up, dir, deg); - rotateVectorDegree(getFrontPtr(actor), getFront(actor), up, deg); + turnVecToVecDegree(getFrontPtr(actor), getFront(actor), up, deg); normalize(getFrontPtr(actor)); return finished; } diff --git a/lib/al/Library/MapObj/WobbleMapParts.cpp b/lib/al/Library/MapObj/WobbleMapParts.cpp index 2c3a487a..96911a88 100644 --- a/lib/al/Library/MapObj/WobbleMapParts.cpp +++ b/lib/al/Library/MapObj/WobbleMapParts.cpp @@ -155,7 +155,7 @@ void WobbleMapParts::updateMove() { void WobbleMapParts::exeMove() { updateMove(); - tryStartSeWithParam(this, "Rotate", mTiltSpeed, ""); + tryHoldSeWithParam(this, "Rotate", mTiltSpeed, ""); if (mTiltSpeed < 0.1f) startNerveAction(this, "Wait"); } diff --git a/lib/al/Library/Obj/EffectObjFollowCamera.cpp b/lib/al/Library/Obj/EffectObjFollowCamera.cpp index 841ab3ae..a712114d 100644 --- a/lib/al/Library/Obj/EffectObjFollowCamera.cpp +++ b/lib/al/Library/Obj/EffectObjFollowCamera.cpp @@ -30,7 +30,7 @@ void EffectObjFollowCamera::init(const ActorInitInfo& info) { EffectObjFunction::initActorEffectObj(this, info); invalidateClipping(this); - setEffectNamedMtxPtr(this, "Wait", &mBaseMtx); + setEffectFollowMtxPtr(this, "Wait", &mBaseMtx); initNerve(this, &Wait, 0); listenStageSwitchOnOffAppear( diff --git a/lib/al/Library/Play/Camera/CameraVerticalAbsorber.cpp b/lib/al/Library/Play/Camera/CameraVerticalAbsorber.cpp index d2681792..4d5718b3 100644 --- a/lib/al/Library/Play/Camera/CameraVerticalAbsorber.cpp +++ b/lib/al/Library/Play/Camera/CameraVerticalAbsorber.cpp @@ -11,8 +11,8 @@ namespace { using namespace al; NERVE_IMPL(CameraVerticalAbsorber, FollowGround); NERVE_IMPL(CameraVerticalAbsorber, FollowAbsolute); -NERVE_IMPL_(CameraVerticalAbsorber, FollowClimbPoleNoInterp, Follow); -NERVE_IMPL_(CameraVerticalAbsorber, FollowSlow, Absorb); +NERVE_IMPL_(CameraVerticalAbsorber, FollowClimbPoleNoInterp, FollowClimbPole); +NERVE_IMPL_(CameraVerticalAbsorber, FollowSlow, Follow); NERVE_IMPL(CameraVerticalAbsorber, Absorb); NERVE_IMPL(CameraVerticalAbsorber, Follow); NERVE_IMPL(CameraVerticalAbsorber, FollowClimbPole); diff --git a/lib/al/Project/LiveActor/ActorExecuteFunction.cpp b/lib/al/Project/LiveActor/ActorExecuteFunction.cpp index a3a2775b..b841cc37 100644 --- a/lib/al/Project/LiveActor/ActorExecuteFunction.cpp +++ b/lib/al/Project/LiveActor/ActorExecuteFunction.cpp @@ -48,7 +48,8 @@ void executeUpdateCalcView(const LiveActorKit* actorKit) { } void waitUpdateCalcView(const LiveActorKit* actorKit) { - executeUpdateCalcView(actorKit); + actorKit->getExecutorCore1()->waitAsync(); + actorKit->getExecutorCore2()->waitAsync(); if (actorKit->getGraphicsSystemInfo() && actorKit->getGraphicsSystemInfo()->getSkyDirector()) actorKit->getGraphicsSystemInfo()->getSkyDirector()->update(); } diff --git a/lib/al/Project/Memory/MemorySystem.cpp b/lib/al/Project/Memory/MemorySystem.cpp index 209fe891..108c0e83 100644 --- a/lib/al/Project/Memory/MemorySystem.cpp +++ b/lib/al/Project/Memory/MemorySystem.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include "Library/Base/Macros.h" @@ -17,8 +18,8 @@ MemorySystem::MemorySystem(sead::Heap* heap) : mDelegate(this, &MemorySystem::allocFailedCallbackFunc) { sead::HeapMgr::instance()->setAllocFailedCallback(&mDelegate); mStationedHeap = - sead::ExpHeap::tryCreate((u32)heap->getMaxAllocatableSize(8) - 0x1900000, "StationedHeap", - heap, 8, sead::Heap::cHeapDirection_Forward, false); + sead::ExpHeap::create((u32)heap->getMaxAllocatableSize(8) - 0x1900000, "StationedHeap", + heap, 8, sead::Heap::cHeapDirection_Forward, false); { sead::ScopedCurrentHeapSetter setter(mStationedHeap); @@ -40,8 +41,8 @@ void MemorySystem::allocFailedCallbackFunc(const sead::HeapMgr::AllocFailedCallb } void MemorySystem::createSequenceHeap() { - mSequenceHeap = sead::ExpHeap::tryCreate(0, "SequenceHeap", nullptr, 8, - sead::Heap::cHeapDirection_Forward, false); + mSequenceHeap = sead::ExpHeap::create(0, "SequenceHeap", nullptr, 8, + sead::Heap::cHeapDirection_Forward, false); } void MemorySystem::freeAllSequenceHeap() { @@ -67,7 +68,7 @@ bool MemorySystem::createSceneHeap(const char* stageName, bool backwards) { if (currentHeap && currentHeap->getMaxAllocatableSize(8) < size) size = currentHeap->getMaxAllocatableSize(8); - mSceneHeap = sead::ExpHeap::tryCreate(size, "SceneHeap", nullptr, 8, direction, false); + mSceneHeap = sead::FrameHeap::create(size, "SceneHeap", nullptr, 8, direction, false); mSceneHeap->mFlag.reset(sead::Heap::Flag::cEnableDebugFillUser); return currentSceneResourceHeap == nullptr; @@ -139,7 +140,7 @@ void MemorySystem::createCourseSelectHeap() { if (currentHeap && currentHeap->getMaxAllocatableSize(8) < size) size = currentHeap->getMaxAllocatableSize(8); - mCourseSelectResourceHeap = sead::ExpHeap::tryCreate( + mCourseSelectResourceHeap = sead::FrameHeap::create( size, "CourseSelectHeapResource", nullptr, 8, sead::Heap::cHeapDirection_Reverse, true); mCourseSelectResourceHeap->mFlag.reset(sead::Heap::Flag::cEnableDebugFillUser); } @@ -149,8 +150,8 @@ void MemorySystem::createCourseSelectHeap() { if (currentHeap && currentHeap->getMaxAllocatableSize(8) < size) size = currentHeap->getMaxAllocatableSize(8); - mCourseSelectHeap = sead::ExpHeap::tryCreate(size, "CourseSelectHeapScene", nullptr, 8, - sead::Heap::cHeapDirection_Reverse, false); + mCourseSelectHeap = sead::FrameHeap::create(size, "CourseSelectHeapScene", nullptr, 8, + sead::Heap::cHeapDirection_Reverse, false); mCourseSelectHeap->mFlag.reset(sead::Heap::Flag::cEnableDebugFillUser); } } diff --git a/lib/al/Project/Memory/MemorySystem.h b/lib/al/Project/Memory/MemorySystem.h index 9143a3a5..3fd499a2 100644 --- a/lib/al/Project/Memory/MemorySystem.h +++ b/lib/al/Project/Memory/MemorySystem.h @@ -58,10 +58,10 @@ private: sead::ExpHeap* mStationedHeap = nullptr; sead::ExpHeap* mSequenceHeap = nullptr; sead::FrameHeap* mSceneResourceHeap = nullptr; - sead::ExpHeap* mSceneHeap = nullptr; + sead::FrameHeap* mSceneHeap = nullptr; sead::ExpHeap* mPlayerResourceHeap = nullptr; - sead::ExpHeap* mCourseSelectResourceHeap = nullptr; - sead::ExpHeap* mCourseSelectHeap = nullptr; + sead::FrameHeap* mCourseSelectResourceHeap = nullptr; + sead::FrameHeap* mCourseSelectHeap = nullptr; sead::ExpHeap* mWorldResourceHeap = nullptr; sead::StrTreeMap<32, sead::Heap*> mHeapList; AudioResourceDirector* mAudioResourceDirector = nullptr; diff --git a/src/Enemy/Kuribo2D.cpp b/src/Enemy/Kuribo2D.cpp index 41d23ae8..6736388f 100644 --- a/src/Enemy/Kuribo2D.cpp +++ b/src/Enemy/Kuribo2D.cpp @@ -140,7 +140,7 @@ void Kuribo2D::appearByGenerator(const sead::Vector3f& trans, const sead::Vector al::setGravity(this, dimensionGravity); al::setVelocityZero(this); al::offCollide(this); - al::invalidateHitSensors(this); + al::invalidateClipping(this); appear(); al::setNerve(this, &NrvKuribo2D.Wait); } diff --git a/src/Enemy/Togezo2D.cpp b/src/Enemy/Togezo2D.cpp index 42a52f0b..d4d1fb76 100644 --- a/src/Enemy/Togezo2D.cpp +++ b/src/Enemy/Togezo2D.cpp @@ -126,7 +126,7 @@ void Togezo2D::control() { void Togezo2D::exeWalk() { if (al::isFirstStep(this)) { - al::validateClipping(this); + al::invalidateClipping(this); al::showModelIfHide(this); al::onCollide(this); al::validateHitSensors(this); diff --git a/src/Item/CoinCollectEmpty2D.cpp b/src/Item/CoinCollectEmpty2D.cpp index 15eb993d..75785f4f 100644 --- a/src/Item/CoinCollectEmpty2D.cpp +++ b/src/Item/CoinCollectEmpty2D.cpp @@ -62,7 +62,7 @@ void CoinCollectEmpty2D::initAfterPlacement() { bool CoinCollectEmpty2D::receiveMsg(const al::SensorMsg* message, al::HitSensor* other, al::HitSensor* self) { - if (rs::isMsgItemGet2D(message) && al::isNerve(this, &NrvCoinCollectEmpty2D.Wait)) { + if (rs::isMsgPlayerItemGet2D(message) && al::isNerve(this, &NrvCoinCollectEmpty2D.Wait)) { al::invalidateClipping(this); al::setNerve(this, &NrvCoinCollectEmpty2D.Got); return true; diff --git a/src/MapObj/HackFork.cpp b/src/MapObj/HackFork.cpp index 755f1c17..54416691 100644 --- a/src/MapObj/HackFork.cpp +++ b/src/MapObj/HackFork.cpp @@ -648,8 +648,8 @@ void HackFork::exeHackBend() { sead::Vector3f oldPullDirection = mPullDirection; f32 jumpDir = mIsPullDown ? -1.0f : 1.0f; - f32 angle = sead::Mathf::clamp((jumpDir * mUpDir).dot(pullDirection), -1.0f, 1.0f); - if (sead::Mathf::rad2deg(sead::Mathf::cos(angle)) < getJumpRange()) + f32 cos = sead::Mathf::clamp((jumpDir * mUpDir).dot(pullDirection), -1.0f, 1.0f); + if (sead::Mathf::rad2deg(sead::Mathf::acos(cos)) < getJumpRange()) mPullDirection = mPullDirection * 0.5f + pullDirection * 0.5f; al::normalize(&mPullDirection); f32 oldDampingForce = mDampingForce; diff --git a/src/Npc/AchievementHolder.cpp b/src/Npc/AchievementHolder.cpp index bb617a52..81013103 100644 --- a/src/Npc/AchievementHolder.cpp +++ b/src/Npc/AchievementHolder.cpp @@ -140,7 +140,7 @@ s32 AchievementHolder::getAchievementProgressCurrentRow(s32 index, if (al::isEqualString(*name, "Souvenir_Count_1") || al::isEqualString(*name, "Souvenir_Count_2") || al::isEqualString(*name, "Souvenir_Count_3")) - return rs::calcHaveStickerNum(accessor) + rs::calcHaveGiftNum(accessor); + return rs::calcHaveGiftNum(accessor) + rs::calcHaveStickerNum(accessor); if (al::isEqualString(*name, "Capture_Count_1") || al::isEqualString(*name, "Capture_Count_2") || al::isEqualString(*name, "Capture_Count_3")) return rs::calcHackObjNum(accessor); diff --git a/src/Player/PlayerJudgeCameraSubjective.cpp b/src/Player/PlayerJudgeCameraSubjective.cpp index fc0aa168..4323587a 100644 --- a/src/Player/PlayerJudgeCameraSubjective.cpp +++ b/src/Player/PlayerJudgeCameraSubjective.cpp @@ -15,8 +15,8 @@ PlayerJudgeCameraSubjective::PlayerJudgeCameraSubjective(const al::LiveActor* pl : mPlayer(player), mCollider(collider), mInput(input) { mTicket = al::initSubjectiveCameraNoSave(player, "Subjective"); - al::validateSnapShotCameraRoll(mTicket); al::validateSnapShotCameraZoomFovy(mTicket); + al::validateSnapShotCameraRoll(mTicket); } bool PlayerJudgeCameraSubjective::isEnableKeepSubjectiveCamera() const { diff --git a/src/Player/PlayerStateCameraSubjective.cpp b/src/Player/PlayerStateCameraSubjective.cpp index 761047c2..c07a45bf 100644 --- a/src/Player/PlayerStateCameraSubjective.cpp +++ b/src/Player/PlayerStateCameraSubjective.cpp @@ -136,7 +136,7 @@ void PlayerStateCameraSubjective::exeWait() { if (al::isFirstStep(this)) { mModelChanger->hideModel(); if (mCarryKeeper->isCarry()) - mCarryKeeper->endCameraSubjective(); + mCarryKeeper->startCameraSubjective(); rs::tryAppearPlayerCameraSubjectiveTutorial(mActor); mAnimator->startAnim("Wait"); } diff --git a/src/System/GameProgressData.cpp b/src/System/GameProgressData.cpp index 66f92921..6f4790b0 100644 --- a/src/System/GameProgressData.cpp +++ b/src/System/GameProgressData.cpp @@ -220,11 +220,11 @@ s32 GameProgressData::calcNextLockedWorldIdForWorldMap(s32 idx) const { case 5: return GameDataFunction::getWorldIndexCity(); case 8: - return idx != 0 ? GameDataFunction::getWorldIndexSnow() : - GameDataFunction::getWorldIndexSea(); + return idx == 0 ? GameDataFunction::getWorldIndexSea() : + GameDataFunction::getWorldIndexSnow(); case 9: - return isUnlockFirstSea() ? GameDataFunction::getWorldIndexSea() : - GameDataFunction::getWorldIndexSnow(); + return isUnlockFirstSea() ? GameDataFunction::getWorldIndexSnow() : + GameDataFunction::getWorldIndexSea(); case 11: return GameDataFunction::getWorldIndexSky(); default: diff --git a/src/Util/ItemUtil.cpp b/src/Util/ItemUtil.cpp index f2f1b9be..0654fa89 100644 --- a/src/Util/ItemUtil.cpp +++ b/src/Util/ItemUtil.cpp @@ -605,7 +605,7 @@ s32 getStageShineAnimFrame(const al::LiveActor* actor, s32 worldId) { s32 getStageShineAnimFrame(const al::LiveActor* actor, const char* stageName) { s32 worldId = - al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByMainStageName( + al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByStageName( stageName); worldId = sead::Mathi::max(0, worldId); @@ -636,7 +636,7 @@ void setStageShineAnimFrame(al::LiveActor* actor, const char* stageName, s32 shi const char* getStageShineArchiveName(const al::LiveActor* actor, const char* stageName) { s32 worldId = - al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByMainStageName( + al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByStageName( stageName); return worldId == GameDataFunction::getWorldIndexPeach() ? "PowerStar" : "Shine"; @@ -644,7 +644,7 @@ const char* getStageShineArchiveName(const al::LiveActor* actor, const char* sta const char* getStageShineEmptyArchiveName(const al::LiveActor* actor, const char* stageName) { s32 worldId = - al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByMainStageName( + al::getSceneObj(actor)->getWorldList()->tryFindWorldIndexByStageName( stageName); return worldId == GameDataFunction::getWorldIndexPeach() ? "PowerStarEmpty" : "ShineEmpty";