Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void atk23_getexp(void)
- {
- u16 item;
- s32 i; // also used as stringId
- u8 holdEffect;
- s32 sentIn;
- s32 viaExpShare = 0;
- u16* exp = &gBattleStruct->exp;
- gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]);
- sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1];
- switch (gBattleStruct->getexpStateTracker)
- {
- case 0: // check if should receive exp at all
- if (GetBattlerSide(gBank1) != B_SIDE_OPPONENT || (gBattleTypeFlags &
- (BATTLE_TYPE_LINK
- | BATTLE_TYPE_SAFARI
- | BATTLE_TYPE_BATTLE_TOWER
- | BATTLE_TYPE_EREADER_TRAINER)))
- {
- gBattleStruct->getexpStateTracker = 6; // goto last case
- }
- else
- {
- gBattleStruct->getexpStateTracker++;
- gBattleStruct->unk16113 |= gBitTable[gBattlerPartyIndexes[gBank1]];
- }
- break;
- case 1: // calculate experience points to redistribute
- {
- u16 calculatedExp;
- s32 viaSentIn;
- for (viaSentIn = 0, i = 0; i < 6; i++)
- {
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
- continue;
- if (gBitTable[i] & sentIn)
- viaSentIn++;
- item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
- if (item == ITEM_ENIGMA_BERRY)
- holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
- else
- holdEffect = ItemId_GetHoldEffect(item);
- if (holdEffect == HOLD_EFFECT_EXP_SHARE)
- viaExpShare++;
- }
- calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
- if (viaExpShare) // at least one mon is getting exp via exp share
- {
- *exp = calculatedExp / 2 / viaSentIn;
- if (*exp == 0)
- *exp = 1;
- gExpShareExp = calculatedExp / 2 / viaExpShare;
- if (gExpShareExp == 0)
- gExpShareExp = 1;
- }
- else
- {
- *exp = calculatedExp / viaSentIn;
- if (*exp == 0)
- *exp = 1;
- gExpShareExp = 0;
- }
- gBattleStruct->getexpStateTracker++;
- gBattleStruct->expGetterID = 0;
- gBattleStruct->sentInPokes = sentIn;
- }
- // fall through
- case 2: // set exp value to the poke in expgetter_id and print message
- if (gBattleExecBuffer == 0)
- {
- item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM);
- if (item == ITEM_ENIGMA_BERRY)
- holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
- else
- holdEffect = ItemId_GetHoldEffect(item);
- if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1))
- {
- gBattleStruct->sentInPokes >>= 1;
- gBattleStruct->getexpStateTracker = 5;
- gBattleMoveDamage = 0; // used for exp
- }
- else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100)
- {
- gBattleStruct->sentInPokes >>= 1;
- gBattleStruct->getexpStateTracker = 5;
- gBattleMoveDamage = 0; // used for exp
- }
- else
- {
- // music change in wild battle after fainting a poke
- if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong)
- {
- BattleStopLowHpSound();
- PlayBGM(0x161);
- gBattleStruct->wildVictorySong++;
- }
- if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP))
- {
- if (gBattleStruct->sentInPokes & 1)
- gBattleMoveDamage = *exp;
- else
- gBattleMoveDamage = 0;
- if (holdEffect == HOLD_EFFECT_EXP_SHARE)
- gBattleMoveDamage += gExpShareExp;
- if (holdEffect == HOLD_EFFECT_LUCKY_EGG)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID]))
- {
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- i = 0x14A;
- }
- else
- {
- i = 0x149;
- }
- // get exp getter bank
- if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- {
- if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) && !(gAbsentBattlerFlags & gBitTable[2]))
- gBattleStruct->expGetterBank = 2;
- else
- {
- if (!(gAbsentBattlerFlags & gBitTable[0]))
- gBattleStruct->expGetterBank = 0;
- else
- gBattleStruct->expGetterBank = 2;
- }
- }
- else
- gBattleStruct->expGetterBank = 0;
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID)
- // buffer 'gained' or 'gained a boosted'
- PREPARE_STRING_BUFFER(gBattleTextBuff2, i)
- PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage)
- PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank);
- MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species);
- }
- gBattleStruct->sentInPokes >>= 1;
- gBattleStruct->getexpStateTracker++;
- }
- }
- break;
- case 3: // Set stats and give exp
- if (gBattleExecBuffer == 0)
- {
- gBattleBufferB[gBattleStruct->expGetterBank][0] = 0;
- if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100)
- {
- gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
- gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
- gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
- gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
- gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
- gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
- gActiveBattler = gBattleStruct->expGetterBank;
- EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage);
- MarkBufferBankForExecution(gActiveBattler);
- }
- gBattleStruct->getexpStateTracker++;
- }
- break;
- case 4: // lvl up if necessary
- if (gBattleExecBuffer == 0)
- {
- gActiveBattler = gBattleStruct->expGetterBank;
- if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES
- && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP)
- {
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID)
- HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
- PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterID)
- PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL))
- BattleScriptPushCursor();
- gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID];
- gBattlescriptCurrInstr = BattleScript_LevelUp;
- gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
- AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL);
- // update battle mon structure after level up
- if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp)
- {
- gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
- gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
- gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
- gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
- gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
- // Why is this duplicated?
- gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
- gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
- gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
- gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
- }
- // What is else if?
- if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- {
- gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
- gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
- gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
- gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
- gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
- // Duplicated again, but this time there's no Sp Defense
- gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
- gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
- gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
- }
- }
- else
- {
- gBattleMoveDamage = 0;
- }
- gBattleStruct->getexpStateTracker = 5;
- }
- break;
- case 5: // looper increment
- if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp
- gBattleStruct->getexpStateTracker = 3;
- else
- {
- gBattleStruct->expGetterID++;
- if (gBattleStruct->expGetterID <= 5)
- gBattleStruct->getexpStateTracker = 2; // loop again
- else
- gBattleStruct->getexpStateTracker = 6; // we're done
- }
- break;
- case 6: // increment instruction
- if (gBattleExecBuffer == 0)
- {
- // not sure why gf clears the item and ability here
- gBattleMons[gBank1].item = 0;
- gBattleMons[gBank1].ability = 0;
- gBattlescriptCurrInstr += 2;
- }
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement