diff --git a/include/config/overworld.h b/include/config/overworld.h index 6b4bca75b6..856d2c37f7 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -37,13 +37,14 @@ // Follower Pokémon #define OW_FOLLOWERS_ENABLED TRUE // Enables follower Pokémon, HGSS style. #define OW_MON_BOBBING TRUE // If true, follower pokemon will bob up and down during their idle & walking animations -#define LARGE_OW_SUPPORT TRUE // If true, adds a small amount of overhead to OW code so that large (48x48, 64x64) OWs will display correctly under bridges, etc. +#define OW_LARGE_OW_SUPPORT TRUE // If true, adds a small amount of overhead to OW code so that large (48x48, 64x64) OWs will display correctly under bridges, etc. #define OW_FOLLOWERS_SHARE_PALETTE FALSE // [WIP!! NOT ALL PALETTES HAVE BEEN ADJUSTED FOR THIS!!] If TRUE, follower palettes are taken from battle sprites. #define OW_MON_POKEBALLS TRUE // Followers will emerge from the pokeball they are stored in, instead of a normal pokeball #define OW_GFX_COMPRESS TRUE // Adds support for compressed OW graphics, (Also compresses pokemon follower graphics). // Compressed gfx are incompatible with non-power-of-two sprite sizes: // (You should not use 48x48 sprites/tables for compressed gfx) // 16x32, 32x32, 64x64 etc are fine +#define OW_SUBSTITUTE_PLACEHOLDER TRUE // Use a substitute OW for Pokémon that are missing overworld sprites // Out-of-battle Ability effects #define OW_SYNCHRONIZE_NATURE GEN_LATEST // In Gen8+, if a Pokémon with Synchronize leads the party, wild Pokémon will always have their same Nature as opposed to the 50% chance in previous games. Gift Pokémon excluded. diff --git a/src/data/object_events/object_event_subsprites.h b/src/data/object_events/object_event_subsprites.h index 6bdece8ef1..a2c1b1103a 100755 --- a/src/data/object_events/object_event_subsprites.h +++ b/src/data/object_events/object_event_subsprites.h @@ -1416,7 +1416,7 @@ static const struct SubspriteTable sOamTables_88x32[] = { {ARRAY_COUNT(sOamTable_88x32_3), sOamTable_88x32_3} }; -#if LARGE_OW_SUPPORT +#if OW_LARGE_OW_SUPPORT // These tables allow (virtual) sprite sizes so that // some space can be saved by making graphics smaller. // Note: When using these for followers, the minimum diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 8e68390ecc..c57732ef9d 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1890,10 +1890,12 @@ static const struct ObjectEventGraphicsInfo *SpeciesToGraphicsInfo(u16 species, break; } // Try to avoid OOB or undefined access - if (graphicsInfo->tileTag == 0 && species < NUM_SPECIES) - return &gSpeciesInfo[SPECIES_NONE].followerData; - else if (graphicsInfo->tileTag != TAG_NONE && species >= NUM_SPECIES) - return &gSpeciesInfo[SPECIES_NONE].followerData; + if ((graphicsInfo->tileTag == 0 && species < NUM_SPECIES) || (graphicsInfo->tileTag != TAG_NONE && species >= NUM_SPECIES)) + { + if (OW_SUBSTITUTE_PLACEHOLDER) + return &gSpeciesInfo[SPECIES_NONE].followerData; + return NULL; + } #endif return graphicsInfo; } @@ -1983,7 +1985,7 @@ static void RefreshFollowerGraphics(struct ObjectEvent *objEvent) if (graphicsInfo->oam->size != sprite->oam.size) { - if (LARGE_OW_SUPPORT && !OW_GFX_COMPRESS) + if (OW_LARGE_OW_SUPPORT && !OW_GFX_COMPRESS) ReallocSpriteTiles(sprite, graphicsInfo->images->size); // Add difference in Y vectors sprite->y += -(graphicsInfo->height >> 1) - sprite->centerToCornerVecY; @@ -2077,7 +2079,8 @@ void UpdateFollowingPokemon(void) // 3. flag is set if (OW_FOLLOWERS_ENABLED == FALSE || !GetFollowerInfo(&species, &form, &shiny) - || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, 0)->oam->size > ST_OAM_SIZE_2) + || SpeciesToGraphicsInfo(species, form) == NULL + || (gMapHeader.mapType == MAP_TYPE_INDOOR && SpeciesToGraphicsInfo(species, form)->oam->size > ST_OAM_SIZE_2) || FlagGet(FLAG_TEMP_HIDE_FOLLOWER)) { RemoveFollowingPokemon(); @@ -2636,7 +2639,7 @@ static void ObjectEventSetGraphics(struct ObjectEvent *objectEvent, const struct UpdateSpritePalette(&sObjectEventSpritePalettes[i], sprite); // If gfx size changes, we need to reallocate tiles - if (LARGE_OW_SUPPORT && !OW_GFX_COMPRESS && graphicsInfo->oam->size != sprite->oam.size) + if (OW_LARGE_OW_SUPPORT && !OW_GFX_COMPRESS && graphicsInfo->oam->size != sprite->oam.size) ReallocSpriteTiles(sprite, graphicsInfo->images->size); #if OW_GFX_COMPRESS @@ -7147,7 +7150,7 @@ bool8 MovementAction_ExitPokeball_Step1(struct ObjectEvent *objectEvent, struct LoadFillColorPalette(RGB_WHITE, OBJ_EVENT_PAL_TAG_WHITE, sprite); // Initialize affine animation sprite->affineAnims = sAffineAnims_PokeballFollower; - if (LARGE_OW_SUPPORT && !IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + if (OW_LARGE_OW_SUPPORT && !IS_POW_OF_TWO(-sprite->centerToCornerVecX)) return FALSE; sprite->affineAnims = sAffineAnims_PokeballFollower; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; @@ -7194,7 +7197,7 @@ bool8 MovementAction_EnterPokeball_Step1(struct ObjectEvent *objectEvent, struct sprite->subspriteTableNum = 0; // Only do affine if sprite width is power of 2 // (effect looks weird on sprites composed of subsprites like 48x48, etc) - if (LARGE_OW_SUPPORT && !IS_POW_OF_TWO(-sprite->centerToCornerVecX)) + if (OW_LARGE_OW_SUPPORT && !IS_POW_OF_TWO(-sprite->centerToCornerVecX)) return FALSE; sprite->affineAnims = sAffineAnims_PokeballFollower; sprite->oam.affineMode = ST_OAM_AFFINE_NORMAL; @@ -9237,7 +9240,7 @@ static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, { // keep subspriteMode synced with player's // so that it disappears under bridges when they do - if (LARGE_OW_SUPPORT) + if (OW_LARGE_OW_SUPPORT) sprite->subspriteMode |= gSprites[gPlayerAvatar.spriteId].subspriteMode & SUBSPRITES_IGNORE_PRIORITY; // if transitioning between elevations, use the player's elevation if (!objEvent->currentElevation) @@ -9269,7 +9272,7 @@ void ObjectEventUpdateElevation(struct ObjectEvent *objEvent, struct Sprite *spr { // Ignore subsprite priorities under bridges // so all subsprites will display below it - if (LARGE_OW_SUPPORT) + if (OW_LARGE_OW_SUPPORT) sprite->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; return; } @@ -9667,7 +9670,7 @@ static void DoGroundEffects_OnSpawn(struct ObjectEvent *objEvent, struct Sprite #endif { flags = 0; - if (LARGE_OW_SUPPORT && !sprite->oam.affineMode) + if (OW_LARGE_OW_SUPPORT && !sprite->oam.affineMode) sprite->subspriteMode = SUBSPRITES_ON; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnSpawn(objEvent, &flags); @@ -9689,7 +9692,7 @@ static void DoGroundEffects_OnBeginStep(struct ObjectEvent *objEvent, struct Spr #endif { flags = 0; - if (LARGE_OW_SUPPORT && !sprite->oam.affineMode) + if (OW_LARGE_OW_SUPPORT && !sprite->oam.affineMode) sprite->subspriteMode = SUBSPRITES_ON; UpdateObjectEventElevationAndPriority(objEvent, sprite); GetAllGroundEffectFlags_OnBeginStep(objEvent, &flags); diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index f45b29686a..1991892a50 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -353,7 +353,7 @@ u32 FldEff_Shadow(void) gSprites[spriteId].sLocalId = gFieldEffectArguments[0]; gSprites[spriteId].sMapNum = gFieldEffectArguments[1]; gSprites[spriteId].sMapGroup = gFieldEffectArguments[2]; - #if LARGE_OW_SUPPORT + #if OW_LARGE_OW_SUPPORT gSprites[spriteId].sYOffset = gShadowVerticalOffsets[graphicsInfo->shadowSize]; #else gSprites[spriteId].sYOffset = (graphicsInfo->height >> 1) - gShadowVerticalOffsets[graphicsInfo->shadowSize]; @@ -376,7 +376,7 @@ void UpdateShadowFieldEffect(struct Sprite *sprite) struct Sprite *linkedSprite = &gSprites[objectEvent->spriteId]; sprite->oam.priority = linkedSprite->oam.priority; sprite->x = linkedSprite->x; - #if LARGE_OW_SUPPORT + #if OW_LARGE_OW_SUPPORT // Read 'live' size from linked sprite sprite->y = linkedSprite->y - linkedSprite->centerToCornerVecY - sprite->sYOffset; #else