mirror of
https://github.com/projectPiki/pikmin2.git
synced 2024-11-23 13:29:55 +00:00
Cleanup Radar
This commit is contained in:
parent
b6cb1e6d93
commit
9c217963cd
@ -6,6 +6,7 @@
|
||||
#include "Game/gamePlayData.h"
|
||||
#include "Game/gameStages.h"
|
||||
#include "efx/TChasePos.h"
|
||||
#include "Radar.h"
|
||||
#include "id32.h"
|
||||
|
||||
namespace og {
|
||||
@ -80,7 +81,7 @@ struct SingleGameSection : public BaseGameSection {
|
||||
void drawCaveScreen();
|
||||
void drawMainMapScreen();
|
||||
void setDispMemberNavi(og::Screen::DataNavi& data, int naviID);
|
||||
int calcOtakaraLevel(f32&);
|
||||
Radar::Mgr::RadarSearchResult calcOtakaraLevel(f32&);
|
||||
|
||||
inline void setCurrState(StateType* state) { mCurrentState = state; }
|
||||
inline StateType* getCurrState() { return mCurrentState; }
|
||||
|
@ -70,6 +70,18 @@ struct Radar {
|
||||
};
|
||||
|
||||
struct Mgr {
|
||||
enum RadarSearchResult {
|
||||
NO_TREASURE_FOUND = 0, // No treasure found
|
||||
TREASURE_FOUND = 1, // At least one treasure found but not the closest
|
||||
CLOSEST_TREASURE_FOUND = 2, // Found a closest treasure
|
||||
|
||||
// For antenna beetles
|
||||
WHISTLE_ACTIVE_TIMER_EXPIRED = 3, // Whistle is active, timer expired
|
||||
WHISTLE_ACTIVE = 4, // Whistle is active, but timer not expired
|
||||
|
||||
NOT_PROCESSED = 5, // Not yet processed, AKA invalid or default
|
||||
};
|
||||
|
||||
Mgr();
|
||||
|
||||
static void entry(Game::TPositionObject*, Radar::cRadarType, u32);
|
||||
@ -77,7 +89,7 @@ struct Radar {
|
||||
|
||||
void attach(Game::TPositionObject*, Radar::cRadarType, u32);
|
||||
void bornFuefuki();
|
||||
int calcNearestTreasure(Vector3f& naviPos, f32 searchDist, Vector3f& treasurePos, f32& nearestDistanceSquared);
|
||||
RadarSearchResult calcNearestTreasure(Vector3f& naviPos, f32 searchDist, Vector3f& treasurePos, f32& nearestDistanceSquared);
|
||||
void clear();
|
||||
bool detach(Game::TPositionObject*);
|
||||
void dieFuefuki();
|
||||
@ -86,13 +98,13 @@ struct Radar {
|
||||
static int getNumOtakaraItems();
|
||||
void ogDummpyInit();
|
||||
|
||||
Point mPointNode1; // _00
|
||||
Point mPointNode2; // _24
|
||||
Point mActiveRadarNodes; // _00
|
||||
Point mInactiveRadarNodes; // _24
|
||||
Point* mPointList; // _48
|
||||
int mNumObjects; // _4C
|
||||
int mOtakaraNum; // _50
|
||||
int mTreasureCount; // _50
|
||||
int mFuefukiCount; // _54
|
||||
int mFuefukiTimer; // _58
|
||||
int mFuefukiWhistleTimer; // _58
|
||||
};
|
||||
|
||||
static Mgr* mgr;
|
||||
|
@ -380,7 +380,7 @@ bool Navi::demoCheck()
|
||||
|
||||
// Mark the cave as visited in the pause map screen
|
||||
if (Radar::mgr) {
|
||||
FOREACH_NODE(Radar::Point, Radar::mgr->mPointNode1.mChild, cPoint)
|
||||
FOREACH_NODE(Radar::Point, Radar::mgr->mActiveRadarNodes.mChild, cPoint)
|
||||
{
|
||||
if (cPoint->mObjType == Radar::MAP_UNENTERED_CAVE && targetCave->mCaveID.getID() == cPoint->getCaveID()) {
|
||||
cPoint->mObjType = Radar::MAP_INCOMPLETE_CAVE;
|
||||
|
@ -30,8 +30,8 @@ Vector2f Radar::Point::getPosition()
|
||||
*/
|
||||
Radar::Mgr::Mgr()
|
||||
{
|
||||
mPointNode1.clear();
|
||||
mPointNode2.clear();
|
||||
mActiveRadarNodes.clear();
|
||||
mInactiveRadarNodes.clear();
|
||||
|
||||
mNumObjects = RADAR_MAX_OBJECTS;
|
||||
mPointList = new Point[mNumObjects];
|
||||
@ -44,8 +44,8 @@ Radar::Mgr::Mgr()
|
||||
*/
|
||||
void Radar::Mgr::clear()
|
||||
{
|
||||
mPointNode1.clear();
|
||||
mPointNode2.clear();
|
||||
mActiveRadarNodes.clear();
|
||||
mInactiveRadarNodes.clear();
|
||||
|
||||
for (int i = 0; i < mNumObjects; i++) {
|
||||
Point* pointList = &mPointList[i];
|
||||
@ -54,12 +54,12 @@ void Radar::Mgr::clear()
|
||||
pointList->mObjType = MAP_NULL_ICON;
|
||||
pointList->mCaveID = nullptr;
|
||||
|
||||
mPointNode2.add(&mPointList[i]);
|
||||
mInactiveRadarNodes.add(&mPointList[i]);
|
||||
}
|
||||
|
||||
mOtakaraNum = 0;
|
||||
mTreasureCount = 0;
|
||||
mFuefukiCount = 0;
|
||||
mFuefukiTimer = 0;
|
||||
mFuefukiWhistleTimer = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -83,7 +83,7 @@ void Radar::Mgr::dieFuefuki()
|
||||
* @note Address: 0x8021E574
|
||||
* @note Size: 0x10
|
||||
*/
|
||||
void Radar::Mgr::fuefuki() { mFuefukiTimer++; }
|
||||
void Radar::Mgr::fuefuki() { mFuefukiWhistleTimer++; }
|
||||
|
||||
/**
|
||||
* @note Address: 0x8021E584
|
||||
@ -94,7 +94,7 @@ void Radar::Mgr::entry(Game::TPositionObject* obj, Radar::cRadarType type, u32 f
|
||||
if (mgr) {
|
||||
mgr->attach(obj, type, flag);
|
||||
if (type == MAP_TREASURE || type == MAP_SWALLOWED_TREASURE || type == MAP_UPGRADE) {
|
||||
mgr->mOtakaraNum++;
|
||||
mgr->mTreasureCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -118,7 +118,7 @@ bool Radar::Mgr::exit(Game::TPositionObject* obj)
|
||||
int Radar::Mgr::getNumOtakaraItems()
|
||||
{
|
||||
if (mgr) {
|
||||
return mgr->mOtakaraNum;
|
||||
return mgr->mTreasureCount;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -132,12 +132,12 @@ void Radar::Mgr::attach(Game::TPositionObject* obj, Radar::cRadarType type, u32
|
||||
detach(obj);
|
||||
// DUMB. this is needed to match as an inline in ogDummpyInit.
|
||||
// (just cast to the damn Point and use it smFh.)
|
||||
CNode* cPoint = mPointNode2.mChild;
|
||||
Point* point = static_cast<Point*>(mPointNode2.mChild);
|
||||
CNode* cPoint = mInactiveRadarNodes.mChild;
|
||||
Point* point = static_cast<Point*>(mInactiveRadarNodes.mChild);
|
||||
if (cPoint) {
|
||||
cPoint->del();
|
||||
point->setData(obj, type, flag);
|
||||
mPointNode1.add(cPoint);
|
||||
mActiveRadarNodes.add(cPoint);
|
||||
}
|
||||
}
|
||||
|
||||
@ -147,7 +147,7 @@ void Radar::Mgr::attach(Game::TPositionObject* obj, Radar::cRadarType type, u32
|
||||
*/
|
||||
bool Radar::Mgr::detach(Game::TPositionObject* obj)
|
||||
{
|
||||
FOREACH_NODE(Point, mPointNode1.mChild, point)
|
||||
FOREACH_NODE(Point, mActiveRadarNodes.mChild, point)
|
||||
{
|
||||
if (point->mObject != obj) {
|
||||
continue;
|
||||
@ -159,10 +159,10 @@ bool Radar::Mgr::detach(Game::TPositionObject* obj)
|
||||
point->setData(nullptr, MAP_NULL_ICON, 0);
|
||||
|
||||
if (type == MAP_TREASURE || type == MAP_SWALLOWED_TREASURE || type == MAP_UPGRADE) {
|
||||
mgr->mOtakaraNum--;
|
||||
mgr->mTreasureCount--;
|
||||
}
|
||||
|
||||
mPointNode2.add(point);
|
||||
mInactiveRadarNodes.add(point);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -172,52 +172,58 @@ bool Radar::Mgr::detach(Game::TPositionObject* obj)
|
||||
* @note Address: 0x8021E774
|
||||
* @note Size: 0x1E0
|
||||
*/
|
||||
int Radar::Mgr::calcNearestTreasure(Vector3f& naviPos, f32 searchDist, Vector3f& treasurePos, f32& dist2)
|
||||
Radar::Mgr::RadarSearchResult Radar::Mgr::calcNearestTreasure(Vector3f& naviPos, f32 searchDist, Vector3f& treasurePos,
|
||||
f32& treasureDistance)
|
||||
{
|
||||
// If any antennae beetles are alive
|
||||
if (mFuefukiCount > 0) {
|
||||
if (mFuefukiTimer > 0) {
|
||||
mFuefukiTimer--;
|
||||
return 4; // Fuefuki active, but timer not expired
|
||||
if (mFuefukiWhistleTimer > 0) {
|
||||
mFuefukiWhistleTimer--;
|
||||
return Radar::Mgr::WHISTLE_ACTIVE; // Whistle is active, but timer not expired
|
||||
}
|
||||
|
||||
return 3; // Fuefuki active, timer expired
|
||||
return Radar::Mgr::WHISTLE_ACTIVE_TIMER_EXPIRED; // Whistle is active, timer expired
|
||||
}
|
||||
|
||||
Point* retPoint = nullptr;
|
||||
int ret = 0;
|
||||
f32 dist = searchDist;
|
||||
FOREACH_NODE(Point, mPointNode1.mChild, cPoint)
|
||||
Point* closestPoint = nullptr;
|
||||
int treasureCount = 0;
|
||||
f32 closestDistance = searchDist;
|
||||
FOREACH_NODE(Point, mActiveRadarNodes.mChild, cPoint)
|
||||
{
|
||||
// Skip if not a treasure
|
||||
if (cPoint->mObjType != MAP_TREASURE && cPoint->mObjType != MAP_SWALLOWED_TREASURE && cPoint->mObjType != MAP_UPGRADE) {
|
||||
continue; // Skip if not a treasure
|
||||
continue;
|
||||
}
|
||||
|
||||
ret++;
|
||||
Game::Creature* cObj = static_cast<Game::Pellet*>(cPoint->mObject);
|
||||
if (!cObj->isTeki()) {
|
||||
cObj->isPellet();
|
||||
treasureCount++;
|
||||
Game::Creature* creature = static_cast<Game::Pellet*>(cPoint->mObject);
|
||||
if (!creature->isTeki()) {
|
||||
creature->isPellet();
|
||||
}
|
||||
Vector3f objPos = cObj->getPosition();
|
||||
Sys::Sphere test;
|
||||
Vector2f diff = Vector2f(objPos.x, objPos.z);
|
||||
diff.x -= naviPos.x;
|
||||
diff.y -= naviPos.z;
|
||||
cObj->getBoundingSphere(test);
|
||||
|
||||
f32 cDist = _lenVec2D(diff) - test.mRadius;
|
||||
if (cDist <= dist) {
|
||||
dist = cDist;
|
||||
retPoint = cPoint;
|
||||
treasurePos = cObj->getPosition();
|
||||
dist2 = cDist;
|
||||
Vector3f objPos = creature->getPosition();
|
||||
|
||||
Sys::Sphere boundingSphere;
|
||||
Vector2f positionOffset = Vector2f(objPos.x, objPos.z);
|
||||
positionOffset.x -= naviPos.x;
|
||||
positionOffset.y -= naviPos.z;
|
||||
creature->getBoundingSphere(boundingSphere);
|
||||
|
||||
// Calculate the distance between the creature and the treasure
|
||||
f32 cDist = _lenVec2D(positionOffset) - boundingSphere.mRadius;
|
||||
if (cDist <= closestDistance) {
|
||||
closestDistance = cDist;
|
||||
closestPoint = cPoint;
|
||||
treasurePos = creature->getPosition();
|
||||
treasureDistance = cDist;
|
||||
}
|
||||
}
|
||||
|
||||
if (retPoint != nullptr) {
|
||||
return 2; // Found treasure
|
||||
if (closestPoint != nullptr) {
|
||||
return Radar::Mgr::CLOSEST_TREASURE_FOUND; // Found treasure
|
||||
}
|
||||
|
||||
return ret > 0; // No treasure found
|
||||
return treasureCount > 0 ? Radar::Mgr::TREASURE_FOUND : Radar::Mgr::NO_TREASURE_FOUND;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1057,27 +1057,31 @@ void SingleGameSection::setDispMemberNavi(og::Screen::DataNavi& data, int naviID
|
||||
* @note Address: N/A
|
||||
* @note Size: 0x148
|
||||
*/
|
||||
int SingleGameSection::calcOtakaraLevel(f32& dist)
|
||||
Radar::Mgr::RadarSearchResult SingleGameSection::calcOtakaraLevel(f32& treasureDistance)
|
||||
{
|
||||
Navi* navi = naviMgr->getActiveNavi();
|
||||
|
||||
int otastate = 5;
|
||||
dist = 900.0f;
|
||||
Radar::Mgr::RadarSearchResult treasureSearchResult = Radar::Mgr::NOT_PROCESSED;
|
||||
treasureDistance = 900.0f;
|
||||
|
||||
if (navi) {
|
||||
Vector3f pos = navi->getPosition();
|
||||
Vector3f out;
|
||||
otastate = Radar::mgr->calcNearestTreasure(pos, 900.0f, out, dist);
|
||||
if (otastate == 2) {
|
||||
if (!(1.0f - (dist / 900.0f) < 0.0f)) {
|
||||
return otastate;
|
||||
Vector3f playerPosition = navi->getPosition();
|
||||
Vector3f treasurePosition;
|
||||
treasureSearchResult = Radar::mgr->calcNearestTreasure(playerPosition, 900.0f, treasurePosition, treasureDistance);
|
||||
|
||||
if (treasureSearchResult == Radar::Mgr::CLOSEST_TREASURE_FOUND) {
|
||||
// If the distance is within the range (0 - 900.0f)
|
||||
if (!(1.0f - (treasureDistance / 900.0f) < 0.0f)) {
|
||||
return treasureSearchResult; // Return 2
|
||||
} else {
|
||||
P2DEBUG("stuff");
|
||||
}
|
||||
} else if (otastate == 1) {
|
||||
} else if (treasureSearchResult == Radar::Mgr::TREASURE_FOUND) {
|
||||
rand();
|
||||
}
|
||||
}
|
||||
return otastate;
|
||||
|
||||
return treasureSearchResult;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1088,21 +1092,22 @@ void SingleGameSection::updateMainMapScreen()
|
||||
{
|
||||
og::Screen::DispMemberGround disp;
|
||||
|
||||
f32 dist;
|
||||
int otastate = calcOtakaraLevel(dist);
|
||||
f32 treasureDistance;
|
||||
Radar::Mgr::RadarSearchResult treasureSearchResult = calcOtakaraLevel(treasureDistance);
|
||||
|
||||
bool flag = false;
|
||||
disp.mTreasureDist = dist;
|
||||
disp.mRadarState = otastate;
|
||||
if (!mNeedTreasureCalc && otastate == 0 && Screen::gGame2DMgr->is_GameGround()) {
|
||||
disp.mTreasureDist = treasureDistance;
|
||||
disp.mRadarState = treasureSearchResult;
|
||||
if (!mNeedTreasureCalc && treasureSearchResult == Radar::Mgr::NO_TREASURE_FOUND && Screen::gGame2DMgr->is_GameGround()) {
|
||||
flag = true;
|
||||
mNeedTreasureCalc = true;
|
||||
}
|
||||
if (!mTreasureRadarActive && otastate == 0) {
|
||||
if (!mTreasureRadarActive && treasureSearchResult == Radar::Mgr::NO_TREASURE_FOUND) {
|
||||
mTreasureRadarActive = true;
|
||||
}
|
||||
|
||||
if (mTreasureRadarActive && otastate != 0 && otastate != 5) {
|
||||
if (mTreasureRadarActive && treasureSearchResult != Radar::Mgr::NO_TREASURE_FOUND
|
||||
&& treasureSearchResult != Radar::Mgr::NOT_PROCESSED) {
|
||||
mTreasureRadarActive = false;
|
||||
mNeedTreasureCalc = false;
|
||||
}
|
||||
|
@ -312,7 +312,7 @@ void ObjSMenuMap::initMapIcon(JKRArchive* arc)
|
||||
Radar::mgr->ogDummpyInit();
|
||||
}
|
||||
|
||||
FOREACH_NODE(Radar::Point, Radar::mgr->mPointNode1.mChild, cPoint)
|
||||
FOREACH_NODE(Radar::Point, Radar::mgr->mActiveRadarNodes.mChild, cPoint)
|
||||
{
|
||||
int objType = cPoint->mObjType;
|
||||
JUT_ASSERTLINE(569, objType >= 0 && objType < 22, "Radar type ERR!! (%d)\n", objType);
|
||||
|
Loading…
Reference in New Issue
Block a user