add dexnav

This commit is contained in:
ghoulslash 2021-04-02 12:28:00 -06:00
parent a0b3d4df12
commit 5e948e746b
54 changed files with 3163 additions and 70 deletions

View File

@ -1060,3 +1060,5 @@ Common_EventScript_LegendaryFlewAway:: @ 8273776
.include "data/text/frontier_brain.inc"
.include "data/text/save.inc"
.include "data/text/birch_speech.inc"
.include "data/scripts/dexnav.inc"

View File

@ -24,9 +24,9 @@ gFieldEffectScriptPointers:: @ 82DB9D4
.4byte gFieldEffectScript_JumpSmallSplash @ FLDEFF_JUMP_SMALL_SPLASH
.4byte gFieldEffectScript_LongGrass @ FLDEFF_LONG_GRASS
.4byte gFieldEffectScript_JumpLongGrass @ FLDEFF_JUMP_LONG_GRASS
.4byte gFieldEffectScript_UnusedGrass @ FLDEFF_UNUSED_GRASS
.4byte gFieldEffectScript_UnusedGrass2 @ FLDEFF_UNUSED_GRASS_2
.4byte gFieldEffectScript_UnusedSand @ FLDEFF_UNUSED_SAND
.4byte gFieldEffectScript_ShakingGrass @ FLDEFF_SHAKING_GRASS
.4byte gFieldEffectScript_ShakingGrass2 @ FLDEFF_SHAKING_LONG_GRASS
.4byte gFieldEffectScript_UnusedSand @ FLDEFF_SAND_HOLE
.4byte gFieldEffectScript_WaterSurfacing @ FLDEFF_WATER_SURFACING
.4byte gFieldEffectScript_BerryTreeGrowthSparkle @ FLDEFF_BERRY_TREE_GROWTH_SPARKLE
.4byte gFieldEffectScript_DeepSandFootprints @ FLDEFF_DEEP_SAND_FOOTPRINTS
@ -72,7 +72,8 @@ gFieldEffectScriptPointers:: @ 82DB9D4
.4byte gFieldEffectScript_RayquazaSpotlight @ FLDEFF_RAYQUAZA_SPOTLIGHT
.4byte gFieldEffectScript_DestroyDeoxysRock @ FLDEFF_DESTROY_DEOXYS_ROCK
.4byte gFieldEffectScript_MoveDeoxysRock @ FLDEFF_MOVE_DEOXYS_ROCK
.4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST
gFieldEffectScript_ExclamationMarkIcon1:: @ 82DBAE0
field_eff_callnative FldEff_ExclamationMarkIcon
field_eff_end
@ -149,12 +150,12 @@ gFieldEffectScript_JumpLongGrass:: @ 82DBB74
field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_JumpLongGrass
field_eff_end
gFieldEffectScript_UnusedGrass:: @ 82DBB7E
field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass
gFieldEffectScript_ShakingGrass:: @ 82DBB7E
field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShakingGrass
field_eff_end
gFieldEffectScript_UnusedGrass2:: @ 82DBB88
field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_UnusedGrass2
gFieldEffectScript_ShakingGrass2:: @ 82DBB88
field_eff_loadfadedpal_callnative gSpritePalette_GeneralFieldEffect1, FldEff_ShakingGrass2
field_eff_end
gFieldEffectScript_UnusedSand:: @ 82DBB92
@ -343,3 +344,8 @@ gFieldEffectScript_DestroyDeoxysRock:: @ 82DBCF9
gFieldEffectScript_MoveDeoxysRock:: @ 82DBCFF
field_eff_callnative FldEff_MoveDeoxysRock
field_eff_end
@ NEW
gFieldEffectScript_CaveDust::
field_eff_loadfadedpal_callnative gSpritePalette_CaveDust FldEff_CaveDust
field_eff_end

47
data/scripts/dexnav.inc Normal file
View File

@ -0,0 +1,47 @@
EventScript_StartDexNavBattle::
lock
playse 0x15
applymovement OBJ_EVENT_ID_PLAYER Common_Movement_ExclamationMark
waitmovement 0
waitse
dowildbattle
release
end
EventScript_NotFoundNearby::
msgbox sText_NotFoundNearby, MSGBOX_SIGN
end
sText_NotFoundNearby:
.string "It couldn't be found nearby.\n"
.string "Try looking in a different area!$"
EventScript_MovedTooFast::
msgbox sText_TryMovingSlower, MSGBOX_SIGN
end
sText_TryMovingSlower:
.string "The Pokémon got away!\n"
.string "Try moving more slowly.$"
EventScript_PokemonGotAway::
msgbox sText_PokemonGotAway, MSGBOX_SIGN
end
sText_PokemonGotAway:
.string "The Pokémon got away!$"
EventScript_LostSignal::
msgbox sText_LostSignal, MSGBOX_SIGN
end
sText_LostSignal:
.string "There is no reaction.\n"
.string "The signal was lost!$"
EventScript_TooDark::
msgbox sText_TooDark, MSGBOX_SIGN
end
sText_TooDark:
.string "It's too dark to search\nfor a Pokémon!$"

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

BIN
graphics/dexnav/cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 B

19
graphics/dexnav/gui.pal Normal file
View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
0 0 0
255 255 255
217 73 73
4 4 4
1 81 113
1 121 193
119 177 75
93 97 101
91 179 211
153 32 32
111 141 81
173 173 173
187 217 167
75 147 189
177 219 235
105 22 22

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
graphics/dexnav/hidden.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

