data/claims/pikmin.yamlPikmin (the projectPiki decompilation of USA Rev 1, projectPiki/pikmin)
Game: Pikmin.
Pikmin came out for the GameCube on October 26, 2001 in Japan and on December 2, 2001 in North America. pikmin/release
Value: 2001
WikidataWikidata ·Q1198484, publication date (P577), qualified place of publication (P291) Japan (Q17), platform (P400) GameCube (Q182172)+2001-10-26T00:00:00ZWikidata · Q1198484, publication date (P577), qualified place of publication (P291) United States (Q49), platform (P400) GameCube (Q182172)+2001-12-02T00:00:00ZWikidata gives day precision for both; the North American date carries one reference and the Japanese date none.
Cited by: Pikmin
projectPiki/pikmin is "A complete matching decompilation of Pikmin (GameCube, 2001)" that builds five releases; its configure.py builds USA Rev 1 (GPIE01_01) by default, and every file the atlas cites is marked Matching there. The repo holds "no game assets", and the game's tuning parameters are read at run time from disc files it doesn't include, so their code defaults can differ from the shipped values. pikmin/source-version
Value: GPIE01_01
Codepikmin: a decompilation of Pikmin (projectPiki/pikmin) ·README.MD#L14-L18A complete matching decompilation of Pikmin (GameCube, 2001).
…
- `GPIE01_01`: USA (Rev 1) - Default Versionpikmin: a decompilation of Pikmin (projectPiki/pikmin) · README.MD#L28Note: this repository contains **no game assets** - an existing copy of the game is required.pikmin: a decompilation of Pikmin (projectPiki/pikmin) · configure.py#L29-L37DEFAULT_VERSION = 5
…
"GPIE01_01", # USA Rev 1pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/gameflow.h#L596/// Constructs parameters - default values are overwritten on file read.pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/gameflow.cpp#L594load("parms/", "gamePrms.bin", 1);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pikiMgr.cpp#L81load("parms/", "pikiMgr.bin", 1);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pelletMgr.cpp#L1581load("parms/", "pelMgr.bin", 1);Checked by claude, 2026-10-25 — read the README's version list, configure.py's version table and the Matching marks of every cited file, the parameter block's constructor comment, and the load calls that read gamePrms.bin, pikiMgr.bin, and pelMgr.bin from parms/ at the pinned commitThe constructor comment is on GameFlow::Parms; the other parameter blocks cited here (PikiProp in PikiMgr.h, PelletConfig) are loaded the same way, by load("parms/", ...) from pikiMgr.bin and pelMgr.bin.
Cited by: Pikmin
The clock advances by the frame's real time (gsys->getFrameTime()), and a 24-hour game day lasts 60 × daySpeed × day_multiply real seconds: daySpeed (p00) comes from parms/gamePrms.bin, with a code default of 20 minutes that a decompilation comment gives as 27 in the file, and day_multiply comes from the stage file, 1 if it has none. Each day starts at startHour (t00, default 7.0) and ends when the time of day reaches endHour (t01, default 19.0), so the playable span is 12 ÷ 24 of a game day (computed): with day_multiply at 1, 10 real minutes at the code defaults and 13.5 at the comment's 27. The clock advances only while no reset is pending (gsys->resetPending()), no menu is open outside a cutscene, nothing is paused (mPauseAll), no window is over the screen (mIsUIOverlayActive), no cutscene plays, the section's update flags include UPDATE_WORLD_CLOCK, and the game isn't in the tutorial (isTutorial()). pikmin/day-clock
About: Pikmin Time of day
Value
{
"startHour": 7,
"endHour": 19,
"daySpeedDefaultMinutes": 20,
"daySpeedCommentMinutes": 27,
"playableMinutesAtDefault": 10,
"playableMinutesAtComment": 13.5
}include/gameflow.h#L599-L601, mStartHour(this, 7.0f, 0.0f, 0.0f, "t00", "startHour")
, mEndHour(this, 19.0f, 0.0f, 0.0f, "t01", "endHour")
, mRealMinutesPerGameDay(this, 20.0f, 0.0f, 0.0f, "p00", "daySpeed")pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/gameflow.h#L619Parm<f32> mRealMinutesPerGameDay; ///< _24, p00 - how many real-life minutes correspond to one (24-hr) in-game "day" - def: 27 mins.pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/gameflow.cpp#L594load("parms/", "gamePrms.bin", 1);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/gameflow.h#L737-L738gameflow.mWorldClock.mRealSecsPerGameDay = 60.0f * (gameflow.mTimeMultiplier * gameflow.mParameters->mRealMinutesPerGameDay());
gameflow.mWorldClock.mRealSecsPerGameHour = gameflow.mWorldClock.mRealSecsPerGameDay / gameflow.mWorldClock.mHoursInDay;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L2226-L2237gameflow.mTimeMultiplier = 1.0f;
…
} else if (stream->isToken("day_multiply")) {
sscanf(stream->getToken(true), "%f", &gameflow.mTimeMultiplier);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/gameflow.cpp#L204-L215mRealSecsIntoHour += gsys->getFrameTime() * playRate;
if (mRealSecsIntoHour >= mRealSecsPerGameHour) {
mRealSecsIntoHour -= mRealSecsPerGameHour;
mCurrentGameHour++;
…
mTimeOfDay = mCurrentGameHour + mRealSecsIntoHour / mRealSecsPerGameHour;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L2155-L2159if (!gsys->resetPending() && (!mActiveMenu || gameflow.mMoviePlayer->mIsActive)) {
if (!gameflow.mPauseAll && !gameflow.mIsUIOverlayActive) {
if (!gameflow.mMoviePlayer->mIsActive && (mUpdateFlags & UPDATE_WORLD_CLOCK) && !playerState->isTutorial()) {
…
gameflow.mWorldClock.update(1.0f);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/mapSelect.cpp#L286-L302// handle story mode world map screen if we've made a decision
…
enterCourse(stage);
…
gameflow.mWorldClock.setTime(gameflow.mParameters->mStartHour());pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L864-L870if (!gameflow.mIsDayEndActive && !gameflow.mMoviePlayer->mIsActive
&& gameflow.mWorldClock.mTimeOfDay >= gameflow.mParameters->mEndHour()) {
…
gameflow.mIsDayEndTriggered = TRUE;Checked by claude, 2026-10-22 — read GameFlow::Parms and its member comments, GameGenFlow::update, the gamePrms.bin load, WorldClock::update, the stage-file reader in createMapObjects, the story-mode map's setTime on entering a course, the clock gate in the section's draw, and the day-end trigger in RunningModeState::update at the pinned commit; the minutes are worked out from the code defaults and the comment's figureThe 27-minute figure is the annotators' comment on the field, not code; the comments on the lighting parameters beside it likewise give values (5:15am, 3pm) that differ from their code defaults, which reads as the file's values, but the atlas hasn't read gamePrms.bin. Whether any stage file sets day_multiply is data too.
Cited by: Pikmin, Time of day
When a day ends (GameCoreSection::cleanupDayEnd), outside challenge mode, the tutorial, and the game's ending (isEnding(): the 30th day, or all 30 ship parts), every Pikmin is killed and counted as left behind unless it is entering or leaving an Onion, or in its LookAt state, or following the captain (formation mode) in a state other than drowning, burning, swallowed, bubbled, dying, or flicked, or in free mode (FreeMode, in any state) within mSunsetSafetyRange (p60, "日没生き残り範囲", code default 200, read from parms/pikiMgr.bin) of an Onion or of the ship, measured by qdist2's ground-plane approximation (|dx| + |dz| − ½ min). Pikmin with mushroom heads die too. If any were left behind, the take-off cutscene plays its enemy-attack version. The survivors then all go into their color's Onion (exitDayEnd), and a Pikmin with no Onion of its color is killed. pikmin/sunset
About: Pikmin Time of day
Value
{
"safetyRangeDefault": 200
}src/plugPikiKando/gameCoreSection.cpp#L598-L618PRINT("STEP (2) : remove objects (teki/boss/pellet/free pikis)\n");
…
if (!playerState->isChallengeMode() && !playerState->isTutorial() && !playerState->isEnding()) {
…
if (piki->isKinoko()) {
…
piki->kill(false);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/gameCoreSection.cpp#L629-L676if (mode == PikiMode::FormationMode) {
if (state == PIKISTATE_Drown || state == PIKISTATE_Fired || state == PIKISTATE_Dead || state == PIKISTATE_Swallowed
|| state == PIKISTATE_Bubble || state == PIKISTATE_Dying || state == PIKISTATE_Flick || !piki->isAlive()) {
// do nothing
} else {
continue;
…
if (mode == PikiMode::ExitMode || mode == PikiMode::EnterMode) {
continue;
} else if (state == PIKISTATE_LookAt) {
continue;
…
…pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/PikiMgr.h#L112, mSunsetSafetyRange(this, 200.0f, 0.0f, 5000.0f, "p60", "日没生き残り範囲")pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pikiMgr.cpp#L81load("parms/", "pikiMgr.bin", 1);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/sysCommon/sysMath.cpp#L511-L517if (x1 > y1) {
min = y1;
} else {
min = x1;
}
…
return (x1 + y1) - (0.5f * min);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/playerState.cpp#L110-L118bool PlayerState::isEnding()
{
if (getCurrDay() >= (MAX_DAYS - 1)) {
// we've hit our 30-day limit
return true;
…
} else if (getCurrParts() >= MAX_UFO_PARTS) {pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L1507-L1512if (dayEndObjFlags == 0) {
// no dead pikmin! use correct (frustrated/neutral) animation
dayEndObjFlags |= CAF_DayEndEnemyNoDeaths;
} else {
// dead pikmin :( use killing animation
dayEndObjFlags |= CAF_DayEndEnemyAttack;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/gameCoreSection.cpp#L362-L369if (piki->isAlive()) {
GoalItem* item = itemMgr->getContainer(piki->mColor);
if (item) {
item->enterGoal(piki);
entered++;
} else {
piki->kill(false);Checked by claude, 2026-10-22 — read cleanupDayEnd's step 2, the p60 parameter and the pikiMgr.bin load, qdist2, PlayerState::isEnding and getCurrDay (mCurrentDay − 1), the take-off cutscene's flags in DayOverModeState, and exitDayEnd at the pinned commit"日没生き残り範囲" reads "sunset survival range". cleanupDayEnd first calls enterFreePikmins, which sends free Pikmin in their normal state within the same range into an Onion; the step quoted then spares them as entering. The comments quoted from newPikiGame.cpp are the annotators'.
Cited by: Pikmin, Time of day
The game allows MAX_DAYS = 30 days, counted by mCurrentDay (getCurrDay() returns it minus 1). At the end of a day with all 30 ship parts (MAX_UFO_PARTS) the good ending plays. Otherwise, a day count below 30 goes up by 1 with the end-of-day results, and once it has reached 30, the ending is the neutral one if the player holds at least MIN_HAPPY_END_PARTS = 25 parts, counted without five named parts (the Nova Blaster, Space Float, Massage Machine, Secret Safe, and UV Lamp), and the bad one if not. Computed: of 30 parts with 5 not counted, 25 means every one of the other 25. pikmin/day-limit
Value
{
"days": 30,
"parts": 30,
"partsForNeutralEnding": 25,
"optionalParts": 5
}include/GlobalGameOptions.h#L9-L13#define MAX_UFO_PARTS (30)
…
#define MAX_DAYS (30)
…
#define MIN_HAPPY_END_PARTS (25) // NB: also need to edit the hard-coded IDs in PlayerState::getUfoPartspikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L1565-L1569if (playerState->getCurrParts() == MAX_UFO_PARTS) {
// we collected all the parts! play the good ending take off :)
gameflow.mMoviePlayer->startMovie(DEMOID_GoodEndingTakeOff, 0, nullptr, nullptr, nullptr, CAF_AllVisibleMask, true);
…
} else if (gameflow.mWorldClock.mCurrentDay < MAX_DAYS) {pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L1586-L1587// advance the day and handle the end-of-day results entries
gameflow.mWorldClock.mCurrentDay++;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiColin/newPikiGame.cpp#L1624-L1631// we've hit max days, and haven't collected 30 parts :(
if (playerState->happyEndable()) {
…
flowCont.mEndingType = ENDING_Neutral;
gameflow.mMoviePlayer->startMovie(DEMOID_NeutralEndingLeaveOK, 0, nullptr, nullptr, nullptr, CAF_AllVisibleMask, true);
} else {
…
gameflow.mMoviePlayer->startMovie(DEMOID_BadEndingFailEscape, 0, nullptr, nullptr, nullptr, CAF_AllVisibleMask, true);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/playerState.cpp#L273-L275bool PlayerState::happyEndable()
{
return mRequiredUfoPartCount >= MIN_HAPPY_END_PARTS;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/playerState.cpp#L1090-L1092if (partID != UFOID_NovaBlaster && partID != UFOID_SpaceFloat && partID != UFOID_MassageMachine && partID != UFOID_SecretSafe
&& partID != UFOID_UVLamp) {
mRequiredUfoPartCount++;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/playerState.cpp#L778-L780int PlayerState::getCurrDay()
{
return gameflow.mWorldClock.mCurrentDay - 1;Checked by claude, 2026-10-22 — read the limits in GlobalGameOptions.h, DayOverModeState::initialisePhaseTwo's branches on the part count and the day count, its max-days branch that picks the neutral or bad movie, happyEndable, the required-part count in getUfoParts, and getCurrDay at the pinned commitThe part names are the decompilation's UFOID_ enum names. The comments quoted from newPikiGame.cpp are the annotators'.
A buried sprout (PikiHeadItem) waits mGrowUpTime (p51, "growupTime(秒)") plus 0 to 2 seconds at random, then plays its growth animation and moves one stage, leaf to bud or bud to flower ((mFlowerStage + 1) % 3). A flower waits mWiltTime (p52, "kareTime(秒)") plus 0 to 2 seconds, then wilts: it becomes a leaf, and after mRebirthSeedTime (p53) plus 0 to 2 seconds it goes back to the buried state. The three times are read from parms/pikiMgr.bin; their code defaults are 4, 4, and 1 seconds. A plucked Pikmin keeps its sprout's stage. pikmin/sprout-growth
About: Pikmin Unit growth
Value
{
"growUpTimeDefault": 4,
"wiltTimeDefault": 4,
"rebirthTimeDefault": 1,
"randomExtra": [
0,
2
]
}src/plugPikiKando/itemAI.cpp#L305-L313void PikiHeadAI::WaitInit::act(AICreature* item)
…
if (obj->mFlowerStage == Flower) {
item->mSAICtx.mCurrentItemHealth = pikiMgr->mPikiParms->mPikiParms.mWiltTime() + gsys->getRand(1.0f) * 2.0f;
} else {
item->mSAICtx.mCurrentItemHealth = pikiMgr->mPikiParms->mPikiParms.mGrowUpTime() + gsys->getRand(1.0f) * 2.0f;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L326-L332f32& health = item->mSAICtx.mCurrentItemHealth;
health -= gsys->getFrameTime();
if (health < 0.0f) {
if (obj->mFlowerStage == Flower) {
item->mSAICtx.mStateMachine->transit(item, PIKIHEAD_Unk10);
} else {
item->mSAICtx.mStateMachine->transit(item, PIKIHEAD_Unk7);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L163-L175addState(PIKIHEAD_Unk7, PikiHeadMotion::UgGrow);
addState(PIKIHEAD_Growuped, PANI_NO_MOTION, new GrowupedExec);
…
addState(PIKIHEAD_Unk10, PikiHeadMotion::Sioreru);
addState(PIKIHEAD_Kareta, PANI_NO_MOTION, new KaretaInit, new KaretaExec);
…
addArrow(PIKIHEAD_Unk7, saiMotionAction0Event, PIKIHEAD_Growuped);
addArrow(PIKIHEAD_Growuped, saiMotionDoneEvent, PIKIHEAD_Wait);
addArrow(PIKIHEAD_Unk10, saiMotionDoneEvent, PIKIHEAD_Kareta);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L349obj->mFlowerStage = (obj->mFlowerStage + 1) % 3;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L381-L393item->mSAICtx.mCurrentItemHealth = pikiMgr->mPikiParms->mPikiParms.mRebirthSeedTime() + 2.0f * gsys->getRand(1.0f);
obj->mFlowerStage = Leaf;
…
item->mSAICtx.mStateMachine->transit(item, PIKIHEAD_Bury);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/PikiMgr.h#L101-L103, mGrowUpTime(this, 4.0f, 0.0f, 300.0f, "p51", "growupTime(秒)")
, mWiltTime(this, 4.0f, 0.0f, 300.0f, "p52", "kareTime(秒)")
, mRebirthSeedTime(this, 1.0f, 0.0f, 300.0f, "p53", "rebirthTime(秒)")pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/GlobalGameOptions.h#L66-L69enum PikiHappa {
Leaf = 0,
Bud = 1,
Flower = 2,pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/naviState.cpp#L2581piki->setFlower(navi->mSproutToPluck->mFlowerStage);Checked by claude, 2026-10-22 — read PikiHeadAI's state table, WaitInit, WaitExec, GrowupedExec, KaretaInit, and KaretaExec, the PikiProp timings, and the pluck in naviState.cpp at the pinned commit; gsys->getRand(1.0f) is rand() / RAND_MAX (system.h), so the extra is 0 to 2 seconds"秒" means seconds, and "kare" is Japanese for withering. The state names PIKIHEAD_Unk7 and PIKIHEAD_Unk10 are unnamed in the decompilation; the atlas reads them as the growth and wilting animations from their motions (UgGrow, Sioreru, "wilt"). The code defaults of a few seconds are almost certainly not the shipped values, which are in pikiMgr.bin.
Cited by: Pikmin, Unit growth
A Pikmin that isn't yet a flower drinks when it touches a nectar puddle in its normal state, unless it is damaged, carrying (transport mode), or mushroom-headed; the puddle is an OBJTYPE_Water object, which a decompilation comment calls nectar. If it drank, its growth animation makes it a flower (setFlower(Flower)) at once, from leaf or bud. pikmin/nectar
About: Pikmin Unit growth
Codepikmin: a decompilation of Pikmin (projectPiki/pikmin) ·src/plugPikiKando/pikiState.cpp#L407-L420if (!piki->isKinoko()) {
…
if (!piki->isDamaged() && piki->mMode != PikiMode::TransportMode) {
…
case OBJTYPE_Water:
{
// Nectar puddles are modeled as water; non-flower Pikmin can drink to grow.
if (piki->mHappa != Flower) {
piki->changeMode(PikiMode::FreeMode, piki->mNavi);
piki->mCurrNectar = collider;
transit(piki, PIKISTATE_Absorb);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pikiState.cpp#L516-L517if (mHasAbsorbedNectar) {
transit(piki, PIKISTATE_GrowUp);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pikiState.cpp#L2402-L2406case KEY_Action0:
{
piki->mFloweringTimer++;
seSystem->playPikiSound(SEF_PIKI_GROW4, piki->mSRT.t);
piki->setFlower(Flower);Checked by claude, 2026-10-22 — read PikiNormalState::procCollideMsg, PikiAbsorbState::procAnimMsg, and PikiGrowupState::procAnimMsg at the pinned commitThe handler is the normal state's (PikiNormalState). The nectar comment and the state's mHasAbsorbedNectar name are the annotators'; the touch also plays SE_PLAYER_TOUCHHONEY when the captain walks into the same object (WaterAI::CollideChar, itemAI.cpp).
Cited by: Pikmin, Unit growth
When a pellet or an enemy body (both Pellets with a config from parms/pelMgr.bin) finishes being drawn into an Onion, GoalItem::suckMe adds the config's mMatchingOnyonSeeds (p06) to the Onion's pending count if the config's type (p00) equals the Onion's color, and mNonMatchingOnyonSeeds (p07) otherwise; the code defaults are 1 and 1, and a negative value sets off fireworks instead. The Onion then fires one sprout of its own color per pending count, which lands and buries itself as a leaf; when no sprout object can be created, it stores a leaf Pikmin inside instead. Ship parts take the ship's path, not this one. In the decompilation's enum the type for bodies, PELTYPE_Corpse, is 0, the same value as PELTYPE_Blue, which the comparison would read as a blue match; the shipped configs' p00 values are data. pikmin/onion-seeds
About: Pikmin Resource harvesting
Value
{
"matchingDefault": 1,
"nonMatchingDefault": 1
}src/plugPikiKando/goalItem.cpp#L344-L365void GoalItem::suckMe(Pellet* item)
{
PelletConfig* config = item->mConfig;
int pikiNum;
if (mOnionColour == config->mPelletType()) {
pikiNum = config->mMatchingOnyonSeeds();
} else {
pikiNum = config->mNonMatchingOnyonSeeds();
}
…
if (pikiNum < 0) {
mSAICtx.mCounter += 2;
…pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pelletMgr.cpp#L110-L119, mPelletType(this, PELTYPE_Blue, 0, 0, "p00", "type(0-2:pel 3:ufo)")
…
, mMatchingOnyonSeeds(this, 1, 0, 0, "p06", "intParm1")
, mNonMatchingOnyonSeeds(this, 1, 0, 0, "p07", "intParm2")pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pelletMgr.cpp#L1581load("parms/", "pelMgr.bin", 1);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pelletState.cpp#L346-L350if (mSuckProgress >= 1.0f) {
if (pelt->mConfig->mPelletType() == PELTYPE_UfoPart) {
pelt->mTargetGoal->finishSuck(pelt);
} else {
pelt->mTargetGoal->suckMe(pelt);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L853-L886if (item->mSAICtx.mCurrAnimId > 0) {
…
PikiHeadItem* seed = static_cast<PikiHeadItem*>(itemMgr->birth(OBJTYPE_Pikihead));
…
seed->setColor(obj->mOnionColour);
…
C_SAI(seed)->start(seed, PikiHeadAI::PIKIHEAD_Flying);
} else {
pikiInfMgr.incPiki(obj->mOnionColour, Leaf);
obj->mHeldPikis[Leaf]++;
…
obj->mSAICtx.mCurrAnimId--;pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/itemAI.cpp#L170-L171addArrow(PIKIHEAD_Flying, saiBounceEvent, PIKIHEAD_Bounce);
addArrow(PIKIHEAD_Bounce, saiMotionDoneEvent, PIKIHEAD_Bury);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/pelletMgr.cpp#L147-L154void PelletView::becomePellet(u32 id, Vector3f NRef pos, f32 direction)
…
Pellet* pellet = pelletMgr->newPellet(id, this);pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/Pellet.h#L37-L44enum PelletType {
// Easier to label this separate, these will also have PelletColor as -1
PELTYPE_Corpse = 0,
…
// Blue, Red, Yellow pellets
PELTYPE_Blue = 0,
PELTYPE_Red = 1,
PELTYPE_Yellow = 2,pikmin: a decompilation of Pikmin (projectPiki/pikmin) · include/GlobalGameOptions.h#L52-L55enum PikiColor {
Blue = 0,
Red = 1,
Yellow = 2,Checked by claude, 2026-10-22 — read GoalItem::suckMe, PelletConfig's constructor and the pelMgr.bin load, PelletGoalState::exec's suck-in branch, the Onion's emit loop in itemAI.cpp, the sprout's flight-to-burial arrows, PelletView::becomePellet, and the PelletType and PikiColor enums at the pinned commitmCurrAnimId is the decompilation's name for a field the Onion uses as its pending-sprout count here; the emit loop has no function name of its own in the quoted lines (it sits in a GoalAI action). The pellet's sprout count also differs by its own color config (p09), which suckMe doesn't read. The corpse value is the annotators' enum, with their comment that bodies also have color −1; whether bodies' configs give different p06 and p07 is data the atlas hasn't read. A body becomes a Pellet through becomePellet, which enemy code calls.
Cited by: Pikmin, Resource harvesting
Fire (InteractFire) sets a live Pikmin burning (startFire) unless it is red. A bubble attack (InteractBubble) puts a live Pikmin in its bubble state unless it is blue, or already bubbled, dying, or dead. A Pikmin that lands on a water surface, or rides an object standing on water within 10 units of its height, starts drowning unless it is blue, its mInWaterTimer isn't 0 (it has already touched water), or it is dying, dead, pressed (PIKISTATE_Pressed), or hanging over water (PIKISTATE_WaterHanged). Yellow Pikmin get no exemption in these three checks. pikmin/hazard-immunity
src/plugPikiKando/interactBattle.cpp#L168-L199if (!piki->isAlive()) {
return false;
…
if (state == PIKISTATE_Dying || state == PIKISTATE_Dead || state == PIKISTATE_Bubble) {
return false;
…
// blue pikmin are immune to bubble
if (piki->mColor != Blue) {
piki->changeMode(0, piki->mNavi);
piki->mFSM->transit(piki, PIKISTATE_Bubble);
…
// red pikmin are immune to fire
…pikmin: a decompilation of Pikmin (projectPiki/pikmin) · src/plugPikiKando/piki.cpp#L1790-L1812if (attr == ATTR_Water && mInWaterTimer == 0 && mColor != Blue) {
isDrownSurface = true;
} else if (isStickTo() && mInWaterTimer == 0 && mColor != Blue) {
…
if (absF(obj->mSRT.t.y - mSRT.t.y) < 10.0f) {
…
if (isDrownSurface && isAlive() && state != PIKISTATE_Dead && state != PIKISTATE_Dying && state != PIKISTATE_Pressed
&& state != PIKISTATE_WaterHanged) {
…
mFSM->transit(this, PIKISTATE_Drown);
…
mInWaterTimer = 1;Checked by claude, 2026-10-22 — read InteractBubble::actPiki and InteractFire::actPiki, and the water check in Piki::bounceCallback at the pinned commitThe two "immune" lines are the annotators' comments; the code is the color test under each. A burning or bubbled Pikmin's survival timer is mPanicTime (p55, "火に包まれて死ぬまでの時間", "time until death when engulfed in flames"; code default 3 seconds) times 1 to 1.1 (pikiState.cpp, PikiBubbleState::init and PikiFiredState::init), but where the burning flag becomes the burning state wasn't traced.
Cited by: Pikmin