From b2a56f6b6cf9daab1e5c07de0e147080e1ee2964 Mon Sep 17 00:00:00 2001 From: cawtds Date: Tue, 14 May 2024 22:20:07 +0200 Subject: [PATCH] added new pokeball graphics, fixed/refactored tmhms, smaller pokedex entry font to fit whole text --- data/maps/ViridianCity_Mart/scripts.inc | 3 + graphics/balls/beast.png | Bin 0 -> 329 bytes graphics/balls/cherish.png | Bin 0 -> 329 bytes graphics/{interface/ball => balls}/dive.png | Bin graphics/balls/dream.png | Bin 0 -> 316 bytes graphics/balls/dusk.png | Bin 0 -> 318 bytes graphics/balls/fast.png | Bin 0 -> 310 bytes graphics/balls/friend.png | Bin 0 -> 312 bytes graphics/{interface/ball => balls}/great.png | Bin graphics/balls/heal.png | Bin 0 -> 309 bytes graphics/balls/heavy.png | Bin 0 -> 316 bytes graphics/balls/level.png | Bin 0 -> 307 bytes graphics/balls/love.png | Bin 0 -> 305 bytes graphics/balls/lure.png | Bin 0 -> 302 bytes graphics/{interface/ball => balls}/luxury.png | Bin graphics/{interface/ball => balls}/master.png | Bin graphics/balls/moon.png | Bin 0 -> 317 bytes graphics/{interface/ball => balls}/nest.png | Bin graphics/{interface/ball => balls}/net.png | Bin graphics/balls/open.png | Bin 0 -> 215 bytes graphics/balls/park.png | Bin 0 -> 307 bytes graphics/{interface/ball => balls}/poke.png | Bin .../{interface/ball => balls}/premier.png | Bin graphics/balls/quick.png | Bin 0 -> 313 bytes graphics/{interface/ball => balls}/repeat.png | Bin graphics/{interface/ball => balls}/safari.png | Bin graphics/balls/sport.png | Bin 0 -> 299 bytes graphics/{interface/ball => balls}/timer.png | Bin graphics/{interface/ball => balls}/ultra.png | Bin graphics/battle_anims/sprites/particles2.png | Bin 0 -> 357 bytes include/battle.h | 3 +- include/constants/global.h | 4 +- include/constants/items.h | 85 +--- include/global.h | 2 +- include/graphics.h | 61 ++- include/item.h | 6 + include/pokeball.h | 30 +- src/battle_anim_special.c | 474 +++++++++++++----- src/battle_controller_oak_old_man.c | 2 +- src/battle_util.c | 4 +- src/data/graphics/interface_pokeballs.h | 95 +++- src/data/items.h | 4 +- src/field_specials.c | 3 +- src/graphics.c | 3 + src/item.c | 23 + src/oak_speech.c | 2 +- src/party_menu.c | 2 +- src/pokeball.c | 306 +++++++++-- src/pokedex_screen.c | 6 +- src/pokemon.c | 14 +- src/tm_case.c | 29 +- 51 files changed, 850 insertions(+), 311 deletions(-) create mode 100644 graphics/balls/beast.png create mode 100644 graphics/balls/cherish.png rename graphics/{interface/ball => balls}/dive.png (100%) create mode 100644 graphics/balls/dream.png create mode 100644 graphics/balls/dusk.png create mode 100644 graphics/balls/fast.png create mode 100644 graphics/balls/friend.png rename graphics/{interface/ball => balls}/great.png (100%) create mode 100644 graphics/balls/heal.png create mode 100644 graphics/balls/heavy.png create mode 100644 graphics/balls/level.png create mode 100644 graphics/balls/love.png create mode 100644 graphics/balls/lure.png rename graphics/{interface/ball => balls}/luxury.png (100%) rename graphics/{interface/ball => balls}/master.png (100%) create mode 100644 graphics/balls/moon.png rename graphics/{interface/ball => balls}/nest.png (100%) rename graphics/{interface/ball => balls}/net.png (100%) create mode 100644 graphics/balls/open.png create mode 100644 graphics/balls/park.png rename graphics/{interface/ball => balls}/poke.png (100%) rename graphics/{interface/ball => balls}/premier.png (100%) create mode 100644 graphics/balls/quick.png rename graphics/{interface/ball => balls}/repeat.png (100%) rename graphics/{interface/ball => balls}/safari.png (100%) create mode 100644 graphics/balls/sport.png rename graphics/{interface/ball => balls}/timer.png (100%) rename graphics/{interface/ball => balls}/ultra.png (100%) create mode 100644 graphics/battle_anims/sprites/particles2.png diff --git a/data/maps/ViridianCity_Mart/scripts.inc b/data/maps/ViridianCity_Mart/scripts.inc index d51ddc267..75050581e 100644 --- a/data/maps/ViridianCity_Mart/scripts.inc +++ b/data/maps/ViridianCity_Mart/scripts.inc @@ -79,6 +79,8 @@ ViridianCity_Mart_Items:: .2byte ITEM_DIRE_HIT .2byte ITEM_POKE_DOLL .2byte ITEM_MASTER_BALL + .2byte ITEM_MOON_BALL + .2byte ITEM_CHERISH_BALL .2byte ITEM_REVIVE .2byte ITEM_ETHER .2byte ITEM_ELIXIR @@ -100,6 +102,7 @@ ViridianCity_Mart_Items:: .2byte ITEM_BEAST_BALL .2byte ITEM_POMEG_BERRY .2byte ITEM_MEGA_RING + .2byte ITEM_VENUSAURITE .2byte ITEM_CHARIZARDITE_X .2byte ITEM_CHARIZARDITE_Y .2byte ITEM_SILPH_SCOPE diff --git a/graphics/balls/beast.png b/graphics/balls/beast.png new file mode 100644 index 0000000000000000000000000000000000000000..56a10224c6a01a1a7c08930daa4dc1521d6f3a16 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>pcCrRA2WsQ->xR~^^< z?>_tg-BruIbCTv{IRaHpnKH%E5yXIit@lKC09jW&T^vIsrcUkK$kmh}(pn#-Rgj;_ zA)8gO>6qKnqZb#tXXs=YWOOW0DacrT!2F`({}!I}&R^x1c1&1sy7hOV<@Yyjeb|B5}}`_6s;PAZ=@nW&~%Y&?CzPKUCk600<(>36(4Fsm_YU+#DFRK3{a;ZDa_ zKjWKGWL9an+_>?an&T%mMy`8`ZLflak1ur#IJ{DGYt3^*`({_+grCOeg(D`Giyo2w Q-U{-mr>mdKI;Vst02?BTZ2$lO literal 0 HcmV?d00001 diff --git a/graphics/balls/cherish.png b/graphics/balls/cherish.png new file mode 100644 index 0000000000000000000000000000000000000000..3016b6560993290ec7073da1606f6eb99a30cdc9 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>pc?Q3cIv1G)zXAnS^!i(`ny)Tt9T@--O@8Hc(g z_b00rp60tQR1ot*;=(JR)GDWoC1G!RV4{lCelClxWlMD`7f$)|_eg!} znHlH4DolHQ(EY`d R?kvd544$rjF6*2UngDUnEr)RLpsbDquF`+v*T z|IK^x^UXE1FydUf14t@)2dh6=q zA5t2ZxnWm#WV7mYnS)jeAGIF_`U&$TOh1t1Vexlnz>*UFif@8%jdyXB%;hkzQo3-t zz2SJUFNenLK(nYUi%iQ-{|$d01)eQ7RTBy4cwhN0)Um?P&AKfYt<74`dc+H3tPH8D8}= zoZ~p>TlfDZ3R4^z{s%EMCnY&LIsz5IL7&&2ULfbBr;B5V#MG(%8@Ub{h`3sdeG=C! zDePgLJKI%e>4K6qB7a))nm8K!qJHtu?aEwQP=9XEl2$FN9~^s}C;cvZRC%9EV)vA3 z5i{f;PitUz5-71bpc?lxD|oXDzR;F?`qU zcs5J(|CZ+edzS!}Oqnvp(a{mefP)lfsYW2@pr?yth{V*X6E<=kGLUF7-jVuB?H9+o z+}PH%*BYz`H{MWP+^?{&ecj1RUMDA1Tkf?F72tZb{}21l-T#%n&hi?(-6pcsfBL4^ zntZ37jzq-FE^`i)b&k87&6fY-ouIAF*_&2Yo_CGaoeo;o%>R*Zm+)MvF?V*FzPgrl z5#wrh`$^9Qb2g}45#y-os^C4?w*7+ShF_jHN;9Po6zEIbH*`H1;%jL1xRGNe;}Va} u2BylUSyfd(S8zJFJQMEcI`6wOa-MqZ<-)jKr>9K@`OMSR&t;ucLK6TK412Kv literal 0 HcmV?d00001 diff --git a/graphics/balls/friend.png b/graphics/balls/friend.png new file mode 100644 index 0000000000000000000000000000000000000000..b016c0c63192202e78dd932ab883af521a509d4e GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>pbX_fgBe&zh^3Sbn=F z@b0SRnkkM)qr8Ahrc9aQ2nIkl1Q--9Q3SFMd%8G=NKBnNVIxIyR}A9=|2v33*Zb$TyRD|hYgvK)s(Z_IMV4IH{>0(lUQ3sidl|PG`?h{D-I=QV zaFR)RQ~quvbM7z9Q`i*|E&9)8*7rB!@ntA zlbSD_W^5TRu;*i2(k+I0;f$vPa;lp98YdsAm%R41jLC`pnD#ObAIYZlV~mVJ%pMcd w9^UHN8d#h@rT>-*i^=*QD}LBax%IV@@g`sSG^O`{{((H^>FVdQ&MBb@0G5M)Jpcdz literal 0 HcmV?d00001 diff --git a/graphics/interface/ball/great.png b/graphics/balls/great.png similarity index 100% rename from graphics/interface/ball/great.png rename to graphics/balls/great.png diff --git a/graphics/balls/heal.png b/graphics/balls/heal.png new file mode 100644 index 0000000000000000000000000000000000000000..5f1604d785843b2547545fb06ebbbec3f3130c18 GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>t<74`e>;Uh;p=(f@nz z6-TYvvgOZU+}e=OD;48Sk12V`IH_fvQ|`J*AyS8o2%qG z=d6`EczEj4-9k6s#tHgtd)GBhZP_~>Uzho>dxF(x8n{@b{jmEO&+F_F{q*RZDQ}#& zi*!FNT^{MP+)A~>{6OvY13gQByyRWP-Zj6?^U-cbp06_=Z3z$vSfx5cqnLT#l*6nR v&Hqh!|D^rseZ+O<@p87qia%C7P!6w+TQDiH&@em41>`qRS3j3^P6pbXQ1v~_s3k|wUX9AC zE^eMOWyuzx{FEtE9335j3}jFrRyPO8Kkn(`7$PxsYTrh#Lk1$Q%#S9meXwZtqSXo! zFLZY7Dmi)M6@SE%2jMSn_^ef(c5l7O_pMw`jy2wVp6_biS1x3HBB9u~@teTe@6&zX zJ}jK`B=gBaze72m8Jk`gXU{mPU7fVfDLc{jMZz^P)rWE-OkA#w>qYC&x#vvpo)Nd^ z9OvxC7j{f(>s`5KvH#;9W0qWo zVF+3hdBb#Z_LV<}XMb9&xZvlJrH_h(vo1VmHT$1=m#fpf8RSJzS3j3^P6pbXR8-Ladwb_3S>Brx zbm5qnmx(sgI zYp-fDypf=}OjqECh+(hzVaXDSPXApc?wXTA_(iuQ+ni(J%m3Rx#a}$qa-`yPZRY!bzo$fLC%nv6Tynei=C_ttHJKd2vzGSG zOg!Uvxv`<9Al#3igRk%KNxg`hRcc`l2cv4{|5$IAR4RFNRdUpc&OgtN7VP0Y*FD4h zp1>AHoBd4BijsCT_%*!sKfJ4NFSFG*-s|u0C>5L*uql@jP%vy@$z(g0a>V7Vpc?y{N4JOSa5u-r`l< z?X~6J|D!?gx}$(frc9aQ=;#P!z=7?f{fmH{ot`d^Are!k_HE=kWFX?o{AkL`)$jf` z_|>&>y#3^sDG+m%U*Hda?Bu1glN7%{e^cAr6d-ValJlo`XARRb8;azzRBxM>+6(lp zo~`V%eYeF-g`LGg4(4t1ZYvi#JSf_FHZJ)5DQ$_0{`dO-X7@)F>nAOLt@BJ}Rm3Di z7twB^)&$m$no~2>RwOb;GtQphmK*Koka_mUJWZxxr;al$3eMRKx|?+7%r-QSdiNo% lB3mQE?ql%RN{P)cJ~REuDtdo7c_9bLN1m>JF6*2UngI6`dwc)@ literal 0 HcmV?d00001 diff --git a/graphics/interface/ball/luxury.png b/graphics/balls/luxury.png similarity index 100% rename from graphics/interface/ball/luxury.png rename to graphics/balls/luxury.png diff --git a/graphics/interface/ball/master.png b/graphics/balls/master.png similarity index 100% rename from graphics/interface/ball/master.png rename to graphics/balls/master.png diff --git a/graphics/balls/moon.png b/graphics/balls/moon.png new file mode 100644 index 0000000000000000000000000000000000000000..beb1016f4d6fee2e31f3c79fe2bbbf7d1ed3d04f GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>pbXQt_0itm^9SIbKKK zIZjzK=l}n`YqGwbb^QNq2~Z&rI668)7|&~$-378vc)B=-NKBpDXUNy&AmF<4%{GON zN*f!wXGG*LO5>WX+iAA#NLv*D0ZyLjAIu&!-QC~)C($q~XHHsN+4J*zG=7CTyjZ?^ zl4joRHHvS9JvsaT1T8OXu(Q7>I$^usxBxd-x3GtNQZ#$}0;*fdl$0SXrVAX@h zj~n=Qu?4s?3--)5%rlwu(AzjuL!$2EieGCMXMCDiK3`p6UTI|TwKzVI?>t@oT-G@y GGywpHmWZtY literal 0 HcmV?d00001 diff --git a/graphics/interface/ball/nest.png b/graphics/balls/nest.png similarity index 100% rename from graphics/interface/ball/nest.png rename to graphics/balls/nest.png diff --git a/graphics/interface/ball/net.png b/graphics/balls/net.png similarity index 100% rename from graphics/interface/ball/net.png rename to graphics/balls/net.png diff --git a/graphics/balls/open.png b/graphics/balls/open.png new file mode 100644 index 0000000000000000000000000000000000000000..1030f4942619b1e6397c5a95613d76e59752ca7b GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU{r~@eGXujK28OGen*Zli z1G!VCOmTE{l#q}BvN1tc%`|VI-Xu>K#}JO0roD!I4F){S%7!I;Jab=iJN$LpFYuA+ zmMGhY@14;Pk1oFv=HlWtaUD;}FP6|8KF8SUhy5aC-i4O-wJe#H^nS?|>qDZpCJ&xI sZCw4gz`*E$MC;`>eW7b5-aGzhaPSpNaAf+r4rm*Lr>mdKI;Vst0FA0$ssI20 literal 0 HcmV?d00001 diff --git a/graphics/balls/park.png b/graphics/balls/park.png new file mode 100644 index 0000000000000000000000000000000000000000..9b526f52455bd52c8a296942179814cf56adc8d9 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>pcCW7gh#XC03&(foF= zdrh;#w`RlUq$Hq{?(S|!M@Jw74&FX_-U{UG^K@|xk(fHQ&ycUlLBQ2~TXbSla;h1d z&T}-nZ!(hI<71|QyyfZY=d#Wzp$PzcOL~6* literal 0 HcmV?d00001 diff --git a/graphics/interface/ball/poke.png b/graphics/balls/poke.png similarity index 100% rename from graphics/interface/ball/poke.png rename to graphics/balls/poke.png diff --git a/graphics/interface/ball/premier.png b/graphics/balls/premier.png similarity index 100% rename from graphics/interface/ball/premier.png rename to graphics/balls/premier.png diff --git a/graphics/balls/quick.png b/graphics/balls/quick.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5dfccb9c6c825f538dfaba5f213a4d1afc8200 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^0zhoQ!VDx|6+TY^aRPioT>t<74`c=fC3z*y@oK)> zeD>S_dxmG%D6DB#XiiG%?(TMUbcCn@Dgy#*arr(Vb;Q%fF+^hO)V_^e%?1K(t$mf; z*Y#w%BboWuJ`D*J#!jy%y!L zdH$j93sRPGR;>&<7%q`wXH~K4Xh`+1u5{t$COV%2cZ96m;_d3eRWtv``dMmAHXrHs zT>JiA%ev+42P5>;R(T#SI_=q0c)%)sjcd|j=@~5R?0L6-`^#}>#e0pq1tN?~EgF~h zFs7Yac=XpDpWBD>+wPwTTJYY^R3@g$U##ZJvh&pc?lxD~OS1sRlJD$zb z{J*97|K24)`6*MTI66848OWgELh*4Rf19U^V~E7mseOighYWaJjSVVKGc9_qVLdfU zapShgqV9Vv$5OHycz!N#c`v52#EV0}&g;$l^fOV6-ttzelE-fOwp?EKl4Gar>vO`t zUcKWe(6sVXpVDz6F?#BP=x}Kf9;XA}JO95@-j*x2aaoxB%he?ThVzq_o!9;ShVxP5 zne|QKuBI^#Ivf6HzPNKIdO_;_g1;wpnYN#6VJ}w-SYX(|#>xCVA!VDy@YH9BTQtTz3zOL+#nOH=5Rji)<*#i_3 zFL8}13C>R|DNig)WpMX#0UD!FmRh7>tY=c#y5u2H2}enRpF2>-7|3SuYS5GiQY`6? zzK#qG8~eHcB(ehe1_3@Hu1T8zL0}ET|NlY%{{zV-b+-G{^yb;{WnbL!45;eAVGzTn z|3)JJ*Zl7ede-}=&M>mMIXW`(NZ#W%c*LaN(@bufferA[battler][1] == B_ACTION_USE_ITEM) { // Add item to bag if it is a ball - if (itemId <= ITEM_PREMIER_BALL) + if (IsItemBall(itemId)) AddBagItem(itemId, 1); else return; diff --git a/src/battle_util.c b/src/battle_util.c index 6a061fed0..50a662390 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4437,7 +4437,7 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_BALL_FETCH: if (gBattleMons[battler].item == ITEM_NONE - && gBattleResults.catchAttempts[gLastUsedBall - ITEM_ULTRA_BALL] >= 1 + && gBattleResults.catchAttempts[gLastUsedBall - FIRST_BALL] >= 1 && !gHasFetchedBall) { gBattleScripting.battler = battler; @@ -9746,7 +9746,7 @@ u8 GetCategoryBasedOnStats(u32 battler) static u32 GetFlingPowerFromItemId(u32 itemId) { - if (itemId >= ITEM_TM01 && itemId <= ITEM_HM08) + if (IsItemTMHM(itemId)) { u32 power = gMovesInfo[ItemIdToBattleMoveId(itemId)].power; if (power > 1) diff --git a/src/data/graphics/interface_pokeballs.h b/src/data/graphics/interface_pokeballs.h index 69d09d51f..44f47cde4 100644 --- a/src/data/graphics/interface_pokeballs.h +++ b/src/data/graphics/interface_pokeballs.h @@ -1,37 +1,82 @@ -const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/interface/ball/poke.4bpp.lz"); -const u32 gBallPal_Poke[] = INCBIN_U32("graphics/interface/ball/poke.gbapal.lz"); +const u32 gBallGfx_Poke[] = INCBIN_U32("graphics/balls/poke.4bpp.lz"); +const u32 gBallPal_Poke[] = INCBIN_U32("graphics/balls/poke.gbapal.lz"); -const u32 gBallGfx_Great[] = INCBIN_U32("graphics/interface/ball/great.4bpp.lz"); -const u32 gBallPal_Great[] = INCBIN_U32("graphics/interface/ball/great.gbapal.lz"); +const u32 gBallGfx_Great[] = INCBIN_U32("graphics/balls/great.4bpp.lz"); +const u32 gBallPal_Great[] = INCBIN_U32("graphics/balls/great.gbapal.lz"); -const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/interface/ball/safari.4bpp.lz"); -const u32 gBallPal_Safari[] = INCBIN_U32("graphics/interface/ball/safari.gbapal.lz"); +const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/balls/ultra.4bpp.lz"); +const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/balls/ultra.gbapal.lz"); -const u32 gBallGfx_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.4bpp.lz"); -const u32 gBallPal_Ultra[] = INCBIN_U32("graphics/interface/ball/ultra.gbapal.lz"); +const u32 gBallGfx_Master[] = INCBIN_U32("graphics/balls/master.4bpp.lz"); +const u32 gBallPal_Master[] = INCBIN_U32("graphics/balls/master.gbapal.lz"); -const u32 gBallGfx_Master[] = INCBIN_U32("graphics/interface/ball/master.4bpp.lz"); -const u32 gBallPal_Master[] = INCBIN_U32("graphics/interface/ball/master.gbapal.lz"); +const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/balls/premier.4bpp.lz"); +const u32 gBallPal_Premier[] = INCBIN_U32("graphics/balls/premier.gbapal.lz"); -const u32 gBallGfx_Net[] = INCBIN_U32("graphics/interface/ball/net.4bpp.lz"); -const u32 gBallPal_Net[] = INCBIN_U32("graphics/interface/ball/net.gbapal.lz"); +const u32 gBallGfx_Heal[] = INCBIN_U32("graphics/balls/heal.4bpp.lz"); +const u32 gBallPal_Heal[] = INCBIN_U32("graphics/balls/heal.gbapal.lz"); -const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/interface/ball/dive.4bpp.lz"); -const u32 gBallPal_Dive[] = INCBIN_U32("graphics/interface/ball/dive.gbapal.lz"); +const u32 gBallGfx_Net[] = INCBIN_U32("graphics/balls/net.4bpp.lz"); +const u32 gBallPal_Net[] = INCBIN_U32("graphics/balls/net.gbapal.lz"); -const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/interface/ball/nest.4bpp.lz"); -const u32 gBallPal_Nest[] = INCBIN_U32("graphics/interface/ball/nest.gbapal.lz"); +const u32 gBallGfx_Nest[] = INCBIN_U32("graphics/balls/nest.4bpp.lz"); +const u32 gBallPal_Nest[] = INCBIN_U32("graphics/balls/nest.gbapal.lz"); -const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.4bpp.lz"); -const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/interface/ball/repeat.gbapal.lz"); +const u32 gBallGfx_Dive[] = INCBIN_U32("graphics/balls/dive.4bpp.lz"); +const u32 gBallPal_Dive[] = INCBIN_U32("graphics/balls/dive.gbapal.lz"); -const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/interface/ball/timer.4bpp.lz"); -const u32 gBallPal_Timer[] = INCBIN_U32("graphics/interface/ball/timer.gbapal.lz"); +const u32 gBallGfx_Dusk[] = INCBIN_U32("graphics/balls/dusk.4bpp.lz"); +const u32 gBallPal_Dusk[] = INCBIN_U32("graphics/balls/dusk.gbapal.lz"); -const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.4bpp.lz"); -const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/interface/ball/luxury.gbapal.lz"); +const u32 gBallGfx_Timer[] = INCBIN_U32("graphics/balls/timer.4bpp.lz"); +const u32 gBallPal_Timer[] = INCBIN_U32("graphics/balls/timer.gbapal.lz"); -const u32 gBallGfx_Premier[] = INCBIN_U32("graphics/interface/ball/premier.4bpp.lz"); -const u32 gBallPal_Premier[] = INCBIN_U32("graphics/interface/ball/premier.gbapal.lz"); +const u32 gBallGfx_Quick[] = INCBIN_U32("graphics/balls/quick.4bpp.lz"); +const u32 gBallPal_Quick[] = INCBIN_U32("graphics/balls/quick.gbapal.lz"); -const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/interface/ball_open.4bpp.lz"); +const u32 gBallGfx_Repeat[] = INCBIN_U32("graphics/balls/repeat.4bpp.lz"); +const u32 gBallPal_Repeat[] = INCBIN_U32("graphics/balls/repeat.gbapal.lz"); + +const u32 gBallGfx_Luxury[] = INCBIN_U32("graphics/balls/luxury.4bpp.lz"); +const u32 gBallPal_Luxury[] = INCBIN_U32("graphics/balls/luxury.gbapal.lz"); + +const u32 gBallGfx_Level[] = INCBIN_U32("graphics/balls/level.4bpp.lz"); +const u32 gBallPal_Level[] = INCBIN_U32("graphics/balls/level.gbapal.lz"); + +const u32 gBallGfx_Lure[] = INCBIN_U32("graphics/balls/lure.4bpp.lz"); +const u32 gBallPal_Lure[] = INCBIN_U32("graphics/balls/lure.gbapal.lz"); + +const u32 gBallGfx_Moon[] = INCBIN_U32("graphics/balls/moon.4bpp.lz"); +const u32 gBallPal_Moon[] = INCBIN_U32("graphics/balls/moon.gbapal.lz"); + +const u32 gBallGfx_Friend[] = INCBIN_U32("graphics/balls/friend.4bpp.lz"); +const u32 gBallPal_Friend[] = INCBIN_U32("graphics/balls/friend.gbapal.lz"); + +const u32 gBallGfx_Love[] = INCBIN_U32("graphics/balls/love.4bpp.lz"); +const u32 gBallPal_Love[] = INCBIN_U32("graphics/balls/love.gbapal.lz"); + +const u32 gBallGfx_Fast[] = INCBIN_U32("graphics/balls/fast.4bpp.lz"); +const u32 gBallPal_Fast[] = INCBIN_U32("graphics/balls/fast.gbapal.lz"); + +const u32 gBallGfx_Heavy[] = INCBIN_U32("graphics/balls/heavy.4bpp.lz"); +const u32 gBallPal_Heavy[] = INCBIN_U32("graphics/balls/heavy.gbapal.lz"); + +const u32 gBallGfx_Dream[] = INCBIN_U32("graphics/balls/dream.4bpp.lz"); +const u32 gBallPal_Dream[] = INCBIN_U32("graphics/balls/dream.gbapal.lz"); + +const u32 gBallGfx_Safari[] = INCBIN_U32("graphics/balls/safari.4bpp.lz"); +const u32 gBallPal_Safari[] = INCBIN_U32("graphics/balls/safari.gbapal.lz"); + +const u32 gBallGfx_Sport[] = INCBIN_U32("graphics/balls/sport.4bpp.lz"); +const u32 gBallPal_Sport[] = INCBIN_U32("graphics/balls/sport.gbapal.lz"); + +const u32 gBallGfx_Park[] = INCBIN_U32("graphics/balls/park.4bpp.lz"); +const u32 gBallPal_Park[] = INCBIN_U32("graphics/balls/park.gbapal.lz"); + +const u32 gBallGfx_Beast[] = INCBIN_U32("graphics/balls/beast.4bpp.lz"); +const u32 gBallPal_Beast[] = INCBIN_U32("graphics/balls/beast.gbapal.lz"); + +const u32 gBallGfx_Cherish[] = INCBIN_U32("graphics/balls/cherish.4bpp.lz"); +const u32 gBallPal_Cherish[] = INCBIN_U32("graphics/balls/cherish.gbapal.lz"); + +const u32 gOpenPokeballGfx[] = INCBIN_U32("graphics/balls/open.4bpp.lz"); diff --git a/src/data/items.h b/src/data/items.h index 1dd22e42c..234f908e3 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -381,7 +381,7 @@ const struct Item gItems[] = [ITEM_MOON_BALL] = { .name = _("Moon Ball"), - .price = (I_PRICE >= GEN_7) ? 0 : 300, + .price = (I_PRICE >= GEN_7) ? 2 : 2, .description = COMPOUND_STRING( "A Ball that works\n" "well on Moon\n" @@ -524,7 +524,7 @@ const struct Item gItems[] = [ITEM_CHERISH_BALL] = { .name = _("Cherish Ball"), - .price = 0, + .price = 2, .description = COMPOUND_STRING( "A rare Ball made\n" "in commemoration\n" diff --git a/src/field_specials.c b/src/field_specials.c index be72cd200..e1fcaf641 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -18,6 +18,7 @@ #include "field_camera.h" #include "field_effect.h" #include "event_object_movement.h" +#include "item.h" #include "menu_indicators.h" #include "random.h" #include "mail_data.h" @@ -2075,7 +2076,7 @@ bool8 UsedPokemonCenterWarp(void) bool8 BufferTMHMMoveName(void) { // 8004 = item ID - if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08) + if (IsItemTMHM(gSpecialVar_0x8004)) { StringCopy(gStringVar1, gMovesInfo[ItemIdToBattleMoveId(gSpecialVar_0x8004)].name); return TRUE; diff --git a/src/graphics.c b/src/graphics.c index 7c82ea52a..80d99f9fb 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -464,6 +464,9 @@ const u32 gBattleAnimSpritePal_Impact[] = INCBIN_U32("graphics/battle_anims/spri const u32 gBattleAnimSpriteGfx_Particles[] = INCBIN_U32("graphics/battle_anims/sprites/particles.4bpp.lz"); +const u32 gBattleAnimSpriteGfx_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.4bpp.lz"); +const u32 gBattleAnimSpritePal_Particles2[] = INCBIN_U32("graphics/battle_anims/sprites/particles2.gbapal.lz"); + const u32 gBattleAnimSpriteGfx_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.4bpp.lz"); const u32 gBattleAnimSpritePal_CircleImpact[] = INCBIN_U32("graphics/battle_anims/sprites/circle_impact.gbapal.lz"); diff --git a/src/item.c b/src/item.c index 2f86d4a53..23754d70f 100644 --- a/src/item.c +++ b/src/item.c @@ -744,3 +744,26 @@ u32 GetItemStatus2Mask(u16 itemId) else return 0; } + +bool8 IsItemTM(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return ITEM_TM01 <= itemId && itemId <= ITEM_TM100; +} + +bool8 IsItemHM(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return ITEM_HM01 <= itemId && itemId <= ITEM_HM08; +} + +bool8 IsItemTMHM(u16 itemId) +{ + return IsItemTM(itemId) || IsItemHM(itemId); +} + +bool8 IsItemBall(u16 itemId) +{ + itemId = SanitizeItemId(itemId); + return FIRST_BALL <= itemId && itemId <= LAST_BALL; +} diff --git a/src/oak_speech.c b/src/oak_speech.c index 4586aab26..62cccb008 100644 --- a/src/oak_speech.c +++ b/src/oak_speech.c @@ -1885,7 +1885,7 @@ static void CreateNidoranFSprite(u8 taskId) u8 spriteId; LoadSpecialPokePic(MonSpritesGfxManager_GetSpritePtr(0), INTRO_SPECIES, 0, TRUE); - LoadCompressedSpritePaletteUsingHeapWithTag(GetMonSpritePalFromSpeciesAndPersonality(INTRO_SPECIES, 0, SHINY_ODDS), INTRO_SPECIES); + LoadCompressedSpritePaletteUsingHeapWithTag(GetMonSpritePalFromSpeciesAndPersonality(INTRO_SPECIES, 0, 0), INTRO_SPECIES); SetMultiuseSpriteTemplateToPokemon(INTRO_SPECIES, 0); spriteId = CreateSprite(&gMultiuseSpriteTemplate, 96, 96, 1); gSprites[spriteId].callback = SpriteCallbackDummy; diff --git a/src/party_menu.c b/src/party_menu.c index 0698490f3..fe4e8e9d9 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5178,7 +5178,7 @@ static void Task_LearnedMove(u8 taskId) if (learnMoveMethod == LEARN_VIA_TMHM) { AdjustFriendship(mon, FRIENDSHIP_EVENT_LEARN_TMHM); - if (item < ITEM_HM01) + if (!ItemId_GetImportance(item)) RemoveBagItem(item, 1); } GetMonNickname(mon, gStringVar1); diff --git a/src/pokeball.c b/src/pokeball.c index e9661edd6..726c3b229 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -45,47 +45,92 @@ static u16 GetBattlerPokeballItemId(u8 battlerId); #define GFX_TAG_POKE_BALL 55000 #define GFX_TAG_GREAT_BALL 55001 -#define GFX_TAG_SAFARI_BALL 55002 -#define GFX_TAG_ULTRA_BALL 55003 -#define GFX_TAG_MASTER_BALL 55004 -#define GFX_TAG_NET_BALL 55005 -#define GFX_TAG_DIVE_BALL 55006 +#define GFX_TAG_ULTRA_BALL 55002 +#define GFX_TAG_MASTER_BALL 55003 +#define GFX_TAG_PREMIER_BALL 55004 +#define GFX_TAG_HEAL_BALL 55005 +#define GFX_TAG_NET_BALL 55006 #define GFX_TAG_NEST_BALL 55007 -#define GFX_TAG_REPEAT_BALL 55008 -#define GFX_TAG_TIMER_BALL 55009 -#define GFX_TAG_LUXURY_BALL 55010 -#define GFX_TAG_PREMIER_BALL 55011 +#define GFX_TAG_DIVE_BALL 55008 +#define GFX_TAG_DUSK_BALL 55009 +#define GFX_TAG_TIMER_BALL 55010 +#define GFX_TAG_QUICK_BALL 55011 +#define GFX_TAG_REPEAT_BALL 55012 +#define GFX_TAG_LUXURY_BALL 55013 +#define GFX_TAG_LEVEL_BALL 55014 +#define GFX_TAG_LURE_BALL 55015 +#define GFX_TAG_MOON_BALL 55016 +#define GFX_TAG_FRIEND_BALL 55017 +#define GFX_TAG_LOVE_BALL 55018 +#define GFX_TAG_FAST_BALL 55019 +#define GFX_TAG_HEAVY_BALL 55020 +#define GFX_TAG_DREAM_BALL 55021 +#define GFX_TAG_SAFARI_BALL 55022 +#define GFX_TAG_SPORT_BALL 55023 +#define GFX_TAG_PARK_BALL 55024 +#define GFX_TAG_BEAST_BALL 55025 +#define GFX_TAG_CHERISH_BALL 55026 const struct CompressedSpriteSheet gBallSpriteSheets[POKEBALL_COUNT] = { [BALL_POKE] = {gBallGfx_Poke, 384, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallGfx_Great, 384, GFX_TAG_GREAT_BALL}, - [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallGfx_Ultra, 384, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallGfx_Master, 384, GFX_TAG_MASTER_BALL}, - [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL}, - [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL}, - [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL}, - [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL}, - [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL}, - [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallGfx_Premier, 384, GFX_TAG_PREMIER_BALL}, + [BALL_HEAL] = {gBallGfx_Heal, 384, GFX_TAG_HEAL_BALL}, + [BALL_NET] = {gBallGfx_Net, 384, GFX_TAG_NET_BALL}, + [BALL_NEST] = {gBallGfx_Nest, 384, GFX_TAG_NEST_BALL}, + [BALL_DIVE] = {gBallGfx_Dive, 384, GFX_TAG_DIVE_BALL}, + [BALL_DUSK] = {gBallGfx_Dusk, 384, GFX_TAG_DUSK_BALL}, + [BALL_TIMER] = {gBallGfx_Timer, 384, GFX_TAG_TIMER_BALL}, + [BALL_QUICK] = {gBallGfx_Quick, 384, GFX_TAG_QUICK_BALL}, + [BALL_REPEAT] = {gBallGfx_Repeat, 384, GFX_TAG_REPEAT_BALL}, + [BALL_LUXURY] = {gBallGfx_Luxury, 384, GFX_TAG_LUXURY_BALL}, + [BALL_LEVEL] = {gBallGfx_Level, 384, GFX_TAG_LEVEL_BALL}, + [BALL_LURE] = {gBallGfx_Lure, 384, GFX_TAG_LURE_BALL}, + [BALL_MOON] = {gBallGfx_Moon, 384, GFX_TAG_MOON_BALL}, + [BALL_FRIEND] = {gBallGfx_Friend, 384, GFX_TAG_FRIEND_BALL}, + [BALL_LOVE] = {gBallGfx_Love, 384, GFX_TAG_LOVE_BALL}, + [BALL_FAST] = {gBallGfx_Fast, 384, GFX_TAG_FAST_BALL}, + [BALL_HEAVY] = {gBallGfx_Heavy, 384, GFX_TAG_HEAVY_BALL}, + [BALL_DREAM] = {gBallGfx_Dream, 384, GFX_TAG_DREAM_BALL}, + [BALL_SAFARI] = {gBallGfx_Safari, 384, GFX_TAG_SAFARI_BALL}, + [BALL_SPORT] = {gBallGfx_Sport, 384, GFX_TAG_SPORT_BALL}, + [BALL_PARK] = {gBallGfx_Park, 384, GFX_TAG_PARK_BALL}, + [BALL_BEAST] = {gBallGfx_Beast, 384, GFX_TAG_BEAST_BALL}, + [BALL_CHERISH] = {gBallGfx_Cherish, 384, GFX_TAG_CHERISH_BALL}, }; const struct CompressedSpritePalette gBallSpritePalettes[POKEBALL_COUNT] = { [BALL_POKE] = {gBallPal_Poke, GFX_TAG_POKE_BALL}, [BALL_GREAT] = {gBallPal_Great, GFX_TAG_GREAT_BALL}, - [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL}, [BALL_ULTRA] = {gBallPal_Ultra, GFX_TAG_ULTRA_BALL}, [BALL_MASTER] = {gBallPal_Master, GFX_TAG_MASTER_BALL}, - [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL}, - [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL}, - [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL}, - [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL}, - [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL}, - [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL}, [BALL_PREMIER] = {gBallPal_Premier, GFX_TAG_PREMIER_BALL}, + [BALL_HEAL] = {gBallPal_Heal, GFX_TAG_HEAL_BALL}, + [BALL_NET] = {gBallPal_Net, GFX_TAG_NET_BALL}, + [BALL_NEST] = {gBallPal_Nest, GFX_TAG_NEST_BALL}, + [BALL_DIVE] = {gBallPal_Dive, GFX_TAG_DIVE_BALL}, + [BALL_DUSK] = {gBallPal_Dusk, GFX_TAG_DUSK_BALL}, + [BALL_TIMER] = {gBallPal_Timer, GFX_TAG_TIMER_BALL}, + [BALL_QUICK] = {gBallPal_Quick, GFX_TAG_QUICK_BALL}, + [BALL_REPEAT] = {gBallPal_Repeat, GFX_TAG_REPEAT_BALL}, + [BALL_LUXURY] = {gBallPal_Luxury, GFX_TAG_LUXURY_BALL}, + [BALL_LEVEL] = {gBallPal_Level, GFX_TAG_LEVEL_BALL}, + [BALL_LURE] = {gBallPal_Lure, GFX_TAG_LURE_BALL}, + [BALL_MOON] = {gBallPal_Moon, GFX_TAG_MOON_BALL}, + [BALL_FRIEND] = {gBallPal_Friend, GFX_TAG_FRIEND_BALL}, + [BALL_LOVE] = {gBallPal_Love, GFX_TAG_LOVE_BALL}, + [BALL_FAST] = {gBallPal_Fast, GFX_TAG_FAST_BALL}, + [BALL_HEAVY] = {gBallPal_Heavy, GFX_TAG_HEAVY_BALL}, + [BALL_DREAM] = {gBallPal_Dream, GFX_TAG_DREAM_BALL}, + [BALL_SAFARI] = {gBallPal_Safari, GFX_TAG_SAFARI_BALL}, + [BALL_SPORT] = {gBallPal_Sport, GFX_TAG_SPORT_BALL}, + [BALL_PARK] = {gBallPal_Park, GFX_TAG_PARK_BALL}, + [BALL_BEAST] = {gBallPal_Beast, GFX_TAG_BEAST_BALL}, + [BALL_CHERISH] = {gBallPal_Cherish, GFX_TAG_CHERISH_BALL}, }; static const struct OamData sBallOamData = @@ -221,16 +266,6 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_SAFARI] = - { - .tileTag = GFX_TAG_SAFARI_BALL, - .paletteTag = GFX_TAG_SAFARI_BALL, - .oam = &sBallOamData, - .anims = sBallAnimSequences, - .images = NULL, - .affineAnims = sAffineAnim_BallRotate, - .callback = SpriteCB_BallThrow, - }, [BALL_ULTRA] = { .tileTag = GFX_TAG_ULTRA_BALL, @@ -251,20 +286,30 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_NET] = + [BALL_PREMIER] = { - .tileTag = GFX_TAG_NET_BALL, - .paletteTag = GFX_TAG_NET_BALL, + .tileTag = GFX_TAG_PREMIER_BALL, + .paletteTag = GFX_TAG_PREMIER_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_DIVE] = + [BALL_HEAL] = { - .tileTag = GFX_TAG_DIVE_BALL, - .paletteTag = GFX_TAG_DIVE_BALL, + .tileTag = GFX_TAG_HEAL_BALL, + .paletteTag = GFX_TAG_HEAL_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_NET] = + { + .tileTag = GFX_TAG_NET_BALL, + .paletteTag = GFX_TAG_NET_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -281,10 +326,20 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_REPEAT] = + [BALL_DIVE] = { - .tileTag = GFX_TAG_REPEAT_BALL, - .paletteTag = GFX_TAG_REPEAT_BALL, + .tileTag = GFX_TAG_DIVE_BALL, + .paletteTag = GFX_TAG_DIVE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_DUSK] = + { + .tileTag = GFX_TAG_DUSK_BALL, + .paletteTag = GFX_TAG_DUSK_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -301,6 +356,26 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, + [BALL_QUICK] = + { + .tileTag = GFX_TAG_QUICK_BALL, + .paletteTag = GFX_TAG_QUICK_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_REPEAT] = + { + .tileTag = GFX_TAG_REPEAT_BALL, + .paletteTag = GFX_TAG_REPEAT_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, [BALL_LUXURY] = { .tileTag = GFX_TAG_LUXURY_BALL, @@ -311,10 +386,130 @@ const struct SpriteTemplate gBallSpriteTemplates[POKEBALL_COUNT] = .affineAnims = sAffineAnim_BallRotate, .callback = SpriteCB_BallThrow, }, - [BALL_PREMIER] = + [BALL_LEVEL] = { - .tileTag = GFX_TAG_PREMIER_BALL, - .paletteTag = GFX_TAG_PREMIER_BALL, + .tileTag = GFX_TAG_LEVEL_BALL, + .paletteTag = GFX_TAG_LEVEL_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_LURE] = + { + .tileTag = GFX_TAG_LURE_BALL, + .paletteTag = GFX_TAG_LURE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_MOON] = + { + .tileTag = GFX_TAG_MOON_BALL, + .paletteTag = GFX_TAG_MOON_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_FRIEND] = + { + .tileTag = GFX_TAG_FRIEND_BALL, + .paletteTag = GFX_TAG_FRIEND_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_LOVE] = + { + .tileTag = GFX_TAG_LOVE_BALL, + .paletteTag = GFX_TAG_LOVE_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_FAST] = + { + .tileTag = GFX_TAG_FAST_BALL, + .paletteTag = GFX_TAG_FAST_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_HEAVY] = + { + .tileTag = GFX_TAG_HEAVY_BALL, + .paletteTag = GFX_TAG_HEAVY_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_DREAM] = + { + .tileTag = GFX_TAG_DREAM_BALL, + .paletteTag = GFX_TAG_DREAM_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_SAFARI] = + { + .tileTag = GFX_TAG_SAFARI_BALL, + .paletteTag = GFX_TAG_SAFARI_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_SPORT] = + { + .tileTag = GFX_TAG_SPORT_BALL, + .paletteTag = GFX_TAG_SPORT_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_PARK] = + { + .tileTag = GFX_TAG_PARK_BALL, + .paletteTag = GFX_TAG_PARK_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_BEAST] = + { + .tileTag = GFX_TAG_BEAST_BALL, + .paletteTag = GFX_TAG_BEAST_BALL, + .oam = &sBallOamData, + .anims = sBallAnimSequences, + .images = NULL, + .affineAnims = sAffineAnim_BallRotate, + .callback = SpriteCB_BallThrow, + }, + [BALL_CHERISH] = + { + .tileTag = GFX_TAG_CHERISH_BALL, + .paletteTag = GFX_TAG_CHERISH_BALL, .oam = &sBallOamData, .anims = sBallAnimSequences, .images = NULL, @@ -1323,11 +1518,10 @@ void LoadBallGfx(u8 ballId) switch (ballId) { - case BALL_DIVE: - case BALL_LUXURY: - case BALL_PREMIER: - break; - default: + case BALL_POKE ... BALL_MASTER: + case BALL_NET ... BALL_NEST: + case BALL_REPEAT: + case BALL_SAFARI: var = GetSpriteTileStartByTag(gBallSpriteSheets[ballId].tag); LZDecompressVram(gOpenPokeballGfx, (void *)(OBJ_VRAM0 + 0x100 + var * 32)); break; @@ -1342,9 +1536,17 @@ void FreeBallGfx(u8 ballId) static u16 GetBattlerPokeballItemId(u8 battlerId) { + struct Pokemon *mon, *illusionMon; + if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; else - return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + + illusionMon = GetIllusionMonPtr(battlerId); + if (illusionMon != NULL) + mon = illusionMon; + + return GetMonData(mon, MON_DATA_POKEBALL); } diff --git a/src/pokedex_screen.c b/src/pokedex_screen.c index 329e7ecc5..c6761b019 100644 --- a/src/pokedex_screen.c +++ b/src/pokedex_screen.c @@ -2867,7 +2867,7 @@ void DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y) { printerTemplate.currentChar = gSpeciesInfo[species].description; printerTemplate.windowId = windowId; - printerTemplate.fontId = FONT_NORMAL; + printerTemplate.fontId = FONT_SMALL; printerTemplate.letterSpacing = 1; printerTemplate.lineSpacing = 0; printerTemplate.unk = 0; @@ -2875,7 +2875,7 @@ void DexScreen_PrintMonFlavorText(u8 windowId, u16 species, u8 x, u8 y) printerTemplate.bgColor = 0; printerTemplate.shadowColor = 2; - length = GetStringWidth(FONT_NORMAL, gSpeciesInfo[species].description, 0); + length = GetStringWidth(FONT_SMALL, gSpeciesInfo[species].description, 0); xCenter = x + (240 - length) / 2; if (xCenter > 0) @@ -2954,7 +2954,7 @@ static u8 DexScreen_DrawMonDexPage(bool8 justRegistered) // Dex entry FillWindowPixelBuffer(sPokedexScreenData->windowIds[2], PIXEL_FILL(0)); - DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 8); + DexScreen_PrintMonFlavorText(sPokedexScreenData->windowIds[2], sPokedexScreenData->dexSpecies, 0, 1); PutWindowTilemap(sPokedexScreenData->windowIds[2]); CopyWindowToVram(sPokedexScreenData->windowIds[2], COPYWIN_GFX); diff --git a/src/pokemon.c b/src/pokemon.c index be8687a82..f3fb7fd4e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -61,7 +61,6 @@ EWRAM_DATA struct SpriteTemplate gMultiuseSpriteTemplate = {0}; static EWRAM_DATA struct MonSpritesGfxManager *sMonSpritesGfxManager = NULL; static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 personality, u8 substructType); -static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality); static bool8 PartyMonHasStatus(struct Pokemon *mon, u32 unused, u32 healMask, u8 battleId); static bool8 IsPokemonStorageFull(void); static u8 CopyMonToPC(struct Pokemon *mon); @@ -5546,18 +5545,7 @@ void SetWildMonHeldItem(void) bool8 IsMonShiny(struct Pokemon *mon) { - u32 otId = GetMonData(mon, MON_DATA_OT_ID, NULL); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); - return IsShinyOtIdPersonality(otId, personality); -} - -static bool8 IsShinyOtIdPersonality(u32 otId, u32 personality) -{ - bool8 retVal = FALSE; - u32 shinyValue = GET_SHINY_VALUE(otId, personality); - if (shinyValue < SHINY_ODDS) - retVal = TRUE; - return retVal; + return GetMonData(mon, MON_DATA_IS_SHINY, NULL); } u8 *GetTrainerPartnerName(void) diff --git a/src/tm_case.c b/src/tm_case.c index b07261853..07926058f 100644 --- a/src/tm_case.c +++ b/src/tm_case.c @@ -25,9 +25,6 @@ #include "constants/songs.h" #include "constants/quest_log.h" -// Any item in the TM Case with nonzero importance is considered an HM -#define IS_HM(itemId) (ItemId_GetImportance(itemId) != 0) - #define TAG_SCROLL_ARROW 110 enum { @@ -679,7 +676,7 @@ static void InitTMCaseListMenuItems(void) static void GetTMNumberAndMoveString(u8 * dest, u16 itemId) { StringCopy(gStringVar4, gText_FontSmall); - if (itemId >= ITEM_HM01) + if (IsItemHM(itemId)) { StringAppend(gStringVar4, sText_ClearTo18); StringAppend(gStringVar4, gText_NumberClear01); @@ -720,10 +717,18 @@ static void List_ItemPrintFunc(u8 windowId, u32 itemIndex, u8 y) { if (itemIndex != LIST_CANCEL) { - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex))) + u16 itemId = BagGetItemIdByPocketPosition(POCKET_TM_CASE, itemIndex); + if (!IsItemHM(itemId)) { - ConvertIntToDecimalStringN(gStringVar1, BagGetQuantityByPocketPosition(POCKET_TM_CASE, itemIndex), STR_CONV_MODE_RIGHT_ALIGN, 3); - StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + if (!ItemId_GetImportance(itemId)) + { + ConvertIntToDecimalStringN(gStringVar1, BagGetQuantityByPocketPosition(POCKET_TM_CASE, itemIndex), STR_CONV_MODE_RIGHT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + } + else + { + StringCopy(gStringVar4, gText_EmptyString3); + } TMCase_Print(windowId, FONT_SMALL, gStringVar4, 126, y, 0, 0, TEXT_SKIP_DRAW, COLOR_DARK); } else @@ -982,7 +987,7 @@ static void Task_SelectedTMHM_Field(u8 taskId) StringAppend(strbuf, gText_Var1IsSelected + 2); // +2 skips over the stringvar TMCase_Print(WIN_SELECTED_MSG, FONT_NORMAL, strbuf, 0, 2, 1, 0, 0, COLOR_DARK); Free(strbuf); - if (IS_HM(gSpecialVar_ItemId)) + if (IsItemHM(gSpecialVar_ItemId)) { PlaceHMTileInWindow(WIN_SELECTED_MSG, 0, 2); CopyWindowToVram(WIN_SELECTED_MSG, COPYWIN_GFX); @@ -1050,7 +1055,7 @@ static void Action_Give(u8 taskId) PutWindowTilemap(WIN_MOVE_INFO); ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(1); - if (!IS_HM(itemId)) + if (!ItemId_GetImportance(itemId)) { if (CalculatePlayerPartyCount() == 0) { @@ -1127,7 +1132,7 @@ static void Task_SelectedTMHM_GiveParty(u8 taskId) { s16 * data = gTasks[taskId].data; - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) + if (!ItemId_GetImportance(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_GiveHoldItem; Task_BeginFadeOutFromTMCase(taskId); @@ -1143,7 +1148,7 @@ static void Task_SelectedTMHM_GivePC(u8 taskId) { s16 * data = gTasks[taskId].data; - if (!IS_HM(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) + if (!ItemId_GetImportance(BagGetItemIdByPocketPosition(POCKET_TM_CASE, tSelection))) { sTMCaseDynamicResources->nextScreenCallback = CB2_ReturnToPokeStorage; Task_BeginFadeOutFromTMCase(taskId); @@ -1159,7 +1164,7 @@ static void Task_SelectedTMHM_Sell(u8 taskId) { s16 * data = gTasks[taskId].data; - if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) + if (ItemId_GetImportance(gSpecialVar_ItemId)) { // Can't sell TM/HMs with no price (by default this is just the HMs) CopyItemName(gSpecialVar_ItemId, gStringVar1);