BIN
graphics/dexnav/no_data.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 B

BIN
graphics/dexnav/star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

BIN
graphics/dexnav/vision.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
255 1 255
159 122 85
207 189 157
199 181 149
114 88 61
132 101 70
199 173 141
225 209 193
189 165 133
181 149 115
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

View File

@ -0,0 +1,19 @@
JASC-PAL
0100
16
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 6
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
46 46 46
0 0 0
255 255 255

View File

@ -20,9 +20,9 @@
#define FLDEFF_JUMP_SMALL_SPLASH 16
#define FLDEFF_LONG_GRASS 17
#define FLDEFF_JUMP_LONG_GRASS 18
#define FLDEFF_UNUSED_GRASS 19
#define FLDEFF_UNUSED_GRASS_2 20
#define FLDEFF_UNUSED_SAND 21
#define FLDEFF_SHAKING_GRASS 19
#define FLDEFF_SHAKING_LONG_GRASS 20
#define FLDEFF_SAND_HOLE 21
#define FLDEFF_WATER_SURFACING 22
#define FLDEFF_BERRY_TREE_GROWTH_SPARKLE 23
#define FLDEFF_DEEP_SAND_FOOTPRINTS 24
@ -68,6 +68,7 @@
#define FLDEFF_RAYQUAZA_SPOTLIGHT 64
#define FLDEFF_DESTROY_DEOXYS_ROCK 65
#define FLDEFF_MOVE_DEOXYS_ROCK 66
#define FLDEFF_CAVE_DUST 67
#define FLDEFFOBJ_SHADOW_S 0
#define FLDEFFOBJ_SHADOW_M 1
@ -106,6 +107,7 @@
#define FLDEFFOBJ_BUBBLES 34
#define FLDEFFOBJ_SMALL_SPARKLE 35
#define FLDEFFOBJ_RAYQUAZA 36
#define FLDEFFOBJ_CAVE_DUST 37
#define FLDEFF_PAL_TAG_CUT_GRASS 0x1000
#define FLDEFF_PAL_TAG_SECRET_POWER_TREE 0x1003
@ -119,5 +121,6 @@
#define FLDEFF_PAL_TAG_SMALL_SPARKLE 0x100F
#define FLDEFF_PAL_TAG_HOF_MONITOR 0x1010
#define FLDEFF_PAL_TAG_UNKNOWN 0x1011
#define FLDEFF_PAL_TAG_CAVE_DUST 0x1012
#endif // GUARD_FIELD_EFFECT_CONSTANTS_H

View File

@ -1381,7 +1381,7 @@
#define FLAG_IS_CHAMPION (SYSTEM_FLAGS + 0x1F) // Seems to be related to linking.
#define FLAG_NURSE_UNION_ROOM_REMINDER (SYSTEM_FLAGS + 0x20)
#define FLAG_UNUSED_0x881 (SYSTEM_FLAGS + 0x21) // Unused Flag
#define FLAG_SYS_DEXNAV_SEARCH (SYSTEM_FLAGS + 0x21)
#define FLAG_UNUSED_0x882 (SYSTEM_FLAGS + 0x22) // Unused Flag
#define FLAG_UNUSED_0x883 (SYSTEM_FLAGS + 0x23) // Unused Flag
#define FLAG_UNUSED_0x884 (SYSTEM_FLAGS + 0x24) // Unused Flag
@ -1396,8 +1396,8 @@
#define FLAG_SYS_SAFARI_MODE (SYSTEM_FLAGS + 0x2C)
#define FLAG_SYS_CRUISE_MODE (SYSTEM_FLAGS + 0x2D)
#define FLAG_UNUSED_0x88E (SYSTEM_FLAGS + 0x2E) // Unused Flag
#define FLAG_UNUSED_0x88F (SYSTEM_FLAGS + 0x2F) // Unused Flag
#define FLAG_SYS_DETECTOR_MODE (SYSTEM_FLAGS + 0x2E) // allow player to find hidden mons
#define FLAG_SYS_DEXNAV_GET (SYSTEM_FLAGS + 0x2F) // dexnav shows in start menu
#define FLAG_SYS_TV_HOME (SYSTEM_FLAGS + 0x30)
#define FLAG_SYS_TV_WATCH (SYSTEM_FLAGS + 0x31)

View File

@ -53,8 +53,9 @@
#define GAME_STAT_ENTERED_HOT_SPRINGS 49
#define GAME_STAT_NUM_UNION_ROOM_BATTLES 50
#define GAME_STAT_PLAYED_BERRY_CRUSH 51
#define GAME_STAT_DEXNAV_SCANNED 52
#define NUM_USED_GAME_STATS 52
#define NUM_USED_GAME_STATS 53
#define NUM_GAME_STATS 64
#endif // GUARD_CONSTANTS_GAME_STAT_H

View File

@ -263,8 +263,8 @@
#define VAR_ROXANNE_CALL_STEP_COUNTER 0x40F4
#define VAR_SCOTT_BF_CALL_STEP_COUNTER 0x40F5
#define VAR_RIVAL_RAYQUAZA_CALL_STEP_COUNTER 0x40F6
#define VAR_UNUSED_0x40F7 0x40F7 // Unused Var
#define VAR_UNUSED_0x40F8 0x40F8 // Unused Var
#define VAR_DEXNAV_SPECIES 0x40F7 // Registered dexnav species
#define VAR_DEXNAV_STEP_COUNTER 0x40F8 // steps for finding hidden pokemon
#define VAR_UNUSED_0x40F9 0x40F9 // Unused Var
#define VAR_UNUSED_0x40FA 0x40FA // Unused Var
#define VAR_UNUSED_0x40FB 0x40FB // Unused Var

View File

@ -23,5 +23,6 @@ void SetDaycareCompatibilityString(void);
bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio);
void ShowDaycareLevelMenu(void);
void ChooseSendDaycareMon(void);
u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves);
#endif // GUARD_DAYCARE_H

135
include/dexnav.h Normal file
View File

@ -0,0 +1,135 @@
#ifndef GUARD_DEXNAV_H
#define GUARD_DEXNAV_H
#define DEXNAV_TIMEOUT 15 //15 seconds is the time out. Max of 1092 seconds allowed
#define SNEAKING_PROXIMITY 4 //Tile amount
#define CREEPING_PROXIMITY 2
#define MAX_PROXIMITY 20
#define DEXNAV_CHAIN_MAX 100
//hidden pokemon options - no info so I just guessed at values
#define HIDDEN_MON_STEP_COUNT 100 //look for hidden pokemon every x steps
#define HIDDEN_MON_SEARCH_RATE 25 //x% chance of finding hidden pokemon every x steps
#define HIDDEN_MON_PROBABILTY 15 //x% chance of finding hidden mon compared to regular encounter data
//// SEARCH PROBABILITIES
// see https://m.bulbapedia.bulbagarden.net/wiki/DexNav#Benefits
//Chance of encountering egg move at search levels
#define SEARCHLEVEL0_MOVECHANCE 0
#define SEARCHLEVEL5_MOVECHANCE 21
#define SEARCHLEVEL10_MOVECHANCE 46
#define SEARCHLEVEL25_MOVECHANCE 58
#define SEARCHLEVEL50_MOVECHANCE 63
#define SEARCHLEVEL100_MOVECHANCE 83
//Chance of encountering Hidden Abilities at search levels
#define SEARCHLEVEL0_ABILITYCHANCE 0
#define SEARCHLEVEL5_ABILITYCHANCE 0
#define SEARCHLEVEL10_ABILITYCHANCE 5
#define SEARCHLEVEL25_ABILITYCHANCE 15
#define SEARCHLEVEL50_ABILITYCHANCE 20
#define SEARCHLEVEL100_ABILITYCHANCE 23
//Chance of encountering held item
#define SEARCHLEVEL0_ITEM 0
#define SEARCHLEVEL5_ITEM 0
#define SEARCHLEVEL10_ITEM 1
#define SEARCHLEVEL25_ITEM 7
#define SEARCHLEVEL50_ITEM 6
#define SEARCHLEVEL100_ITEM 12
//Chance of encountering one star potential
#define SEARCHLEVEL0_ONESTAR 0
#define SEARCHLEVEL5_ONESTAR 14
#define SEARCHLEVEL10_ONESTAR 17
#define SEARCHLEVEL25_ONESTAR 17
#define SEARCHLEVEL50_ONESTAR 15
#define SEARCHLEVEL100_ONESTAR 8
//Chance of encountering two star potential
#define SEARCHLEVEL0_TWOSTAR 0
#define SEARCHLEVEL5_TWOSTAR 1
#define SEARCHLEVEL10_TWOSTAR 9
#define SEARCHLEVEL25_TWOSTAR 16
#define SEARCHLEVEL50_TWOSTAR 17
#define SEARCHLEVEL100_TWOSTAR 24
//Chance of encountering three star potential
#define SEARCHLEVEL0_THREESTAR 0
#define SEARCHLEVEL5_THREESTAR 0
#define SEARCHLEVEL10_THREESTAR 1
#define SEARCHLEVEL25_THREESTAR 7
#define SEARCHLEVEL50_THREESTAR 6
#define SEARCHLEVEL100_THREESTAR 12
// GUI Info
#define ROW_WATER 0
#define ROW_LAND_TOP 1
#define ROW_LAND_BOT 2
#define ROW_HIDDEN 3
#define ROWS_COUNT 4
#define ROW_WATER_ICON_X 30
#define ROW_WATER_ICON_Y 35
#define ROW_LAND_ICON_X 20
#define ROW_LAND_TOP_ICON_Y 72
#define ROW_LAND_BOT_ICON_Y (ROW_LAND_TOP_ICON_Y + 28)
#define ROW_HIDDEN_ICON_X 52
#define ROW_HIDDEN_ICON_Y 138
#define ENCOUNTER_TYPE_LAND 0
#define ENCOUNTER_TYPE_WATER 1
#define ENCOUNTER_TYPE_HIDDEN 2 //get from species
#define COL_WATER_COUNT 5
#define COL_LAND_COUNT 6
#define COL_HIDDEN_COUNT 3
#define COL_WATER_MAX (COL_WATER_COUNT - 1)
#define COL_LAND_MAX (COL_LAND_COUNT - 1)
#define COL_HIDDEN_MAX (COL_HIDDEN_COUNT - 1)
// SEARCH INFO
#define SCANSTART_X 0
#define SCANSTART_Y 0
#define SCANSIZE_X 12
#define SCANSIZE_Y 12
#define SPECIES_INFO_Y 5
#define TYPE_ICONS_Y (SPECIES_INFO_Y + 24)
#define SEARCH_LEVEL_Y (TYPE_ICONS_Y + 24)
#define LEVEL_BONUS_Y (SEARCH_LEVEL_Y + 24)
#define HA_INFO_Y (LEVEL_BONUS_Y + 24)
#define MON_LEVEL_NONEXISTENT 255 //if mon not in area GetEncounterLevel returns this to exit the search
// gui tags
#define ICON_PAL_TAG 56000
#define ICON_GFX_TAG 55130
#define SELECTION_CURSOR_TAG 0x4005
#define CAPTURED_ALL_TAG 0x4002
//search tags
#define OWNED_ICON_TAG 0x4003
#define HIDDEN_SEARCH_TAG SELECTION_CURSOR_TAG
#define HIDDEN_MON_ICON_TAG 0x4006
#define LIT_STAR_TILE_TAG 0x4010
//#define SIGHT_TAG 0x5424
#define HELD_ITEM_TAG 0xd750
// dexnav search variable
#define MASK_SPECIES 0x3FFF //first 14 bits
#define MASK_ENVIRONMENT 0xC000 //last two bit
//funcs
void EndDexNavSearch(u8 taskId);
void Task_OpenDexNavFromStartMenu(u8 taskId);
bool8 TryStartDexnavSearch(void);
void TryIncrementSpeciesSearchLevel(u16 dexNum);
void ResetDexNavSearch(void);
bool8 TryFindHiddenPokemon(void);
bool8 DexNavTryMakeShinyMon(void);
//ewram
extern u8 gCurrentDexNavChain;
extern bool8 gDexnavBattle;
#endif //GUARD_DEXNAV_H

View File

@ -610,4 +610,13 @@ extern const u8 EventScript_TradeCenter_Chair0[];
extern const u8 EventScript_ConfirmLeaveTradeRoom[];
extern const u8 EventScript_TerminateLink[];
// Dexnav
extern const u8 EventScript_StartDexNavBattle[];
extern const u8 EventScript_NotFoundNearby[];
extern const u8 EventScript_PokemonGotAway[];
extern const u8 EventScript_LostSignal[];
extern const u8 EventScript_TooDark[];
extern const u8 EventScript_MovedTooFast[];
#endif // GUARD_EVENT_SCRIPTS_H

View File

@ -46,5 +46,8 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b);
void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId);
u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority);
void StartEscapeRopeFieldEffect(void);
void FieldEffectFreeGraphicsResources(struct Sprite *sprite);
void FieldEff_CaveDust(void);
#endif // GUARD_FIELD_EFFECTS_H

View File

@ -251,6 +251,8 @@ enum {
#define PLAYER_AVATAR_FLAG_FORCED_MOVE (1 << 6)
#define PLAYER_AVATAR_FLAG_DASH (1 << 7)
#define PLAYER_AVATAR_FLAG_BIKE (PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)
enum
{
ACRO_BIKE_NORMAL,
@ -303,7 +305,8 @@ struct PlayerAvatar
/*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving.
/*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning.
/*0x04*/ u8 spriteId;
/*0x05*/ u8 objectEventId;
/*0x05*/ u8 objectEventId:7;
u8 creeping:1;
/*0x06*/ bool8 preventStep;
/*0x07*/ u8 gender;
/*0x08*/ u8 acroBikeState; // 00 is normal, 01 is turning, 02 is standing wheelie, 03 is hopping wheelie

View File

@ -1043,6 +1043,8 @@ struct SaveBlock1
/*0x3D5A*/ u8 filler3D5A[0xA];
/*0x3D64*/ struct SaveTrainerHill trainerHill;
/*0x3D70*/ struct WaldaPhrase waldaPhrase;
u8 dexNavSearchLevels[NUM_SPECIES];
u8 dexNavChain;
// sizeof: 0x3D88
};

View File

@ -26,6 +26,11 @@ extern u8 gSelectedMonPartyId;
extern MainCallback gPostMenuFieldCallback;
extern u8 gSelectedOrderFromParty[MAX_FRONTIER_PARTY_SIZE];
extern u8 gBattlePartyCurrentOrder[PARTY_SIZE / 2];
extern const struct SpriteSheet sSpriteSheet_HeldItem;
extern const struct SpritePalette sSpritePalette_HeldItem;
extern const struct SpriteSheet gSpriteSheet_HeldItem;
extern const u16 gHeldItemPalette[];
extern void (*gItemUseCB)(u8, TaskFunc);

View File

@ -204,7 +204,8 @@ struct BaseStats
/* 0x18 */ u8 safariZoneFleeRate;
/* 0x19 */ u8 bodyColor : 7;
u8 noFlip : 1;
};
/* 0x1A */ u8 abilityHidden;
}; /* size = 28 */
struct BattleMove
{

View File

@ -24,5 +24,6 @@ void sub_80D328C(struct Sprite *sprite);
void SpriteCB_MonIcon(struct Sprite *sprite);
void SetPartyHPBarSprite(struct Sprite *sprite, u8 animNum);
u8 GetMonIconPaletteIndexFromSpecies(u16 species);
void SafeFreeMonIconPalette(u16 species);
#endif // GUARD_POKEMON_ICON_H

View File

@ -7,6 +7,8 @@ extern u8 gLastViewedMonIndex;
extern const u8 *const gMoveDescriptionPointers[];
extern const u8 *const gNatureNamePointers[];
extern const struct CompressedSpriteSheet gSpriteSheet_MoveTypes;
extern const struct SpriteTemplate gSpriteTemplate_MoveTypes;
void ShowPokemonSummaryScreen(u8 mode, void *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void));
void ShowSelectMovePokemonSummaryScreen(struct Pokemon *mons, u8 monIndex, u8 maxMonIndex, void (*callback)(void), u16 newMove);

View File

@ -19,5 +19,6 @@ u16 Random2(void);
//Sets the initial seed value of the pseudorandom number generator
void SeedRng(u16 seed);
void SeedRng2(u16 seed);
u16 RandRange(u16 min, u16 max);
#endif // GUARD_RANDOM_H

View File

@ -256,6 +256,7 @@ extern const u8 gText_MenuOption[];
extern const u8 gText_MenuExit[];
extern const u8 gText_MenuRetire[];
extern const u8 gText_MenuRest[];
extern const u8 gText_MenuDexNav[];
extern const u8 gText_Floor1[];
extern const u8 gText_Floor2[];
extern const u8 gText_Floor3[];

View File

@ -24,4 +24,7 @@ const u16 *GetTextWindowPalette(u8 id);
const u16 *GetOverworldTextboxPalettePtr(void);
void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset);
//NEW
void LoadDexNavWindowGfx(u8 windowId, u16 destOffset, u8 palOffset);
#endif // GUARD_TEXT_WINDOW_H

View File

@ -5,6 +5,7 @@
#define WATER_WILD_COUNT 5
#define ROCK_WILD_COUNT 5
#define FISH_WILD_COUNT 10
#define HIDDEN_WILD_COUNT 3
struct WildPokemon
{
@ -26,6 +27,7 @@ struct WildPokemonHeader
const struct WildPokemonInfo *landMonsInfo;
const struct WildPokemonInfo *waterMonsInfo;
const struct WildPokemonInfo *rockSmashMonsInfo;
const struct WildPokemonInfo *hiddenMonsInfo;
const struct WildPokemonInfo *fishingMonsInfo;
};
@ -40,5 +42,10 @@ void FishingWildEncounter(u8 rod);
u16 GetLocalWildMon(bool8 *isWaterMon);
u16 GetLocalWaterMon(void);
bool8 UpdateRepelCounter(void);
void CreateWildMon(u16 species, u8 level);
u16 GetCurrentMapWildMonHeaderId(void);
u8 ChooseWildMonIndex_Land(void);
u8 ChooseWildMonIndex_WaterRock(void);
u8 ChooseHiddenMonIndex(void);
#endif // GUARD_WILD_ENCOUNTER_H

View File

@ -333,6 +333,7 @@ SECTIONS {
src/gym_leader_rematch.o(.text);
src/battle_transition_frontier.o(.text);
src/international_string_util.o(.text);
src/dexnav.o(.text);
} =0
script_data :
@ -691,6 +692,7 @@ SECTIONS {
data/mystery_event.o(.rodata);
src/m4a_tables.o(.rodata);
data/sound_data.o(.rodata);
src/dexnav.o(.rodata);
} =0
song_data :

View File

@ -35,6 +35,7 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_AshLaunch;
const struct SpriteTemplate gFieldEffectObjectTemplate_Bubbles;
const struct SpriteTemplate gFieldEffectObjectTemplate_SmallSparkle;
const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza;
const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust;
const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
[FLDEFFOBJ_SHADOW_S] = &gFieldEffectObjectTemplate_ShadowSmall,
@ -74,4 +75,5 @@ const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[] = {
[FLDEFFOBJ_BUBBLES] = &gFieldEffectObjectTemplate_Bubbles,
[FLDEFFOBJ_SMALL_SPARKLE] = &gFieldEffectObjectTemplate_SmallSparkle,
[FLDEFFOBJ_RAYQUAZA] = &gFieldEffectObjectTemplate_Rayquaza,
[FLDEFFOBJ_CAVE_DUST] = &gFieldEffectObjectTemplate_CaveDust,
};

View File

@ -1287,3 +1287,23 @@ const struct SpriteTemplate gFieldEffectObjectTemplate_Rayquaza = {
};
static const struct SpritePalette sSpritePalette_Unused = {gObjectEventPal_Npc3, FLDEFF_PAL_TAG_UNKNOWN};
// cave dust
static const struct SpriteFrameImage sPicTable_CaveDust[] =
{
overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 0),
overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 1),
overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 2),
overworld_frame(gFieldEffectObjectPic_CaveDust, 2, 2, 3),
};
const struct SpriteTemplate gFieldEffectObjectTemplate_CaveDust = {
.tileTag = 0xFFFF,
.paletteTag = FLDEFF_PAL_TAG_CAVE_DUST,
.oam = &gObjectEventBaseOam_16x16,
.anims = sAnimTable_WaterSurfacing,
.images = sPicTable_CaveDust,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = WaitFieldEffectSpriteAnim,
};
const struct SpritePalette gSpritePalette_CaveDust = {gFieldEffectObjectPalette_CaveDust, FLDEFF_PAL_TAG_CAVE_DUST};

View File

@ -360,3 +360,6 @@ const u32 gObjectEventPic_Lugia[] = INCBIN_U32("graphics/object_events/pics/poke
const u16 gObjectEventPal_Lugia[] = INCBIN_U16("graphics/object_events/palettes/lugia.gbapal");
const u32 gObjectEventPic_HoOh[] = INCBIN_U32("graphics/object_events/pics/pokemon/ho_oh.4bpp");
const u16 gObjectEventPal_HoOh[] = INCBIN_U16("graphics/object_events/palettes/ho_oh.gbapal");
const u32 gFieldEffectObjectPic_CaveDust[] = INCBIN_U32("graphics/field_effects/pics/cave_dust.4bpp");
const u16 gFieldEffectObjectPalette_CaveDust[] = INCBIN_U16("graphics/field_effects/palettes/cave_dust.gbapal");

View File

@ -874,7 +874,7 @@ static const u8 *const sUnionRoomTradeMessages[] =
};
static const u32 sHeldItemGfx[] = INCBIN_U32("graphics/interface/hold_icons.4bpp");
static const u16 sHeldItemPalette[] = INCBIN_U16("graphics/interface/hold_icons.gbapal");
const u16 gHeldItemPalette[] = INCBIN_U16("graphics/interface/hold_icons.gbapal");
static const struct OamData sOamData_HeldItem =
{
@ -911,14 +911,14 @@ static const union AnimCmd *const sSpriteAnimTable_HeldItem[] =
sSpriteAnim_HeldMail,
};
static const struct SpriteSheet sSpriteSheet_HeldItem =
const struct SpriteSheet gSpriteSheet_HeldItem =
{
sHeldItemGfx, sizeof(sHeldItemGfx), 0xd750
};
static const struct SpritePalette sSpritePalette_HeldItem =
{
sHeldItemPalette, 0xd750
gHeldItemPalette, 0xd750
};
static const struct SpriteTemplate sSpriteTemplate_HeldItem =

View File

@ -603,7 +603,7 @@ static void InheritIVs(struct Pokemon *egg, struct DayCare *daycare)
// Counts the number of egg moves a pokemon learns and stores the moves in
// the given array.
static u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves)
u8 GetEggMoves(struct Pokemon *pokemon, u16 *eggMoves)
{
u16 eggMoveIdx;
u16 numEggMoves;

2723
src/dexnav.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -3880,3 +3880,18 @@ static void Task_MoveDeoxysRock(u8 taskId)
}
}
// new
u8 FldEff_CaveDust(void)
{
u8 spriteId;
SetSpritePosToOffsetMapCoords((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8);
spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[FLDEFFOBJ_CAVE_DUST], gFieldEffectArguments[0], gFieldEffectArguments[1], 0xFF);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].coordOffsetEnabled = TRUE;
gSprites[spriteId].data[0] = 22;
}
return spriteId;
}

View File

@ -808,7 +808,7 @@ void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite)
}
}
u32 FldEff_UnusedGrass(void)
u32 FldEff_ShakingGrass(void)
{
u8 spriteId;
struct Sprite *sprite;
@ -820,12 +820,13 @@ u32 FldEff_UnusedGrass(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
sprite->data[0] = FLDEFF_UNUSED_GRASS;
sprite->data[0] = FLDEFF_SHAKING_GRASS;
}
return 0;
return spriteId;
}
u32 FldEff_UnusedGrass2(void)
u32 FldEff_ShakingGrass2(void)
{
u8 spriteId;
struct Sprite *sprite;
@ -837,9 +838,10 @@ u32 FldEff_UnusedGrass2(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
sprite->data[0] = FLDEFF_UNUSED_GRASS_2;
sprite->data[0] = FLDEFF_SHAKING_LONG_GRASS;
}
return 0;
return spriteId;
}
u32 FldEff_UnusedSand(void)
@ -854,9 +856,9 @@ u32 FldEff_UnusedSand(void)
sprite = &gSprites[spriteId];
sprite->coordOffsetEnabled = TRUE;
sprite->oam.priority = gFieldEffectArguments[3];
sprite->data[0] = FLDEFF_UNUSED_SAND;
sprite->data[0] = FLDEFF_SAND_HOLE;
}
return 0;
return spriteId;
}
u32 FldEff_WaterSurfacing(void)
@ -873,7 +875,8 @@ u32 FldEff_WaterSurfacing(void)
sprite->oam.priority = gFieldEffectArguments[3];
sprite->data[0] = FLDEFF_WATER_SURFACING;
}
return 0;
return spriteId;
}
void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 d)
@ -1229,7 +1232,7 @@ u32 FldEff_BerryTreeGrowthSparkle(void)
sprite->oam.paletteNum = 5;
sprite->data[0] = FLDEFF_BERRY_TREE_GROWTH_SPARKLE;
}
return 0;
return spriteId;
}
u32 ShowTreeDisguiseFieldEffect(void)
@ -1346,7 +1349,7 @@ u32 FldEff_Sparkle(void)
gSprites[spriteId].oam.priority = gFieldEffectArguments[2];
gSprites[spriteId].coordOffsetEnabled = TRUE;
}
return 0;
return spriteId;
}
void UpdateSparkleFieldEffect(struct Sprite *sprite)
@ -1605,18 +1608,3 @@ static void sub_81561FC(struct Sprite *sprite, u8 z, u8 offset)
}
}
// Unused data. Feel free to remove.
static const u8 gUnknown_085CDC6E[] =
{
0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x01, 0x02, 0x02,
0x01, 0x02, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x02,
0x01, 0x01, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x01,
0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00,
0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00
};

View File

@ -45,6 +45,7 @@
#include "berry_powder.h"
#include "mevent.h"
#include "union_room_chat.h"
#include "constants/map_groups.h"
extern const u8 EventScript_ResetAllMapFlags[];
@ -206,6 +207,8 @@ void NewGameInitData(void)
WipeTrainerNameRecords();
ResetTrainerHillResults();
ResetContestLinkResults();
memset(gSaveBlock1Ptr->dexNavSearchLevels, 0, sizeof(gSaveBlock1Ptr->dexNavSearchLevels));
gSaveBlock1Ptr->dexNavChain = 0;
}
static void ResetMiniGamesRecords(void)

View File

@ -3985,7 +3985,7 @@ static void ShowOrHideHeldItemSprite(u16 item, struct PartyMenuBox *menuBox)
void LoadHeldItemIcons(void)
{
LoadSpriteSheet(&sSpriteSheet_HeldItem);
LoadSpriteSheet(&gSpriteSheet_HeldItem);
LoadSpritePalette(&sSpritePalette_HeldItem);
}

View File

@ -26,7 +26,7 @@ static u8 CreateMonIconSprite(struct MonIconSpriteTemplate *, s16, s16, u8);
const u8 *const gMonIconTable[] =
{
[SPECIES_NONE] = gMonIcon_Bulbasaur,
[SPECIES_NONE] = gMonIcon_QuestionMark,
[SPECIES_BULBASAUR] = gMonIcon_Bulbasaur,
[SPECIES_IVYSAUR] = gMonIcon_Ivysaur,
[SPECIES_VENUSAUR] = gMonIcon_Venusaur,

View File

@ -851,13 +851,13 @@ static const union AnimCmd *const sSpriteAnimTable_MoveTypes[NUMBER_OF_MON_TYPES
sSpriteAnim_CategoryTough,
};
static const struct CompressedSpriteSheet sSpriteSheet_MoveTypes =
const struct CompressedSpriteSheet gSpriteSheet_MoveTypes =
{
.data = gMoveTypes_Gfx,
.size = (NUMBER_OF_MON_TYPES + CONTEST_CATEGORIES_COUNT) * 0x100,
.tag = TAG_MOVE_TYPES
};
static const struct SpriteTemplate sSpriteTemplate_MoveTypes =
const struct SpriteTemplate gSpriteTemplate_MoveTypes =
{
.tileTag = TAG_MOVE_TYPES,
.paletteTag = TAG_MOVE_TYPES,
@ -1319,7 +1319,7 @@ static bool8 DecompressGraphics(void)
sMonSummaryScreen->switchCounter++;
break;
case 7:
LoadCompressedSpriteSheet(&sSpriteSheet_MoveTypes);
LoadCompressedSpriteSheet(&gSpriteSheet_MoveTypes);
sMonSummaryScreen->switchCounter++;
break;
case 8:
@ -3746,7 +3746,7 @@ static void CreateMoveTypeIcons(void)
for (i = SPRITE_ARR_ID_TYPE; i < SPRITE_ARR_ID_TYPE + 5; i++)
{
if (sMonSummaryScreen->spriteIds[i] == SPRITE_NONE)
sMonSummaryScreen->spriteIds[i] = CreateSprite(&sSpriteTemplate_MoveTypes, 0, 0, 2);
sMonSummaryScreen->spriteIds[i] = CreateSprite(&gSpriteTemplate_MoveTypes, 0, 0, 2);
SetSpriteInvisibility(i, TRUE);
}

View File

@ -31,3 +31,14 @@ u16 Random2(void)
gRng2Value = ISO_RANDOMIZE1(gRng2Value);
return gRng2Value >> 16;
}
// NEW
u16 RandRange(u16 min, u16 max)
{
if (min == max)
return min;
max++; // make inclusive
return (Random() % (max - min)) + min;
}

View File

@ -44,6 +44,7 @@
#include "window.h"
#include "constants/songs.h"
#include "union_room.h"
#include "dexnav.h"
#include "constants/rgb.h"
// Menu actions
@ -61,7 +62,8 @@ enum
MENU_ACTION_PLAYER_LINK,
MENU_ACTION_REST_FRONTIER,
MENU_ACTION_RETIRE_FRONTIER,
MENU_ACTION_PYRAMID_BAG
MENU_ACTION_PYRAMID_BAG,
MENU_ACTION_DEXNAV
};
// Save status
@ -102,6 +104,7 @@ static bool8 StartMenuSafariZoneRetireCallback(void);
static bool8 StartMenuLinkModePlayerNameCallback(void);
static bool8 StartMenuBattlePyramidRetireCallback(void);
static bool8 StartMenuBattlePyramidBagCallback(void);
static bool8 StartMenuDexNavCallback(void);
// Menu callbacks
static bool8 SaveStartCallback(void);
@ -167,7 +170,8 @@ static const struct MenuAction sStartMenuItems[] =
{gText_MenuPlayer, {.u8_void = StartMenuLinkModePlayerNameCallback}},
{gText_MenuRest, {.u8_void = StartMenuSaveCallback}},
{gText_MenuRetire, {.u8_void = StartMenuBattlePyramidRetireCallback}},
{gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}}
{gText_MenuBag, {.u8_void = StartMenuBattlePyramidBagCallback}},
{gText_MenuDexNav, {.u8_void = StartMenuDexNavCallback}}
};
static const struct BgTemplate sBgTemplates_LinkBattleSave[] =
@ -287,22 +291,20 @@ static void AddStartMenuAction(u8 action)
}
static void BuildNormalStartMenu(void)
{
{
if (FlagGet(FLAG_SYS_POKEDEX_GET) == TRUE)
{
AddStartMenuAction(MENU_ACTION_POKEDEX);
}
if (FlagGet(FLAG_SYS_DEXNAV_GET))
AddStartMenuAction(MENU_ACTION_DEXNAV);
if (FlagGet(FLAG_SYS_POKEMON_GET) == TRUE)
{
AddStartMenuAction(MENU_ACTION_POKEMON);
}
AddStartMenuAction(MENU_ACTION_BAG);
if (FlagGet(FLAG_SYS_POKENAV_GET) == TRUE)
{
AddStartMenuAction(MENU_ACTION_POKENAV);
}
AddStartMenuAction(MENU_ACTION_PLAYER);
AddStartMenuAction(MENU_ACTION_SAVE);
@ -586,7 +588,6 @@ static bool8 HandleStartMenuInput(void)
if (GetNationalPokedexCount(FLAG_GET_SEEN) == 0)
return FALSE;
}
gMenuCallback = sStartMenuItems[sCurrentStartMenuActions[sStartMenuCursorPos]].func.u8_void;
if (gMenuCallback != StartMenuSaveCallback
@ -610,7 +611,7 @@ static bool8 HandleStartMenuInput(void)
return FALSE;
}
static bool8 StartMenuPokedexCallback(void)
bool8 StartMenuPokedexCallback(void)
{
if (!gPaletteFade.active)
{
@ -1411,3 +1412,9 @@ void AppendToList(u8 *list, u8 *pos, u8 newEntry)
list[*pos] = newEntry;
(*pos)++;
}
static bool8 StartMenuDexNavCallback(void)
{
CreateTask(Task_OpenDexNavFromStartMenu, 0);
return TRUE;
}

View File

@ -1515,6 +1515,7 @@ const u8 gText_MenuOption[] = _("OPTION");
const u8 gText_MenuExit[] = _("EXIT");
const u8 gText_MenuRetire[] = _("RETIRE");
const u8 gText_MenuRest[] = _("REST");
const u8 gText_MenuDexNav[] = _("DEXNAV");
const u8 gText_SafariBallStock[] = _("SAFARI BALLS\nStock: {STR_VAR_1}");
const u8 gText_BattlePyramidFloor[] = _("Battle Pyramid\n{STR_VAR_1}");
const u8 gText_Floor1[] = _("Floor 1");

View File

@ -82,6 +82,9 @@ static const struct TilesPal sWindowFrames[WINDOW_FRAMES_COUNT] =
{sTextWindowFrame20_Gfx, sTextWindowFrame20_Pal}
};
static const u16 sTextWindowDexnavFrame[] = INCBIN_U16("graphics/text_window/dexnav_pal.gbapal");
static const struct TilesPal sDexnavWindowFrame = {gTextWindowFrame1_Gfx, sTextWindowDexnavFrame};
// code
const struct TilesPal *GetWindowFrameTilesPal(u8 id)
{
@ -195,3 +198,10 @@ void sub_8098C6C(u8 bg, u16 destOffset, u8 palOffset)
LoadBgTiles(bg, sWindowFrames[gSaveBlock2Ptr->optionsWindowFrameType].tiles, 0x120, destOffset);
LoadPalette(GetWindowFrameTilesPal(gSaveBlock2Ptr->optionsWindowFrameType)->pal, palOffset, 0x20);
}
void LoadDexNavWindowGfx(u8 windowId, u16 destOffset, u8 palOffset)
{
LoadBgTiles(GetWindowAttribute(windowId, WINDOW_BG), sDexnavWindowFrame.tiles, 0x120, destOffset);
LoadPalette(sDexnavWindowFrame.pal, palOffset, 32);
}

View File

@ -138,7 +138,7 @@ static void FeebasSeedRng(u16 seed)
sFeebasRngValue = seed;
}
static u8 ChooseWildMonIndex_Land(void)
u8 ChooseWildMonIndex_Land(void)
{
u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;
@ -168,7 +168,7 @@ static u8 ChooseWildMonIndex_Land(void)
return 11;
}
static u8 ChooseWildMonIndex_WaterRock(void)
u8 ChooseWildMonIndex_WaterRock(void)
{
u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;
@ -260,7 +260,7 @@ static u8 ChooseWildMonLevel(const struct WildPokemon *wildPokemon)
return min + rand;
}
static u16 GetCurrentMapWildMonHeaderId(void)
u16 GetCurrentMapWildMonHeaderId(void)
{
u16 i;
@ -334,7 +334,7 @@ static u8 PickWildMonNature(void)
return Random() % NUM_NATURES;
}
static void CreateWildMon(u16 species, u8 level)
void CreateWildMon(u16 species, u8 level)
{
bool32 checkCuteCharm;
@ -919,3 +919,20 @@ static void ApplyCleanseTagEncounterRateMod(u32 *encRate)
if (GetMonData(&gPlayerParty[0], MON_DATA_HELD_ITEM) == ITEM_CLEANSE_TAG)
*encRate = *encRate * 2 / 3;
}
u8 ChooseHiddenMonIndex(void)
{
#ifdef ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL
u8 rand = Random() % ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL;
if (rand < ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0)
return 0;
else if (rand >= ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1)
return 1;
else
return 2;
#else
return 0xFF;
#endif
}

View File

@ -148,3 +148,4 @@
.include "src/faraway_island.o"
.include "src/trainer_hill.o"
.include "src/rayquaza_scene.o"
.include "src/dexnav.o"