Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //here we go again...
- //#ifdef NONMATCHING
- void atk23_getexp(void)
- {
- u8 hold_effect;
- int via_expshare = 0, sent_in;
- int via_sent_in;
- u16* exp = &BATTLE_STRUCT->exp;
- gBank1 = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
- sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1];
- switch (BATTLE_STRUCT->atk23StateTracker)
- {
- case 0: //check if should receive exp at all
- if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)))
- BATTLE_STRUCT->atk23StateTracker = 6; //goto last case
- else
- {
- BATTLE_STRUCT->atk23StateTracker++;
- unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]];
- }
- break;
- case 1: //calculate experience points to redistribute
- {
- int i;
- u16 calculatedExp;
- via_sent_in = 0;
- for (i = 0; i < 6; i++)
- {
- u16 item;
- if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
- continue;
- if (gBitTable[i] & sent_in)
- via_sent_in++;
- item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
- if (item == ITEM_ENIGMA_BERRY)
- hold_effect = gSaveBlock1.enigmaBerry.holdEffect;
- else
- hold_effect = ItemId_GetHoldEffect(item);
- if (hold_effect == HOLD_EFFECT_EXP_SHARE)
- via_expshare++;
- }
- calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
- if (via_expshare) //at least one poke is getting exp via exp share
- {
- calculatedExp /= 2;
- *exp = calculatedExp / via_sent_in;
- ATLEAST_ONE_PTR(exp);
- gExpShareExp = calculatedExp / via_expshare;
- ATLEAST_ONE_PTR(&gExpShareExp);
- }
- else
- {
- *exp = calculatedExp / via_sent_in;
- ATLEAST_ONE_PTR(exp);
- gExpShareExp = 0;
- }
- BATTLE_STRUCT->atk23StateTracker++;
- BATTLE_STRUCT->expGetterID = 0;
- BATTLE_STRUCT->sentInPokes = sent_in;
- } //no break statement
- case 2: //loop; set exp value to the poke in expgetter_id and print message
- if (gBattleExecBuffer == 0)
- {
- u16 item = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HELD_ITEM);
- u8* tracker; u32 zero;
- if (item == ITEM_ENIGMA_BERRY)
- hold_effect = gSaveBlock1.enigmaBerry.holdEffect;
- else
- hold_effect = ItemId_GetHoldEffect(item);
- if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1)))
- {
- BATTLE_STRUCT->sentInPokes >>= 1;
- tracker = &BATTLE_STRUCT->atk23StateTracker;
- zero = 0;
- goto LABEL;
- }
- else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100)
- {
- BATTLE_STRUCT->sentInPokes >>= 1;
- tracker = &BATTLE_STRUCT->atk23StateTracker;
- zero = 0;
- LABEL:
- *tracker = 5; //increment looper
- gBattleMoveDamage = zero; //used for exp
- }
- else
- {
- //music change in wild battle after fainting a poke
- if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !BATTLE_STRUCT->wildVictorySong)
- {
- BattleMusicStop();
- PlayBGM(0x161);
- BATTLE_STRUCT->wildVictorySong++;
- }
- if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP))
- {
- s32 stringID;
- if (BATTLE_STRUCT->sentInPokes & 1)
- gBattleMoveDamage = *exp;
- else
- gBattleMoveDamage = 0;
- //get exp getter bank
- if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
- {
- if (!(gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) && !(gAbsentBankFlags & gBitTable[2]))
- BATTLE_STRUCT->expGetterBank = 2;
- else
- {
- if (!(gAbsentBankFlags & gBitTable[0]))
- BATTLE_STRUCT->expGetterBank = 0;
- else
- BATTLE_STRUCT->expGetterBank = 2;
- }
- }
- else
- BATTLE_STRUCT->expGetterBank = 0;
- if(CheckSpeedchoiceOption(BWEXP, ON) == TRUE)
- {
- u32 upperRatio;
- u32 lowerRatio;
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
- // step 2, calculate ratio
- upperRatio = ((gBattleMons[gBank1].level * 2) + 10);
- upperRatio *= upperRatio * Sqrt(upperRatio);
- lowerRatio = (gBattleMons[gBank1].level + gPlayerParty[BATTLE_STRUCT->expGetterID].level + 10);
- lowerRatio *= lowerRatio * Sqrt(lowerRatio);
- // step 3, calculate ratio product and multiply rest.
- gBattleMoveDamage = max(gBattleMoveDamage, gBattleMoveDamage * upperRatio / lowerRatio) + 1;
- if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID]))
- {
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
- stringID = 0x14A;
- }
- else
- stringID = 0x149;
- if (hold_effect == HOLD_EFFECT_LUCKY_EGG)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
- if (hold_effect == HOLD_EFFECT_EXP_SHARE)
- gBattleMoveDamage += gExpShareExp;
- }
- else // normal handling
- {
- if (hold_effect == HOLD_EFFECT_EXP_SHARE)
- gBattleMoveDamage += gExpShareExp;
- if (hold_effect == HOLD_EFFECT_LUCKY_EGG)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID]))
- {
- gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
- stringID = 0x14A;
- }
- else
- stringID = 0x149;
- }
- // i don't even care that this is a walle303 solution. I am NOT updating the randomizer for the 11th bajillion time.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
- //buffer poke name
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 4;
- gBattleTextBuff1[2] = BATTLE_STRUCT->expGetterBank;
- gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID;
- gBattleTextBuff1[4] = 0xFF;
- //buffer 'gained' or 'gained a boosted'
- gBattleTextBuff2[0] = 0xFD;
- gBattleTextBuff2[1] = 0;
- gBattleTextBuff2[2] = stringID;
- gBattleTextBuff2[3] = (stringID & (0xFF00)) >> 8;
- gBattleTextBuff2[4] = 0xFF;
- //buffer exp number
- gBattleTextBuff3[0] = 0xFD;
- gBattleTextBuff3[1] = 1;
- gBattleTextBuff3[2] = 4; //word
- gBattleTextBuff3[3] = 5; //max digits
- gBattleTextBuff3[4] = gBattleMoveDamage;
- gBattleTextBuff3[5] = (gBattleMoveDamage & 0x00FF00) >> 8;
- gBattleTextBuff3[6] = (gBattleMoveDamage & 0xFF0000) >> 0x10;
- gBattleTextBuff3[7] = gBattleMoveDamage >> 0x18;
- gBattleTextBuff3[8] = 0xFF;
- PrepareStringBattle(0xD, BATTLE_STRUCT->expGetterBank);
- MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species);
- }
- BATTLE_STRUCT->sentInPokes >>= 1;
- BATTLE_STRUCT->atk23StateTracker++;
- }
- }
- break;
- case 3: //Set Stats and give exp
- if (gBattleExecBuffer == 0)
- {
- BattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0;
- if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100)
- {
- BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match
- BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
- BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
- BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
- BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
- BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF);
- gActiveBank = BATTLE_STRUCT->expGetterBank;
- EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage);
- MarkBufferBankForExecution(gActiveBank);
- }
- BATTLE_STRUCT->atk23StateTracker++;
- }
- break;
- case 4: //lvl up if necessary
- if (gBattleExecBuffer == 0)
- {
- gActiveBank = BATTLE_STRUCT->expGetterBank;
- if (BattleBufferB[gActiveBank][0] == 0x21 && BattleBufferB[gActiveBank][1] == 0xB)
- {
- if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID)
- sub_80324F8(&gPlayerParty[gActiveBank], gActiveBank);
- //buff poke name
- gBattleTextBuff1[0] = 0xFD;
- gBattleTextBuff1[1] = 4;
- gBattleTextBuff1[2] = gActiveBank;
- gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID;
- gBattleTextBuff1[4] = 0xFF;
- //buff level
- gBattleTextBuff2[0] = 0xFD;
- gBattleTextBuff2[1] = 1;
- gBattleTextBuff2[2] = 1;
- gBattleTextBuff2[3] = 3;
- gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
- gBattleTextBuff2[5] = 0xFF;
- b_movescr_stack_push_cursor();
- gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID];
- gBattlescriptCurrInstr = BattleScript_LevelUp;
- gBattleMoveDamage = (BattleBufferB[gActiveBank][2] | (BattleBufferB[gActiveBank][3] << 8));
- AdjustFriendship(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0);
- //update battle mon structure after level up
- if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && gBattleMons[0].hp)
- {
- gBattleMons[0].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
- gBattleMons[0].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP);
- gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP);
- gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
- gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
- gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
- gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
- gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF);
- }
- //What is else if? Guess it's too advanced for GameFreak
- if (gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
- {
- gBattleMons[2].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
- gBattleMons[2].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP);
- gBattleMons[2].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP);
- gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
- gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
- //There are no words...GF can't even copy&paste code properly
- gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
- gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD /*RIP*/);
- gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
- }
- BATTLE_STRUCT->atk23StateTracker = 5;
- }
- else
- {
- gBattleMoveDamage = 0;
- BATTLE_STRUCT->atk23StateTracker = 5;
- }
- }
- break;
- case 5: //looper increment
- if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp
- BATTLE_STRUCT->atk23StateTracker = 3;
- else
- {
- if (++BATTLE_STRUCT->expGetterID <= 5)
- BATTLE_STRUCT->atk23StateTracker = 2; //loop again
- else
- BATTLE_STRUCT->atk23StateTracker = 6; //we're done
- }
- break;
- case 6: //increment instruction
- if (gBattleExecBuffer == 0)
- {
- //not even sure why gamefreak clears that data in this place
- gBattleMons[gBank1].item = 0;
- gBattleMons[gBank1].ability = 0;
- gBattlescriptCurrInstr += 2;
- }
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement