Advertisement
EliteAnax17

Untitled

Jun 23rd, 2017
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.23 KB | None | 0 0
  1. //here we go again...
  2. //#ifdef NONMATCHING
  3. void atk23_getexp(void)
  4. {
  5. u8 hold_effect;
  6. int via_expshare = 0, sent_in;
  7. int via_sent_in;
  8. u16* exp = &BATTLE_STRUCT->exp;
  9. gBank1 = GetBattleBank(BSScriptRead8(gBattlescriptCurrInstr + 1));
  10. sent_in = gSentPokesToOpponent[(gBank1 & 2) >> 1];
  11. switch (BATTLE_STRUCT->atk23StateTracker)
  12. {
  13. case 0: //check if should receive exp at all
  14. if (GetBankSide(gBank1) != 1 || (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_SAFARI | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_EREADER_TRAINER)))
  15. BATTLE_STRUCT->atk23StateTracker = 6; //goto last case
  16. else
  17. {
  18. BATTLE_STRUCT->atk23StateTracker++;
  19. unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]];
  20. }
  21. break;
  22. case 1: //calculate experience points to redistribute
  23. {
  24. int i;
  25. u16 calculatedExp;
  26. via_sent_in = 0;
  27. for (i = 0; i < 6; i++)
  28. {
  29. u16 item;
  30. if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == 0 || GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0)
  31. continue;
  32. if (gBitTable[i] & sent_in)
  33. via_sent_in++;
  34.  
  35. item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
  36. if (item == ITEM_ENIGMA_BERRY)
  37. hold_effect = gSaveBlock1.enigmaBerry.holdEffect;
  38. else
  39. hold_effect = ItemId_GetHoldEffect(item);
  40.  
  41. if (hold_effect == HOLD_EFFECT_EXP_SHARE)
  42. via_expshare++;
  43. }
  44. calculatedExp = gBaseStats[gBattleMons[gBank1].species].expYield * gBattleMons[gBank1].level / 7;
  45. if (via_expshare) //at least one poke is getting exp via exp share
  46. {
  47. calculatedExp /= 2;
  48. *exp = calculatedExp / via_sent_in;
  49. ATLEAST_ONE_PTR(exp);
  50.  
  51. gExpShareExp = calculatedExp / via_expshare;
  52. ATLEAST_ONE_PTR(&gExpShareExp);
  53. }
  54. else
  55. {
  56. *exp = calculatedExp / via_sent_in;
  57. ATLEAST_ONE_PTR(exp);
  58. gExpShareExp = 0;
  59. }
  60. BATTLE_STRUCT->atk23StateTracker++;
  61. BATTLE_STRUCT->expGetterID = 0;
  62. BATTLE_STRUCT->sentInPokes = sent_in;
  63. } //no break statement
  64. case 2: //loop; set exp value to the poke in expgetter_id and print message
  65. if (gBattleExecBuffer == 0)
  66. {
  67. u16 item = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HELD_ITEM);
  68. u8* tracker; u32 zero;
  69. if (item == ITEM_ENIGMA_BERRY)
  70. hold_effect = gSaveBlock1.enigmaBerry.holdEffect;
  71. else
  72. hold_effect = ItemId_GetHoldEffect(item);
  73.  
  74. if ((hold_effect != HOLD_EFFECT_EXP_SHARE && !(BATTLE_STRUCT->sentInPokes & 1)))
  75. {
  76. BATTLE_STRUCT->sentInPokes >>= 1;
  77. tracker = &BATTLE_STRUCT->atk23StateTracker;
  78. zero = 0;
  79. goto LABEL;
  80. }
  81. else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100)
  82. {
  83. BATTLE_STRUCT->sentInPokes >>= 1;
  84. tracker = &BATTLE_STRUCT->atk23StateTracker;
  85. zero = 0;
  86. LABEL:
  87. *tracker = 5; //increment looper
  88. gBattleMoveDamage = zero; //used for exp
  89. }
  90. else
  91. {
  92. //music change in wild battle after fainting a poke
  93. if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER) && gBattleMons[0].hp && !BATTLE_STRUCT->wildVictorySong)
  94. {
  95. BattleMusicStop();
  96. PlayBGM(0x161);
  97. BATTLE_STRUCT->wildVictorySong++;
  98. }
  99.  
  100. if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP))
  101. {
  102. s32 stringID;
  103. if (BATTLE_STRUCT->sentInPokes & 1)
  104. gBattleMoveDamage = *exp;
  105. else
  106. gBattleMoveDamage = 0;
  107.  
  108. //get exp getter bank
  109. if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
  110. {
  111. if (!(gBattlePartyID[2] != BATTLE_STRUCT->expGetterID) && !(gAbsentBankFlags & gBitTable[2]))
  112. BATTLE_STRUCT->expGetterBank = 2;
  113. else
  114. {
  115. if (!(gAbsentBankFlags & gBitTable[0]))
  116. BATTLE_STRUCT->expGetterBank = 0;
  117. else
  118. BATTLE_STRUCT->expGetterBank = 2;
  119. }
  120. }
  121. else
  122. BATTLE_STRUCT->expGetterBank = 0;
  123.  
  124. if(CheckSpeedchoiceOption(BWEXP, ON) == TRUE)
  125. {
  126. u32 upperRatio;
  127. u32 lowerRatio;
  128.  
  129. if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
  130. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
  131.  
  132. // step 2, calculate ratio
  133. upperRatio = ((gBattleMons[gBank1].level * 2) + 10);
  134. upperRatio *= upperRatio * Sqrt(upperRatio);
  135. lowerRatio = (gBattleMons[gBank1].level + gPlayerParty[BATTLE_STRUCT->expGetterID].level + 10);
  136. lowerRatio *= lowerRatio * Sqrt(lowerRatio);
  137.  
  138. // step 3, calculate ratio product and multiply rest.
  139. gBattleMoveDamage = max(gBattleMoveDamage, gBattleMoveDamage * upperRatio / lowerRatio) + 1;
  140. if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID]))
  141. {
  142. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
  143. stringID = 0x14A;
  144. }
  145. else
  146. stringID = 0x149;
  147. if (hold_effect == HOLD_EFFECT_LUCKY_EGG)
  148. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100; // x 1.5
  149. if (hold_effect == HOLD_EFFECT_EXP_SHARE)
  150. gBattleMoveDamage += gExpShareExp;
  151. }
  152. else // normal handling
  153. {
  154. if (hold_effect == HOLD_EFFECT_EXP_SHARE)
  155. gBattleMoveDamage += gExpShareExp;
  156. if (hold_effect == HOLD_EFFECT_LUCKY_EGG)
  157. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  158. if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
  159. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  160.  
  161. if (IsTradedMon(&gPlayerParty[BATTLE_STRUCT->expGetterID]))
  162. {
  163. gBattleMoveDamage = (gBattleMoveDamage * 150) / 100;
  164. stringID = 0x14A;
  165. }
  166. else
  167. stringID = 0x149;
  168. }
  169.  
  170. // i don't even care that this is a walle303 solution. I am NOT updating the randomizer for the 11th bajillion time.
  171. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  172. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  173. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  174. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  175. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  176. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  177. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  178. asm("nop"); // pad the ROM so the randomizer still works. Fuck updating the randomizer again, I hate it.
  179.  
  180. //buffer poke name
  181. gBattleTextBuff1[0] = 0xFD;
  182. gBattleTextBuff1[1] = 4;
  183. gBattleTextBuff1[2] = BATTLE_STRUCT->expGetterBank;
  184. gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID;
  185. gBattleTextBuff1[4] = 0xFF;
  186.  
  187. //buffer 'gained' or 'gained a boosted'
  188. gBattleTextBuff2[0] = 0xFD;
  189. gBattleTextBuff2[1] = 0;
  190. gBattleTextBuff2[2] = stringID;
  191. gBattleTextBuff2[3] = (stringID & (0xFF00)) >> 8;
  192. gBattleTextBuff2[4] = 0xFF;
  193.  
  194. //buffer exp number
  195. gBattleTextBuff3[0] = 0xFD;
  196. gBattleTextBuff3[1] = 1;
  197. gBattleTextBuff3[2] = 4; //word
  198. gBattleTextBuff3[3] = 5; //max digits
  199. gBattleTextBuff3[4] = gBattleMoveDamage;
  200. gBattleTextBuff3[5] = (gBattleMoveDamage & 0x00FF00) >> 8;
  201. gBattleTextBuff3[6] = (gBattleMoveDamage & 0xFF0000) >> 0x10;
  202. gBattleTextBuff3[7] = gBattleMoveDamage >> 0x18;
  203. gBattleTextBuff3[8] = 0xFF;
  204.  
  205. PrepareStringBattle(0xD, BATTLE_STRUCT->expGetterBank);
  206. MonGainEVs(&gPlayerParty[BATTLE_STRUCT->expGetterID], gBattleMons[gBank1].species);
  207. }
  208. BATTLE_STRUCT->sentInPokes >>= 1;
  209. BATTLE_STRUCT->atk23StateTracker++;
  210. }
  211. }
  212. break;
  213. case 3: //Set Stats and give exp
  214. if (gBattleExecBuffer == 0)
  215. {
  216. BattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0;
  217. if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100)
  218. {
  219. BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match
  220. BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
  221. BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
  222. BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
  223. BATTLE_STRUCT->beforeLvlUp[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
  224. BATTLE_STRUCT->beforeLvlUp[5] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF);
  225.  
  226. gActiveBank = BATTLE_STRUCT->expGetterBank;
  227. EmitExpBarUpdate(0, BATTLE_STRUCT->expGetterID, gBattleMoveDamage);
  228. MarkBufferBankForExecution(gActiveBank);
  229. }
  230. BATTLE_STRUCT->atk23StateTracker++;
  231. }
  232. break;
  233. case 4: //lvl up if necessary
  234. if (gBattleExecBuffer == 0)
  235. {
  236. gActiveBank = BATTLE_STRUCT->expGetterBank;
  237. if (BattleBufferB[gActiveBank][0] == 0x21 && BattleBufferB[gActiveBank][1] == 0xB)
  238. {
  239. if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gBattlePartyID[gActiveBank] == BATTLE_STRUCT->expGetterID)
  240. sub_80324F8(&gPlayerParty[gActiveBank], gActiveBank);
  241.  
  242. //buff poke name
  243. gBattleTextBuff1[0] = 0xFD;
  244. gBattleTextBuff1[1] = 4;
  245. gBattleTextBuff1[2] = gActiveBank;
  246. gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID;
  247. gBattleTextBuff1[4] = 0xFF;
  248.  
  249. //buff level
  250. gBattleTextBuff2[0] = 0xFD;
  251. gBattleTextBuff2[1] = 1;
  252. gBattleTextBuff2[2] = 1;
  253. gBattleTextBuff2[3] = 3;
  254. gBattleTextBuff2[4] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
  255. gBattleTextBuff2[5] = 0xFF;
  256.  
  257. b_movescr_stack_push_cursor();
  258. gLeveledUpInBattle |= gBitTable[BATTLE_STRUCT->expGetterID];
  259. gBattlescriptCurrInstr = BattleScript_LevelUp;
  260. gBattleMoveDamage = (BattleBufferB[gActiveBank][2] | (BattleBufferB[gActiveBank][3] << 8));
  261. AdjustFriendship(&gPlayerParty[BATTLE_STRUCT->expGetterID], 0);
  262.  
  263. //update battle mon structure after level up
  264. if (gBattlePartyID[0] == BATTLE_STRUCT->expGetterID && gBattleMons[0].hp)
  265. {
  266. gBattleMons[0].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
  267. gBattleMons[0].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP);
  268. gBattleMons[0].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP);
  269. gBattleMons[0].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
  270. gBattleMons[0].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
  271. gBattleMons[0].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
  272. gBattleMons[0].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
  273. gBattleMons[0].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPDEF);
  274. }
  275. //What is else if? Guess it's too advanced for GameFreak
  276. if (gBattlePartyID[2] == BATTLE_STRUCT->expGetterID && gBattleMons[2].hp && (gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
  277. {
  278. gBattleMons[2].level = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL);
  279. gBattleMons[2].hp = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP);
  280. gBattleMons[2].maxHP = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP);
  281. gBattleMons[2].attack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK);
  282. gBattleMons[2].defense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF);
  283. //There are no words...GF can't even copy&paste code properly
  284. gBattleMons[2].speed = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD);
  285. gBattleMons[2].spAttack = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD /*RIP*/);
  286. gBattleMons[2].spDefense = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPATK);
  287. }
  288. BATTLE_STRUCT->atk23StateTracker = 5;
  289. }
  290. else
  291. {
  292. gBattleMoveDamage = 0;
  293. BATTLE_STRUCT->atk23StateTracker = 5;
  294. }
  295. }
  296. break;
  297. case 5: //looper increment
  298. if (gBattleMoveDamage) //there is exp to give, goto case 3 that gives exp
  299. BATTLE_STRUCT->atk23StateTracker = 3;
  300. else
  301. {
  302. if (++BATTLE_STRUCT->expGetterID <= 5)
  303. BATTLE_STRUCT->atk23StateTracker = 2; //loop again
  304. else
  305. BATTLE_STRUCT->atk23StateTracker = 6; //we're done
  306. }
  307. break;
  308. case 6: //increment instruction
  309. if (gBattleExecBuffer == 0)
  310. {
  311. //not even sure why gamefreak clears that data in this place
  312. gBattleMons[gBank1].item = 0;
  313. gBattleMons[gBank1].ability = 0;
  314. gBattlescriptCurrInstr += 2;
  315. }
  316. break;
  317. }
  318. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement