Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2018
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.33 KB | None | 0 0
  1. static void atk23_getexp(void)
  2. {
  3.     u16 item;
  4.     s32 i; // also used as stringId
  5.     u8 holdEffect;
  6.     s32 sentIn;
  7.  
  8.     s32 viaExpShare = 0;
  9.     u16* exp = &gBattleStruct->exp;
  10.  
  11.     gBank1 = GetBattleBank(gBattlescriptCurrInstr[1]);
  12.     sentIn = gSentPokesToOpponent[(gBank1 & 2) >> 1];
  13.  
  14.     switch (gBattleStruct->getexpStateTracker)
  15.     {
  16.     case 0: // check if should receive exp at all
  17.         if (GetBattlerSide(gBank1) != B_SIDE_OPPONENT || (gBattleTypeFlags &
  18.              (BATTLE_TYPE_LINK
  19.               | BATTLE_TYPE_SAFARI
  20.               | BATTLE_TYPE_BATTLE_TOWER
  21.               | BATTLE_TYPE_EREADER_TRAINER)))
  22.         {
  23.             gBattleStruct->getexpStateTracker = 6; // goto last case
  24.         }
  25.         else
  26.         {
  27.             gBattleStruct->getexpStateTracker++;
  28.             gBattleStruct->unk16113 |= gBitTable[gBattlerPartyIndexes[gBank1]];
  29.         }
  30.         break;
  31.     case 1: // calculate experience points to redistribute
  32.         {
  33.             u16 calculatedExp;
  34.             s32 viaSentIn;
  35.  
  36.             for (viaSentIn = 0, i = 0; i < 6; i++)
  37.             {
  38.                 if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
  39.                     continue;
  40.                 if (gBitTable[i] & sentIn)
  41.                     viaSentIn++;
  42.  
  43.                 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
  44.  
  45.                 if (item == ITEM_ENIGMA_BERRY)
  46.                     holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
  47.                 else
  48.                     holdEffect = ItemId_GetHoldEffect(item);
  49.  
  50.                 if (holdEffect == HOLD_EFFECT_EXP_SHARE)
  51.                     viaExpShare++;
  52.             }
  53.  
  54.             calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
  55.  
  56.             if (viaExpShare) // at least one mon is getting exp via exp share
  57.             {
  58.                 *exp = calculatedExp / 2 / viaSentIn;
  59.                 if (*exp == 0)
  60.                     *exp = 1;
  61.  
  62.                 gExpShareExp = calculatedExp / 2 / viaExpShare;
  63.                 if (gExpShareExp == 0)
  64.                     gExpShareExp = 1;
  65.             }
  66.             else
  67.             {
  68.                 *exp = calculatedExp / viaSentIn;
  69.                 if (*exp == 0)
  70.                     *exp = 1;
  71.                 gExpShareExp = 0;
  72.             }
  73.  
  74.             gBattleStruct->getexpStateTracker++;
  75.             gBattleStruct->expGetterID = 0;
  76.             gBattleStruct->sentInPokes = sentIn;
  77.         }
  78.         // fall through
  79.     case 2: // set exp value to the poke in expgetter_id and print message
  80.         if (gBattleExecBuffer == 0)
  81.         {
  82.             item = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HELD_ITEM);
  83.  
  84.             if (item == ITEM_ENIGMA_BERRY)
  85.                 holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
  86.             else
  87.                 holdEffect = ItemId_GetHoldEffect(item);
  88.  
  89.             if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1))
  90.             {
  91.                 gBattleStruct->sentInPokes >>= 1;
  92.                 gBattleStruct->getexpStateTracker = 5;
  93.                 gBattleMoveDamage = 0; // used for exp
  94.             }
  95.             else if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) == 100)
  96.             {
  97.                 gBattleStruct->sentInPokes >>= 1;
  98.                 gBattleStruct->getexpStateTracker = 5;
  99.                 gBattleMoveDamage = 0; // used for exp
  100.             }
  101.             else
  102.             {
  103.                 // music change in wild battle after fainting a poke
  104.                 if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !gBattleStruct->wildVictorySong)
  105.                 {
  106.                     BattleStopLowHpSound();
  107.                     PlayBGM(0x161);
  108.                     gBattleStruct->wildVictorySong++;
  109.                 }
  110.  
  111.                 if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP))
  112.                 {
  113.                     if (gBattleStruct->sentInPokes & 1)
  114.                         gBattleMoveDamage = *exp;
  115.                     else
  116.                         gBattleMoveDamage = 0;
  117.  
  118.                     if (holdEffect == HOLD_EFFECT_EXP_SHARE)
  119.                         gBattleMoveDamage += gExpShareExp;
  120.                     if (holdEffect == HOLD_EFFECT_LUCKY_EGG)
  121.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  122.                     if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
  123.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  124.  
  125.                     if (IsTradedMon(&gPlayerParty[gBattleStruct->expGetterID]))
  126.                     {
  127.                         gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  128.                         i = 0x14A;
  129.                     }
  130.                     else
  131.                     {
  132.                         i = 0x149;
  133.                     }
  134.  
  135.                     // get exp getter bank
  136.                     if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  137.                     {
  138.                         if (!(gBattlerPartyIndexes[2] != gBattleStruct->expGetterID) && !(gAbsentBattlerFlags & gBitTable[2]))
  139.                             gBattleStruct->expGetterBank = 2;
  140.                         else
  141.                         {
  142.                             if (!(gAbsentBattlerFlags & gBitTable[0]))
  143.                                 gBattleStruct->expGetterBank = 0;
  144.                             else
  145.                                 gBattleStruct->expGetterBank = 2;
  146.                         }
  147.                     }
  148.                     else
  149.                         gBattleStruct->expGetterBank = 0;
  150.  
  151.                     PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gBattleStruct->expGetterBank, gBattleStruct->expGetterID)
  152.  
  153.                     // buffer 'gained' or 'gained a boosted'
  154.                     PREPARE_STRING_BUFFER(gBattleTextBuff2, i)
  155.  
  156.                     PREPARE_WORD_NUMBER_BUFFER(gBattleTextBuff3, 5, gBattleMoveDamage)
  157.  
  158.                     PrepareStringBattle(STRINGID_PKMNGAINEDEXP, gBattleStruct->expGetterBank);
  159.                     MonGainEVs(&gPlayerParty[gBattleStruct->expGetterID], gBattleMons[gBank1].species);
  160.                 }
  161.                 gBattleStruct->sentInPokes >>= 1;
  162.                 gBattleStruct->getexpStateTracker++;
  163.             }
  164.         }
  165.         break;
  166.     case 3: // Set stats and give exp
  167.         if (gBattleExecBuffer == 0)
  168.         {
  169.             gBattleBufferB[gBattleStruct->expGetterBank][0] = 0;
  170.             if (GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL) != 100)
  171.             {
  172.                 gBattleResources_statsBeforeLvlUp->hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  173.                 gBattleResources_statsBeforeLvlUp->atk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  174.                 gBattleResources_statsBeforeLvlUp->def = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  175.                 gBattleResources_statsBeforeLvlUp->spd = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  176.                 gBattleResources_statsBeforeLvlUp->spAtk = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  177.                 gBattleResources_statsBeforeLvlUp->spDef = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
  178.                
  179.                 gActiveBattler = gBattleStruct->expGetterBank;
  180.  
  181.                 EmitExpBarUpdate(0, gBattleStruct->expGetterID, gBattleMoveDamage);
  182.                 MarkBufferBankForExecution(gActiveBattler);
  183.             }
  184.             gBattleStruct->getexpStateTracker++;
  185.         }
  186.         break;
  187.     case 4: // lvl up if necessary
  188.         if (gBattleExecBuffer == 0)
  189.         {
  190.             gActiveBattler = gBattleStruct->expGetterBank;
  191.             if (gBattleBufferB[gActiveBattler][0] == CONTROLLER_TWORETURNVALUES
  192.              && gBattleBufferB[gActiveBattler][1] == RET_VALUE_LEVELLED_UP)
  193.             {
  194.                 if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlerPartyIndexes[gActiveBattler] == gBattleStruct->expGetterID)
  195.                     HandleLowHpMusicChange(&gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], gActiveBattler);
  196.  
  197.                 PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattleStruct->expGetterID)
  198.  
  199.                 PREPARE_BYTE_NUMBER_BUFFER(gBattleTextBuff2, 3, GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL))
  200.  
  201.                 BattleScriptPushCursor();
  202.                 gLeveledUpInBattle |= gBitTable[gBattleStruct->expGetterID];
  203.                 gBattlescriptCurrInstr = BattleScript_LevelUp;
  204.                 gBattleMoveDamage = (gBattleBufferB[gActiveBattler][2] | (gBattleBufferB[gActiveBattler][3] << 8));
  205.                 AdjustFriendship(&gPlayerParty[gBattleStruct->expGetterID], FRIENDSHIP_EVENT_GROW_LEVEL);
  206.  
  207.                 // update battle mon structure after level up
  208.                 if (gBattlerPartyIndexes[0] == gBattleStruct->expGetterID && gBattleMons[0].hp)
  209.                 {
  210.                     gBattleMons[0].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
  211.                     gBattleMons[0].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
  212.                     gBattleMons[0].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  213.                     gBattleMons[0].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  214.                     gBattleMons[0].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  215.                     // Why is this duplicated?
  216.                     gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  217.                     gBattleMons[0].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  218.                     gBattleMons[0].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  219.                     gBattleMons[0].spDefense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPDEF);
  220.                 }
  221.                 // What is else if?
  222.                 if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  223.                 {
  224.                     gBattleMons[2].level = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_LEVEL);
  225.                     gBattleMons[2].hp = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_HP);
  226.                     gBattleMons[2].maxHP = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_MAX_HP);
  227.                     gBattleMons[2].attack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_ATK);
  228.                     gBattleMons[2].defense = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_DEF);
  229.                     // Duplicated again, but this time there's no Sp Defense
  230.                     gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  231.                     gBattleMons[2].speed = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPEED);
  232.                     gBattleMons[2].spAttack = GetMonData(&gPlayerParty[gBattleStruct->expGetterID], MON_DATA_SPATK);
  233.                 }
  234.             }
  235.             else
  236.             {
  237.                 gBattleMoveDamage = 0;
  238.             }
  239.             gBattleStruct->getexpStateTracker = 5;
  240.         }
  241.         break;
  242.     case 5: // looper increment
  243.         if (gBattleMoveDamage) // there is exp to give, goto case 3 that gives exp
  244.             gBattleStruct->getexpStateTracker = 3;
  245.         else
  246.         {
  247.             gBattleStruct->expGetterID++;
  248.             if (gBattleStruct->expGetterID <= 5)
  249.                 gBattleStruct->getexpStateTracker = 2; // loop again
  250.             else
  251.                 gBattleStruct->getexpStateTracker = 6; // we're done
  252.         }
  253.         break;
  254.     case 6: // increment instruction
  255.         if (gBattleExecBuffer == 0)
  256.         {
  257.             // not sure why gf clears the item and ability here
  258.             gBattleMons[gBank1].item = 0;
  259.             gBattleMons[gBank1].ability = 0;
  260.             gBattlescriptCurrInstr += 2;
  261.         }
  262.         break;
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement