diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/field_fadetransition.c | 7 | ||||
-rw-r--r-- | src/fieldmap.c | 100 | ||||
-rw-r--r-- | src/fldeff_cut.c | 299 | ||||
-rw-r--r-- | src/fldeff_dig.c | 2 | ||||
-rw-r--r-- | src/fldeff_rocksmash.c | 44 | ||||
-rw-r--r-- | src/fldeff_strength.c | 2 | ||||
-rw-r--r-- | src/fldeff_sweetscent.c | 2 | ||||
-rw-r--r-- | src/fldeff_teleport.c | 2 | ||||
-rw-r--r-- | src/metatile_behavior.c | 41 | ||||
-rw-r--r-- | src/prof_pc.c | 72 | ||||
-rw-r--r-- | src/quest_log.c | 30 | ||||
-rw-r--r-- | src/sea_cottage_special_anim.c | 262 | ||||
-rw-r--r-- | src/special_field_anim.c | 341 | ||||
-rw-r--r-- | src/wild_encounter.c | 22 |
14 files changed, 791 insertions, 435 deletions
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 6e937e026..16f691a2d 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -22,6 +22,7 @@ #include "event_object_lock.h" #include "start_menu.h" #include "constants/songs.h" +#include "constants/event_object_movement.h" static void sub_807DF4C(u8 a0); static void sub_807DFBC(u8 taskId); @@ -348,7 +349,7 @@ static void sub_807DFBC(u8 taskId) { PlayerGetDestCoords(&task->data[12], &task->data[13]); sub_807DCB0(TRUE); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 8; } break; @@ -372,7 +373,7 @@ static void sub_807DFBC(u8 taskId) if (sub_807E418()) { sub_807DCB0(TRUE); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 16); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->data[0] = 2; } break; @@ -752,7 +753,7 @@ static void sub_807E80C(u8 taskId) if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { ObjectEventClearAnimIfSpecialAnimActive(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)]); - ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], 17); + ObjectEventSetHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(0xFF, 0, 0)], MOVEMENT_ACTION_WALK_NORMAL_UP); task->data[0] = 2; } break; diff --git a/src/fieldmap.c b/src/fieldmap.c index 1f7d8b0b8..60ff70f10 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -16,37 +16,37 @@ struct ConnectionFlags }; static void InitMapLayoutData(struct MapHeader *mapHeader); -void map_copy_with_padding(u16 *map, u16 width, u16 height); -void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader); -void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); -void LoadSavedMapView(void); -struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y); -bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection); -bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset); +static void map_copy_with_padding(u16 *map, u16 width, u16 height); +static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader); +static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset); +static void LoadSavedMapView(void); +static struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y); +static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection); +static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset); struct BackupMapLayout VMap; -EWRAM_DATA u16 gBackupMapLayout[VIRTUAL_MAP_SIZE] = {}; +static EWRAM_DATA u16 gBackupMapLayout[VIRTUAL_MAP_SIZE] = {}; EWRAM_DATA struct MapHeader gMapHeader = {}; EWRAM_DATA struct Camera gCamera = {}; -EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; +static EWRAM_DATA struct ConnectionFlags gMapConnectionFlags = {}; -const struct ConnectionFlags sDummyConnectionFlags = {}; +static const struct ConnectionFlags sDummyConnectionFlags = {}; -const u32 gUnknown_8352EF0[] = { - 0x1ff, - 0x3e00, - 0x3c000, - 0xfc0000, - 0x7000000, +static const u32 sMetatileAttrMasks[] = { + 0x000001ff, + 0x00003e00, + 0x0003c000, + 0x00fc0000, + 0x07000000, 0x18000000, 0x60000000, 0x80000000 }; -const u8 gUnknown_8352F10[] = { +static const u8 sMetatileAttrShifts[] = { 0, 9, 14, @@ -87,7 +87,7 @@ static void InitMapLayoutData(struct MapHeader * mapHeader) mapheader_copy_mapdata_of_adjacent_maps(mapHeader); } -void map_copy_with_padding(u16 *map, u16 width, u16 height) +static void map_copy_with_padding(u16 *map, u16 width, u16 height) { s32 y; u16 *dest = VMap.map; @@ -101,7 +101,7 @@ void map_copy_with_padding(u16 *map, u16 width, u16 height) } } -void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) +static void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) { s32 count; struct MapConnection *connection; @@ -147,7 +147,7 @@ void mapheader_copy_mapdata_of_adjacent_maps(struct MapHeader *mapHeader) } } -void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height) +static void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x2, s32 y2, s32 width, s32 height) { s32 i; u16 *src; @@ -166,7 +166,7 @@ void sub_8058B54(s32 x, s32 y, const struct MapHeader *connectedMapHeader, s32 x } } -void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 x2; @@ -213,7 +213,7 @@ void fillSouthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x; s32 x2, y2; @@ -262,7 +262,7 @@ void fillNorthConnection(struct MapHeader const *mapHeader, struct MapHeader con } } -void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 y; s32 x2, y2; @@ -308,7 +308,7 @@ void fillWestConnection(struct MapHeader const *mapHeader, struct MapHeader cons } } -void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) +static void fillEastConnection(struct MapHeader const *mapHeader, struct MapHeader const *connectedMapHeader, s32 offset) { s32 x, y; s32 y2; @@ -443,28 +443,28 @@ u32 MapGridGetMetatileIdAt(s32 x, s32 y) return block & 0x3FF; } -u32 sub_8058F1C(u32 original, u8 bit) +u32 GetMetatileAttributeFromRawMetatileBehavior(u32 original, u8 bit) { if (bit >= 8) return original; - return (original & gUnknown_8352EF0[bit]) >> gUnknown_8352F10[bit]; + return (original & sMetatileAttrMasks[bit]) >> sMetatileAttrShifts[bit]; } -u32 sub_8058F48(s16 x, s16 y, u8 z) +u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attr) { u16 metatileId = MapGridGetMetatileIdAt(x, y); - return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, z); + return GetBehaviorByMetatileIdAndMapLayout(gMapHeader.mapLayout, metatileId, attr); } u32 MapGridGetMetatileBehaviorAt(s32 x, s32 y) { - return sub_8058F48(x, y, 0); + return MapGridGetMetatileAttributeAt(x, y, 0); } u8 MapGridGetMetatileLayerTypeAt(s16 x, s16 y) { - return sub_8058F48(x, y, 6); + return MapGridGetMetatileAttributeAt(x, y, 6); } void MapGridSetMetatileIdAt(s32 x, s32 y, u16 metatile) @@ -512,12 +512,12 @@ u32 GetBehaviorByMetatileIdAndMapLayout(struct MapLayout *mapLayout, u16 metatil if (metatile < NUM_METATILES_IN_PRIMARY) { attributes = mapLayout->primaryTileset->metatileAttributes; - return sub_8058F1C(attributes[metatile], attr); + return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile], attr); } else if (metatile < 0x400) { attributes = mapLayout->secondaryTileset->metatileAttributes; - return sub_8058F1C(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr); + return GetMetatileAttributeFromRawMetatileBehavior(attributes[metatile - NUM_METATILES_IN_PRIMARY], attr); } else { @@ -544,7 +544,7 @@ void save_serialize_map(void) } } -bool32 SavedMapViewIsEmpty(void) +static bool32 SavedMapViewIsEmpty(void) { u16 i; u32 marker = 0; @@ -559,12 +559,12 @@ bool32 SavedMapViewIsEmpty(void) return FALSE; } -void ClearSavedMapView(void) +static void ClearSavedMapView(void) { CpuFill16(0, gSaveBlock2Ptr->mapView, sizeof(gSaveBlock2Ptr->mapView)); } -void LoadSavedMapView(void) +static void LoadSavedMapView(void) { s32 i, j; s32 x, y; @@ -588,7 +588,7 @@ void LoadSavedMapView(void) } } -void sub_8059250(u8 a1) +static void sub_8059250(u8 a1) { s32 width; u16 *mapView; @@ -690,7 +690,7 @@ s32 GetMapBorderIdAt(s32 x, s32 y) return 0; } -s32 GetPostCameraMoveMapBorderId(s32 x, s32 y) +static s32 GetPostCameraMoveMapBorderId(s32 x, s32 y) { return GetMapBorderIdAt(7 + gSaveBlock1Ptr->pos.x + x, 7 + gSaveBlock1Ptr->pos.y + y); } @@ -708,7 +708,7 @@ bool32 CanCameraMoveInDirection(s32 direction) return TRUE; } -void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y) +static void sub_80594AC(struct MapConnection *connection, int direction, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -779,7 +779,7 @@ struct MapConnection *sub_8059600(u8 direction, s32 x, s32 y) } -bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) +static bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -795,7 +795,7 @@ bool8 sub_8059658(u8 direction, s32 x, s32 y, struct MapConnection *connection) return FALSE; } -bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) +static bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) { s32 offset2 = max(offset, 0); @@ -808,7 +808,7 @@ bool8 sub_80596BC(s32 x, s32 src_width, s32 dest_width, s32 offset) return FALSE; } -bool32 sub_80596E8(s32 x, s32 width) +static bool32 sub_80596E8(s32 x, s32 width) { if (x >= 0 && x < width) return TRUE; @@ -816,7 +816,7 @@ bool32 sub_80596E8(s32 x, s32 width) return FALSE; } -s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y) +static s32 sub_80596FC(struct MapConnection *connection, s32 x, s32 y) { struct MapHeader const *mapHeader; mapHeader = mapconnection_get_mapheader(connection); @@ -878,7 +878,7 @@ void GetCameraFocusCoords(u16 *x, u16 *y) *y = gSaveBlock1Ptr->pos.y + 7; } -void SetCameraCoords(u16 x, u16 y) +static void SetCameraCoords(u16 x, u16 y) { gSaveBlock1Ptr->pos.x = x; gSaveBlock1Ptr->pos.y = y; @@ -889,7 +889,7 @@ void GetCameraCoords(u16 *x, u16 *y) *x = gSaveBlock1Ptr->pos.x; *y = gSaveBlock1Ptr->pos.y; } -void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset) +static void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { @@ -900,7 +900,7 @@ void copy_tileset_patterns_to_vram(struct Tileset const *tileset, u16 numTiles, } } -void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset) +static void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, u16 offset) { if (tileset) { @@ -911,7 +911,7 @@ void copy_tileset_patterns_to_vram2(struct Tileset const *tileset, u16 numTiles, } } -void sub_80598CC(u16 a0, u16 a1) +static void sub_80598CC(u16 a0, u16 a1) { switch (gUnknown_2036E28) { @@ -955,7 +955,7 @@ void sub_8059948(u8 a0, u8 a1) CpuFastCopy(gPlttBufferUnfaded + a0 * 16, gPlttBufferFaded + a0 * 16, a1 * 16 * sizeof(u16)); } -void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) +static void apply_map_tileset_palette(struct Tileset const *tileset, u16 destOffset, u16 size) { u16 black = RGB_BLACK; diff --git a/src/fldeff_cut.c b/src/fldeff_cut.c new file mode 100644 index 000000000..8617a1aaa --- /dev/null +++ b/src/fldeff_cut.c @@ -0,0 +1,299 @@ +#include "global.h" +#include "gflib.h" +#include "event_object_lock.h" +#include "event_object_movement.h" +#include "event_scripts.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "field_specials.h" +#include "fldeff.h" +#include "field_effect.h" +#include "field_player_avatar.h" +#include "metatile_behavior.h" +#include "overworld.h" +#include "party_menu.h" +#include "script.h" +#include "trig.h" +#include "constants/event_objects.h" +#include "constants/songs.h" +#include "constants/metatile_labels.h" + +#define CUT_GRASS_SPRITE_COUNT 8 + +static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL; +static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE; + +static void FieldCallback_CutGrass(void); +static void FieldCallback_CutTree(void); +static void FieldMoveCallback_CutGrass(void); +static void SetCutGrassMetatileAt(s16 x, s16 y); +static void SpriteCallback_CutGrass_Init(struct Sprite * sprite); +static void SpriteCallback_CutGrass_Run(struct Sprite * sprite); +static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite); +static void FieldMoveCallback_CutTree(void); + +static const u16 sCutGrassMetatileMapping[][2] = { + { + METATILE_ID(General, Plain_Grass), + METATILE_ID(General, Plain_Mowed) + }, { + METATILE_ID(General, ThinTreeTop_Grass), + METATILE_ID(General, ThinTreeTop_Mowed) + }, { + METATILE_ID(General, WideTreeTopLeft_Grass), + METATILE_ID(General, WideTreeTopLeft_Mowed) + }, { + METATILE_ID(General, WideTreeTopRight_Grass), + METATILE_ID(General, WideTreeTopRight_Mowed) + }, { + METATILE_ID(CeladonCity, CyclingRoad_Grass), + METATILE_ID(CeladonCity, CyclingRoad_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopLeft_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopMiddle_Mowed) + }, { + METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Grass), + METATILE_ID(FuchsiaCity, SafariZoneTreeTopRight_Mowed) + }, { + METATILE_ID(ViridianForest, HugeTreeTopMiddle_Grass), + METATILE_ID(ViridianForest, HugeTreeTopMiddle_Mowed) + }, { + 0xffff, + 0xffff + } +}; + +static const struct OamData sOamData_FldEff_CutGrass = { + .y = 0, + .affineMode = ST_OAM_AFFINE_OFF, + .objMode = ST_OAM_OBJ_NORMAL, + .mosaic = FALSE, + .bpp = ST_OAM_4BPP, + .shape = SPRITE_SHAPE(8x8), + .x = 0, + .matrixNum = 0, + .size = SPRITE_SIZE(8x8), + .tileNum = 0x001, + .priority = 1, + .paletteNum = 0x1, + .affineParam = 0 +}; + +static const union AnimCmd sSpriteAnim_Fldeff_CutGrass_0[] = { + ANIMCMD_FRAME(0, 30), + ANIMCMD_JUMP(0) +}; + +static const union AnimCmd *const sSpriteAnimTable_FldEff_CutGrass[] = { + sSpriteAnim_Fldeff_CutGrass_0 +}; + +static const struct SpriteFrameImage sSpriteFrameImages_FldEff_CutGrass[] = { + {gUnknown_8398648, 0x20} +}; + +const struct SpritePalette gFldEffPalette_CutGrass[] = { + gUnknown_8398688, 4096 +}; + +static const struct SpriteTemplate sSpriteTemplate_FldEff_CutGrass = { + .tileTag = 0xFFFF, + .paletteTag = 4096, + .oam = &sOamData_FldEff_CutGrass, + .anims = sSpriteAnimTable_FldEff_CutGrass, + .images = sSpriteFrameImages_FldEff_CutGrass, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallback_CutGrass_Init +}; + +static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y) +{ + return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, 1), 1); +} + +bool8 SetUpFieldMove_Cut(void) +{ + s16 x, y; + u8 i, j; + sScheduleOpenDottedHole = FALSE; + if (CutMoveRuinValleyCheck() == TRUE) + { + sScheduleOpenDottedHole = TRUE; + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + return TRUE; + } + + if (CheckObjectGraphicsInFrontOfPlayer(OBJ_EVENT_GFX_CUT_TREE) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutTree; + return TRUE; + } + else + { + // FIXME: this fakematch + register s32 neg1 asm("r8"); + struct MapPosition *pos; + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + + for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++) + { + + y = i + neg1 + pos->y; + for (j = 0; j < 3; j++) + { + x = j + neg1 + pos->x; + if (MapGridGetZCoordAt(x, y) == pos->height) + { + if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) + { + gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu; + gPostMenuFieldCallback = FieldCallback_CutGrass; + return TRUE; + } + } + } + } + return FALSE; + } +} + +static void FieldCallback_CutGrass(void) +{ + FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS); + gFieldEffectArguments[0] = GetCursorSelectionMonId(); +} + +bool8 FldEff_UseCutOnGrass(void) +{ + u8 taskId = CreateFieldEffectShowMon(); + FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutGrass); + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +static void FieldCallback_CutTree(void) +{ + gFieldEffectArguments[0] = GetCursorSelectionMonId(); + ScriptContext1_SetupScript(EventScript_FldEffCut); +} + +bool8 FldEff_UseCutOnTree(void) +{ + u8 taskId = CreateFieldEffectShowMon(); + FLDEFF_SET_FUNC_TO_DATA(FieldMoveCallback_CutTree); + IncrementGameStat(GAME_STAT_USED_CUT); + return FALSE; +} + +static void FieldMoveCallback_CutGrass(void) +{ + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS); + if (sScheduleOpenDottedHole == TRUE) + CutMoveOpenDottedHoleDoor(); + else + FieldEffectStart(FLDEFF_CUT_GRASS); +} + +bool8 FldEff_CutGrass(void) +{ + u8 i, j; + s16 x, y; + // FIXME: this fakematch + register s32 neg1 asm("r9"); + struct MapPosition *pos; + + i = 0; + PlaySE(SE_W015); + PlayerGetDestCoords(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); + + for (i = 0, pos = &gPlayerFacingPosition, neg1 = 0xFFFF; i < 3; i++) + { + + y = i + neg1 + pos->y; + for (j = 0; j < 3; j++) + { + x = j + neg1 + pos->x; + if (MapGridGetZCoordAt(x, y) == pos->height) + { + if (MetatileAtCoordsIsGrassTile(x, y) == TRUE) + { + SetCutGrassMetatileAt(x, y); + sub_805F378(x, y); + } + } + } + } + DrawWholeMapView(); + sCutGrassSpriteArrayPtr = Alloc(CUT_GRASS_SPRITE_COUNT); + for (i = 0; i < 8; i++) + { + sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_FldEff_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0); + gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * (0x100 / CUT_GRASS_SPRITE_COUNT); + } + return FALSE; +} + +static void SetCutGrassMetatileAt(s16 x, s16 y) +{ + u16 i = 0; + u16 metatileId = MapGridGetMetatileIdAt(x, y); + while (1) + { + if (sCutGrassMetatileMapping[i][0] == 0xFFFF) + return; + if (sCutGrassMetatileMapping[i][0] == metatileId) + { + MapGridSetMetatileIdAt(x, y, sCutGrassMetatileMapping[i][1]); + break; + } + i++; + } +} + +static void SpriteCallback_CutGrass_Init(struct Sprite * sprite) +{ + sprite->data[0] = 8; + sprite->data[1] = 0; + sprite->data[3] = 0; + sprite->callback = SpriteCallback_CutGrass_Run; +} + +static void SpriteCallback_CutGrass_Run(struct Sprite * sprite) +{ + sprite->pos2.x = Sin(sprite->data[2], sprite->data[0]); + sprite->pos2.y = Cos(sprite->data[2], sprite->data[0]); + sprite->data[2] += 8; + sprite->data[2] &= 0xFF; + sprite->data[0]++; + sprite->data[0] += sprite->data[3] >> 2; + sprite->data[3]++; + if (sprite->data[1] != 28) + sprite->data[1]++; + else + sprite->callback = SpriteCallback_CutGrass_Cleanup; +} + +static void SpriteCallback_CutGrass_Cleanup(struct Sprite * sprite) +{ + u8 i; + for (i = 1; i < CUT_GRASS_SPRITE_COUNT; i++) + { + DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]); + } + FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS); + Free(sCutGrassSpriteArrayPtr); + sub_80696C0(); + ScriptContext2_Disable(); +} + +static void FieldMoveCallback_CutTree(void) +{ + PlaySE(SE_W015); + FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE); + EnableBothScriptContexts(); +} diff --git a/src/fldeff_dig.c b/src/fldeff_dig.c index 9e1686468..0eb0d3c1e 100644 --- a/src/fldeff_dig.c +++ b/src/fldeff_dig.c @@ -29,7 +29,7 @@ static void FieldCallback_Dig(void) bool8 FldEff_UseDig(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80C9AFC); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); diff --git a/src/fldeff_rocksmash.c b/src/fldeff_rocksmash.c index 058922f06..397741806 100644 --- a/src/fldeff_rocksmash.c +++ b/src/fldeff_rocksmash.c @@ -12,12 +12,13 @@ #include "event_object_movement.h" #include "constants/songs.h" #include "constants/event_objects.h" +#include "constants/event_object_movement.h" #include "constants/maps.h" -static void task08_080C9820(u8 taskId); -static void sub_80C98FC(u8 taskId); -static void sub_80C98B0(u8 taskId); -static void sub_80C99A0(u8 taskId); +static void Task_FieldEffectShowMon_Init(u8 taskId); +static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId); +static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId); +static void Task_FieldEffectShowMon_Cleanup(u8 taskId); static void sub_80C9A10(void); static void sub_80C9A60(void); @@ -36,13 +37,13 @@ bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId) return TRUE; } -u8 oei_task_add(void) +u8 CreateFieldEffectShowMon(void) { GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y); - return CreateTask(task08_080C9820, 8); + return CreateTask(Task_FieldEffectShowMon_Init, 8); } -static void task08_080C9820(u8 taskId) +static void Task_FieldEffectShowMon_Init(u8 taskId) { u8 mapObjId; @@ -54,48 +55,49 @@ static void task08_080C9820(u8 taskId) { if (gMapHeader.mapType == MAP_TYPE_UNDERWATER) { + // Leftover from RS, inhibits the player anim while underwater. FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_80C98FC; + gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } else { sub_805CB70(); - ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], 0x45); - gTasks[taskId].func = sub_80C98B0; + ObjectEventSetHeldMovement(&gObjectEvents[mapObjId], MOVEMENT_ACTION_UNKNOWN_STEP_45); + gTasks[taskId].func = Task_FieldEffectShowMon_WaitPlayerAnim; } } } -static void sub_80C98B0(u8 taskId) +static void Task_FieldEffectShowMon_WaitPlayerAnim(u8 taskId) { if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[gPlayerAvatar.objectEventId]) == TRUE) { FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); - gTasks[taskId].func = sub_80C98FC; + gTasks[taskId].func = Task_FieldEffectShowMon_WaitFldeff; } } -static void sub_80C98FC(u8 taskId) +static void Task_FieldEffectShowMon_WaitFldeff(u8 taskId) { if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) { gFieldEffectArguments[1] = GetPlayerFacingDirection(); - if (gFieldEffectArguments[1] == 1) + if (gFieldEffectArguments[1] == DIR_SOUTH) gFieldEffectArguments[2] = 0; - if (gFieldEffectArguments[1] == 2) + if (gFieldEffectArguments[1] == DIR_NORTH) gFieldEffectArguments[2] = 1; - if (gFieldEffectArguments[1] == 3) + if (gFieldEffectArguments[1] == DIR_WEST) gFieldEffectArguments[2] = 2; - if (gFieldEffectArguments[1] == 4) + if (gFieldEffectArguments[1] == DIR_EAST) gFieldEffectArguments[2] = 3; ObjectEventSetGraphicsId(&gObjectEvents[gPlayerAvatar.objectEventId], GetPlayerAvatarGraphicsIdByCurrentState()); StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]); - FieldEffectActiveListRemove(6); - gTasks[taskId].func = sub_80C99A0; + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + gTasks[taskId].func = Task_FieldEffectShowMon_Cleanup; } } -static void sub_80C99A0(u8 taskId) +static void Task_FieldEffectShowMon_Cleanup(u8 taskId) { FLDEFF_CALL_FUNC_IN_DATA(); gPlayerAvatar.unk6 = FALSE; @@ -121,7 +123,7 @@ static void sub_80C9A10(void) bool8 FldEff_UseRockSmash(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80C9A60); IncrementGameStat(GAME_STAT_USED_ROCK_SMASH); diff --git a/src/fldeff_strength.c b/src/fldeff_strength.c index 230b9c751..712d9f1c6 100644 --- a/src/fldeff_strength.c +++ b/src/fldeff_strength.c @@ -33,7 +33,7 @@ static void FldEff_UseStrength(void) bool8 sub_80D0860(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(sub_80D08A8); GetMonNickname(&gPlayerParty[gFieldEffectArguments[0]], gStringVar1); return FALSE; diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 45c471e95..d827aff4d 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -43,7 +43,7 @@ bool8 FldEff_SweetScent(void) u8 taskId; SetWeatherScreenFadeOut(); - taskId = oei_task_add(); + taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartSweetScentFieldEffect); return FALSE; } diff --git a/src/fldeff_teleport.c b/src/fldeff_teleport.c index a66a332bf..44a7af732 100644 --- a/src/fldeff_teleport.c +++ b/src/fldeff_teleport.c @@ -28,7 +28,7 @@ static void FieldCallback_Teleport(void) bool8 FldEff_UseTeleport(void) { - u8 taskId = oei_task_add(); + u8 taskId = CreateFieldEffectShowMon(); FLDEFF_SET_FUNC_TO_DATA(StartTeleportFieldEffect); SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT); return FALSE; diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 8e07c1c97..7c05d1dde 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -16,39 +16,12 @@ static const bool8 sTileSurfable[METATILE_COUNT] = { [MB_SOUTHWARD_CURRENT] = TRUE }; -static const u8 sTileBitAttributes[] = { - 0x00, - 0x01, - 0x02, - 0x04, - 0x08, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 +static const u8 sTileBitAttributes[32] = { + [0] = 0x00, + [1] = 0x01, + [2] = 0x02, + [3] = 0x04, + [4] = 0x08, }; bool8 MetatileBehavior_UnusedReturnTrue(u8 metatileBehavior) @@ -769,7 +742,7 @@ bool8 MetatileBehavior_UnusedReturnFalse_11(u8 metatileBehavior) { return FALSE; bool8 MetatileBehavior_UnusedReturnFalse_12(u8 metatileBehavior) { return FALSE; } bool8 MetatileBehavior_UnusedReturnFalse_13(u8 metatileBehavior) { return FALSE; } -bool8 sub_805A2BC(u8 arg1, u8 arg2) +bool8 TestMetatileAttributeBit(u8 arg1, u8 arg2) { if(sTileBitAttributes[arg1] & arg2) return TRUE; diff --git a/src/prof_pc.c b/src/prof_pc.c index d1f06a2ba..ce81d9ce8 100644 --- a/src/prof_pc.c +++ b/src/prof_pc.c @@ -4,22 +4,22 @@ #include "field_message_box.h" #include "constants/species.h" -extern const u8 gUnknown_81A6D17[]; -extern const u8 gUnknown_81A6D6D[]; -extern const u8 gUnknown_81A6DDF[]; -extern const u8 gUnknown_81A6E36[]; -extern const u8 gUnknown_81A6EA4[]; -extern const u8 gUnknown_81A6F0B[]; -extern const u8 gUnknown_81A6F71[]; -extern const u8 gUnknown_81A6FAB[]; -extern const u8 gUnknown_81A6FF1[]; -extern const u8 gUnknown_81A7031[]; -extern const u8 gUnknown_81A7063[]; -extern const u8 gUnknown_81A70A5[]; -extern const u8 gUnknown_81A70D8[]; -extern const u8 gUnknown_81A7108[]; -extern const u8 gUnknown_81A7137[]; -extern const u8 gUnknown_81A7175[]; +extern const u8 PokedexRating_Text_LessThan10[]; +extern const u8 PokedexRating_Text_LessThan20[]; +extern const u8 PokedexRating_Text_LessThan30[]; +extern const u8 PokedexRating_Text_LessThan40[]; +extern const u8 PokedexRating_Text_LessThan50[]; +extern const u8 PokedexRating_Text_LessThan60[]; +extern const u8 PokedexRating_Text_LessThan70[]; +extern const u8 PokedexRating_Text_LessThan80[]; +extern const u8 PokedexRating_Text_LessThan90[]; +extern const u8 PokedexRating_Text_LessThan100[]; +extern const u8 PokedexRating_Text_LessThan110[]; +extern const u8 PokedexRating_Text_LessThan120[]; +extern const u8 PokedexRating_Text_LessThan130[]; +extern const u8 PokedexRating_Text_LessThan140[]; +extern const u8 PokedexRating_Text_LessThan150[]; +extern const u8 PokedexRating_Text_Complete[]; u16 Special_GetPokedexCount(void) { @@ -41,65 +41,67 @@ static const u8 *GetProfOaksRatingMessageByCount(u16 count) gSpecialVar_Result = FALSE; if (count < 10) - return gUnknown_81A6D17; + return PokedexRating_Text_LessThan10; if (count < 20) - return gUnknown_81A6D6D; + return PokedexRating_Text_LessThan20; if (count < 30) - return gUnknown_81A6DDF; + return PokedexRating_Text_LessThan30; if (count < 40) - return gUnknown_81A6E36; + return PokedexRating_Text_LessThan40; if (count < 50) - return gUnknown_81A6EA4; + return PokedexRating_Text_LessThan50; if (count < 60) - return gUnknown_81A6F0B; + return PokedexRating_Text_LessThan60; if (count < 70) - return gUnknown_81A6F71; + return PokedexRating_Text_LessThan70; if (count < 80) - return gUnknown_81A6FAB; + return PokedexRating_Text_LessThan80; if (count < 90) - return gUnknown_81A6FF1; + return PokedexRating_Text_LessThan90; if (count < 100) - return gUnknown_81A7031; + return PokedexRating_Text_LessThan100; if (count < 110) - return gUnknown_81A7063; + return PokedexRating_Text_LessThan110; if (count < 120) - return gUnknown_81A70A5; + return PokedexRating_Text_LessThan120; if (count < 130) - return gUnknown_81A70D8; + return PokedexRating_Text_LessThan130; if (count < 140) - return gUnknown_81A7108; + return PokedexRating_Text_LessThan140; if (count < 150) - return gUnknown_81A7137; + return PokedexRating_Text_LessThan150; if (count == 150) { + // Mew doesn't count for completing the pokedex if (GetSetPokedexFlag(SpeciesToNationalPokedexNum(SPECIES_MEW), 1)) - return gUnknown_81A7137; + return PokedexRating_Text_LessThan150; + gSpecialVar_Result = TRUE; - return gUnknown_81A7175; + return PokedexRating_Text_Complete; } if (count == 151) { gSpecialVar_Result = TRUE; - return gUnknown_81A7175; + return PokedexRating_Text_Complete; } - return gUnknown_81A6D17; + return PokedexRating_Text_LessThan10; } void Special_GetProfOaksRatingMessage(void) diff --git a/src/quest_log.c b/src/quest_log.c index b747dd8b6..6e70ceea8 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -113,7 +113,7 @@ static EWRAM_DATA u16 *gUnknown_203AE90 = NULL; static EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0}; static EWRAM_DATA struct UnkStruct_203AE98 gUnknown_203AE98[32] = {0}; static EWRAM_DATA u16 sQuestLogIdx = 0; -static EWRAM_DATA u8 gUnknown_203AF9A[64][2] = {{0}}; +static EWRAM_DATA u8 sMovementScripts[64][2] = {{0}}; static EWRAM_DATA u16 gUnknown_203B01A = 0; static EWRAM_DATA u16 gUnknown_203B01C = 0; static EWRAM_DATA u16 sFlagOrVarPlayhead = 0; @@ -1551,24 +1551,24 @@ void sub_811246C(struct Sprite *sprite) struct ObjectEvent *objectEvent = &gObjectEvents[sprite->data[0]]; if (objectEvent->localId == OBJ_EVENT_ID_PLAYER) { - if (gUnknown_203AF9A[0][0] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[0][0] != 0xFF) { - ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[0][0]); - gUnknown_203AF9A[0][0] = OBJ_EVENT_ID_PLAYER; + ObjectEventSetHeldMovement(objectEvent, sMovementScripts[0][0]); + sMovementScripts[0][0] = 0xFF; } - if (gUnknown_203AF9A[0][1] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[0][1] != OBJ_EVENT_ID_PLAYER) { sub_8150454(); - gUnknown_203AF9A[0][1] = OBJ_EVENT_ID_PLAYER; + sMovementScripts[0][1] = OBJ_EVENT_ID_PLAYER; } sub_8063E28(objectEvent, sprite); } else { - if (gUnknown_203AF9A[objectEvent->localId][0] != OBJ_EVENT_ID_PLAYER) + if (sMovementScripts[objectEvent->localId][0] != 0xFF) { - ObjectEventSetHeldMovement(objectEvent, gUnknown_203AF9A[objectEvent->localId][0]); - gUnknown_203AF9A[objectEvent->localId][0] = OBJ_EVENT_ID_PLAYER; + ObjectEventSetHeldMovement(objectEvent, sMovementScripts[objectEvent->localId][0]); + sMovementScripts[objectEvent->localId][0] = 0xFF; } sub_8063E28(objectEvent, sprite); } @@ -1736,15 +1736,15 @@ static void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2) sNumQuestLogs = a2 / 8; for (i = 0; i < 0x40; i++) { - gUnknown_203AF9A[i][0] |= 0xFF; - gUnknown_203AF9A[i][1] |= 0xFF; + sMovementScripts[i][0] |= 0xFF; + sMovementScripts[i][1] |= 0xFF; } sQuestLogIdx = 0; gUnknown_203B01C = 0; gUnknown_3005E90 = (struct UnkStruct_3005E90){}; gUnknown_203B01A = gUnknown_3005E94[sQuestLogIdx].unk_4; - gUnknown_203AF9A[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; - gUnknown_203AF9A[0][1] = 0xFF; + sMovementScripts[0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[0][1] = 0xFF; gUnknown_3005E88 = 1; break; case 2: @@ -1807,10 +1807,10 @@ void sub_8112B3C(void) switch (gUnknown_3005E94[sQuestLogIdx].unk_6) { case 0: - gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][0] = gUnknown_3005E94[sQuestLogIdx].unk_3; break; case 1: - gUnknown_203AF9A[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3; + sMovementScripts[gUnknown_3005E94[sQuestLogIdx].unk_0][1] = gUnknown_3005E94[sQuestLogIdx].unk_3; break; case 2: *(u32 *)&gUnknown_3005E90 = ((gUnknown_3005E94[sQuestLogIdx].unk_3 << 24) | (gUnknown_3005E94[sQuestLogIdx].unk_2 << 16) | (gUnknown_3005E94[sQuestLogIdx].unk_1 << 8) | (gUnknown_3005E94[sQuestLogIdx].unk_0 << 0)); diff --git a/src/sea_cottage_special_anim.c b/src/sea_cottage_special_anim.c deleted file mode 100644 index c63974a1f..000000000 --- a/src/sea_cottage_special_anim.c +++ /dev/null @@ -1,262 +0,0 @@ -#include "global.h" -#include "event_data.h" -#include "task.h" -#include "field_player_avatar.h" -#include "fieldmap.h" -#include "field_camera.h" - -static EWRAM_DATA u8 gUnknown_2039984 = 0; - -static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2); -static void sub_809C334(u8 taskId); -static void sub_809C500(u8 taskId); -static void sub_809C640(u8 taskId); - -static const u16 gUnknown_83DF0D4[] = {0x0308, 0x030a, 0x02d0}; -static const u16 gUnknown_83DF0DA[] = {0x0309, 0x030b, 0x02d1}; -static const u16 gUnknown_83DF0E0[] = {0x0310, 0x0312, 0x02d8}; -static const u16 gUnknown_83DF0E6[] = {0x0311, 0x0313, 0x02d9}; -static const u16 gUnknown_83DF0EC[] = {0x02e3, 0x0316, 0x0314}; -static const u16 gUnknown_83DF0F2[] = {0x02e4, 0x0317, 0x0315}; -static const u16 gUnknown_83DF0F8[] = {0x02eb, 0x031e, 0x031c}; - -// Functions -static void sub_809C1D8(u8 taskId, const s16 *a1, u16 a2) -{ - s16 r5, r3, r4; - s16 i, j; - - r5 = gTasks[taskId].data[4] - 1; - r3 = gTasks[taskId].data[5] - 1; - r4 = gTasks[taskId].data[1]; - - if (gTasks[taskId].data[2] == 0) - { - for (i = 0; i < 3; i++) - { - for (j = 0; j < 3; j++) - { - s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i); - - if (a1[r4] == (s16)id) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[r4 + 1]); - else - MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[0]); - } - } - } - } - else - { - for (i = 0; i < 3; i++) - { - for (j = 0; j < 3; j++) - { - s32 id = MapGridGetMetatileIdAt(r5 + j, r3 + i); - - if (a1[2 - r4] == (s16)id) - { - if (r4 != 2) - MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[1 - r4]); - else - MapGridSetMetatileIdAt(r5 + j, r3 + i, a2 | a1[2]); - } - } - } - } -} - -static void sub_809C334(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - u16 v1; - - data[3] = 1; - switch (data[0]) - { - case 0: - sub_809C1D8(taskId, gUnknown_83DF0D4, 0); - break; - case 1: - sub_809C1D8(taskId, gUnknown_83DF0DA, 0); - break; - case 2: - sub_809C1D8(taskId, gUnknown_83DF0E0, 0xC00); - break; - case 3: - sub_809C1D8(taskId, gUnknown_83DF0E6, 0); - break; - case 4: - sub_809C1D8(taskId, gUnknown_83DF0EC, 0xC00); - break; - case 5: - sub_809C1D8(taskId, gUnknown_83DF0F2, 0); - break; - case 6: - sub_809C1D8(taskId, gUnknown_83DF0F8, 0); - default: - break; - } - - data[0] = (data[0] + 1) & 7; - v1 = data[0] & 7; - if (v1 == 0) - { - DrawWholeMapView(); - data[1] = (data[1] + 1) % 3; - data[3] = v1; - } -} - -static u8 sub_809C3FC(u16 a0) -{ - u8 taskId; - s16 *data; - - taskId = CreateTask(sub_809C334, 0); - data = gTasks[taskId].data; - PlayerGetDestCoords(&data[4], &data[5]); - data[0] = 0; - data[1] = 0; - data[2] = a0; - sub_809C334(taskId); - return taskId; -} - -void sub_809C448(u8 a0) -{ - u8 taskId; - - taskId = sub_809C3FC(a0); - gUnknown_2039984 = taskId; -} - -void sub_809C460(void) -{ - DestroyTask(gUnknown_2039984); -} - -bool8 sub_809C474(void) -{ - if (gTasks[gUnknown_2039984].data[3] == 0) - { - if (gTasks[gUnknown_2039984].data[1] != 2) - return TRUE; - return FALSE; - } - else - { - return TRUE; - } -} - -// special 0x1b5 - creates a tile animaiton one block left two-four up the player -void sub_809C4A8(void) -{ - u8 taskId; - s16 *data; - - taskId = CreateTask(sub_809C500, 0); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - data = gTasks[taskId].data; - PlayerGetDestCoords(&data[2], &data[3]); - if (gSpecialVar_0x8004 == 0) - { - gTasks[taskId].data[2] += 6; - gTasks[taskId].data[3] -= 5; - } - else - { - gTasks[taskId].data[2]--; - gTasks[taskId].data[3] -= 5; - } -} - -static void sub_809C500(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - if ((data[1] & 1) == 0) - { - MapGridSetMetatileIdAt(data[2], data[3], 0xEB5); - MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB7); - } - else - { - MapGridSetMetatileIdAt(data[2], data[3], 0xEB6); - MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xEB8); - } - CurrentMapDrawMetatileAt(data[2], data[3]); - CurrentMapDrawMetatileAt(data[2], data[3] + 2); - } - - data[0]++; - if (data[0] != 0x10) - return; - - data[0] = 0; - data[1]++; - if (data[1] != 0xD) - return; - - MapGridSetMetatileIdAt(data[2], data[3], 0xE8A); - MapGridSetMetatileIdAt(data[2], data[3] + 2, 0xE96); - CurrentMapDrawMetatileAt(data[2], data[3]); - CurrentMapDrawMetatileAt(data[2], data[3] + 2); - DestroyTask(taskId); -} - -// special 0x1B7 - creates a tile animation two-six blocks right from the top-left corner of the screen -void sub_809C5FC(void) -{ - u8 taskId; - s16 *data; - - taskId = CreateTask(sub_809C640, 0); - gTasks[taskId].data[0] = 0; - gTasks[taskId].data[1] = 0; - data = gTasks[taskId].data; - PlayerGetDestCoords(&data[2], &data[3]); - gTasks[taskId].data[2] += 4; - gTasks[taskId].data[3] -= 5; -} - -static void sub_809C640(u8 taskId) -{ - s16 *data = gTasks[taskId].data; - - if (data[0] == 0) - { - if (data[1] != 0) - { - MapGridSetMetatileIdAt(data[2], data[3], 0xE85); - MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEB4); - CurrentMapDrawMetatileAt(data[2], data[3]); - CurrentMapDrawMetatileAt(data[2], data[3] + 1); - if (data[1] == 4) - { - DestroyTask(taskId); - return; - } - - data[2]--; - } - MapGridSetMetatileIdAt(data[2], data[3], 0xEB9); - MapGridSetMetatileIdAt(data[2], data[3] + 1, 0xEBA); - CurrentMapDrawMetatileAt(data[2], data[3]); - CurrentMapDrawMetatileAt(data[2], data[3] + 1); - } - - data[0]++; - if (data[0] == 4) - { - data[0] = 0; - data[1]++; - } -} - diff --git a/src/special_field_anim.c b/src/special_field_anim.c new file mode 100644 index 000000000..4193f0b5a --- /dev/null +++ b/src/special_field_anim.c @@ -0,0 +1,341 @@ +#include "global.h" +#include "event_data.h" +#include "task.h" +#include "field_player_avatar.h" +#include "fieldmap.h" +#include "field_camera.h" +#include "constants/metatile_labels.h" + +static EWRAM_DATA u8 sEscalatorTaskId = 0; + +static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks); +static void Task_DrawEscalator(u8 taskId); +static void Task_DrawTeleporterHousing(u8 taskId); +static void Task_DrawTeleporterCable(u8 taskId); + +#define ESCALATOR_STAGES 3 +#define LAST_ESCALATOR_STAGE (ESCALATOR_STAGES - 1) + +static const u16 sEscalatorMetatiles_BottomNextRail[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_BottomNextRail_Transition2, + METATILE_PokemonCenter_Escalator_BottomNextRail_Transition1, + METATILE_PokemonCenter_Escalator_BottomNextRail_Normal +}; + +static const u16 sEscalatorMetatiles_BottomRail[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_BottomRail_Transition2, + METATILE_PokemonCenter_Escalator_BottomRail_Transition1, + METATILE_PokemonCenter_Escalator_BottomRail_Normal +}; + +static const u16 sEscalatorMetatiles_BottomNext[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_BottomNext_Transition2, + METATILE_PokemonCenter_Escalator_BottomNext_Transition1, + METATILE_PokemonCenter_Escalator_BottomNext_Normal +}; + +static const u16 sEscalatorMetatiles_Bottom[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_Bottom_Transition2, + METATILE_PokemonCenter_Escalator_Bottom_Transition1, + METATILE_PokemonCenter_Escalator_Bottom_Normal +}; + +static const u16 sEscalatorMetatiles_TopNext[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_TopNext_Normal, + METATILE_PokemonCenter_Escalator_TopNext_Transition1, + METATILE_PokemonCenter_Escalator_TopNext_Transition2 +}; + +static const u16 sEscalatorMetatiles_Top[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_Top_Normal, + METATILE_PokemonCenter_Escalator_Top_Transition1, + METATILE_PokemonCenter_Escalator_Top_Transition2 +}; + +static const u16 sEscalatorMetatiles_TopNextRail[ESCALATOR_STAGES] = +{ + METATILE_PokemonCenter_Escalator_TopNextRail_Normal, + METATILE_PokemonCenter_Escalator_TopNextRail_Transition1, + METATILE_PokemonCenter_Escalator_TopNextRail_Transition2 +}; + +#define tState data[0] +#define tTransitionStage data[1] +#define tGoingUp data[2] +#define tDrawingEscalator data[3] +#define tPlayerX data[4] +#define tPlayerY data[5] + +static void SetEscalatorMetatile(u8 taskId, const s16 *metatileIds, u16 metatileMasks) +{ + s16 x, y, transitionStage; + s16 i, j; + + x = gTasks[taskId].tPlayerX - 1; + y = gTasks[taskId].tPlayerY - 1; + transitionStage = gTasks[taskId].tTransitionStage; + + // Check all the escalator sections and only progress the selected one to the next stage + if (!gTasks[taskId].tGoingUp) + { + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + s32 id = MapGridGetMetatileIdAt(x + j, y + i); + + if (metatileIds[transitionStage] == (s16)id) + { + if (transitionStage != LAST_ESCALATOR_STAGE) + MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[transitionStage + 1]); + else + MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[0]); + } + } + } + } + else + { + for (i = 0; i < 3; i++) + { + for (j = 0; j < 3; j++) + { + s32 id = MapGridGetMetatileIdAt(x + j, y + i); + + if (metatileIds[LAST_ESCALATOR_STAGE - transitionStage] == (s16)id) + { + if (transitionStage != LAST_ESCALATOR_STAGE) + MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[1 - transitionStage]); + else + MapGridSetMetatileIdAt(x + j, y + i, metatileMasks | metatileIds[LAST_ESCALATOR_STAGE]); + } + } + } + } +} + +static void Task_DrawEscalator(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 state; + + tDrawingEscalator = TRUE; + + // Set tile for each section of the escalator in sequence for current transition stage + switch (tState) + { + case 0: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNextRail, 0); + break; + case 1: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomRail, 0); + break; + case 2: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_BottomNext, METATILE_COLLISION_MASK); + break; + case 3: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_Bottom, 0); + break; + case 4: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNext, METATILE_COLLISION_MASK); + break; + case 5: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_Top, 0); + break; + case 6: + SetEscalatorMetatile(taskId, sEscalatorMetatiles_TopNextRail, 0); + default: + break; + } + + tState = (tState + 1) & 7; + state = tState & 7; + + // If all sections of the escalator have been set, draw map and progress to next stage + if (state == 0) + { + DrawWholeMapView(); + tTransitionStage = (tTransitionStage + 1) % ESCALATOR_STAGES; + tDrawingEscalator = FALSE; + } +} + +static u8 CreateEscalatorTask(bool16 goingUp) +{ + u8 taskId; + s16 *data; + + taskId = CreateTask(Task_DrawEscalator, 0); + data = gTasks[taskId].data; + PlayerGetDestCoords(&tPlayerX, &tPlayerY); + tState = 0; + tTransitionStage = 0; + tGoingUp = goingUp; + Task_DrawEscalator(taskId); + return taskId; +} + +void StartEscalator(bool8 goingUp) +{ + u8 taskId; + + taskId = CreateEscalatorTask(goingUp); + sEscalatorTaskId = taskId; +} + +void StopEscalator(void) +{ + DestroyTask(sEscalatorTaskId); +} + +bool8 IsEscalatorMoving(void) +{ + if (gTasks[sEscalatorTaskId].tDrawingEscalator == FALSE) + { + if (gTasks[sEscalatorTaskId].tTransitionStage != LAST_ESCALATOR_STAGE) + return TRUE; + return FALSE; + } + else + { + return TRUE; + } +} + +#undef tState +#undef tTransitionStage +#undef tGoingUp +#undef tDrawingEscalator +#undef tPlayerX +#undef tPlayerY + +#define tTimer data[0] +#define tState data[1] +#define tX data[2] +#define tY data[3] + +void AnimateTeleporterHousing(void) +{ + u8 taskId; + s16 *data; + + taskId = CreateTask(Task_DrawTeleporterHousing, 0); + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState = 0; + data = gTasks[taskId].data; + PlayerGetDestCoords(&tX, &tY); + + // Set the coords of whichever teleporter is being animated + // 0 for the right teleporter, 1 for the left teleporter + if (gSpecialVar_0x8004 == 0) + { + gTasks[taskId].tX += 6; + gTasks[taskId].tY -= 5; + } + else + { + gTasks[taskId].tX -= 1; + gTasks[taskId].tY -= 5; + } +} + +static void Task_DrawTeleporterHousing(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (tTimer == 0) + { + // Alternate the teleporter light / brightness of the teleporter door + if ((tState & 1) == 0) + { + MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Yellow | METATILE_COLLISION_MASK); + MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_HalfGlowing | METATILE_COLLISION_MASK); + } + else + { + MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Red | METATILE_COLLISION_MASK); + MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door_FullGlowing | METATILE_COLLISION_MASK); + } + CurrentMapDrawMetatileAt(tX, tY); + CurrentMapDrawMetatileAt(tX, tY + 2); + } + + tTimer++; + if (tTimer != 16) + return; + + tTimer = 0; + tState++; + if (tState != 13) + return; + + MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Light_Green | METATILE_COLLISION_MASK); + MapGridSetMetatileIdAt(tX, tY + 2, METATILE_SeaCottage_Teleporter_Door | METATILE_COLLISION_MASK); + CurrentMapDrawMetatileAt(tX, tY); + CurrentMapDrawMetatileAt(tX, tY + 2); + DestroyTask(taskId); +} + +void AnimateTeleporterCable(void) +{ + u8 taskId; + s16 *data; + + taskId = CreateTask(Task_DrawTeleporterCable, 0); + gTasks[taskId].tTimer = 0; + gTasks[taskId].tState = 0; + data = gTasks[taskId].data; + PlayerGetDestCoords(&tX, &tY); + gTasks[taskId].tX += 4; + gTasks[taskId].tY -= 5; +} + +static void Task_DrawTeleporterCable(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if (tTimer == 0) + { + if (tState != 0) + { + // Set default cable tiles to clear the ball + MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_Cable_Top | METATILE_COLLISION_MASK); + MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_Cable_Bottom | METATILE_COLLISION_MASK); + CurrentMapDrawMetatileAt(tX, tY); + CurrentMapDrawMetatileAt(tX, tY + 1); + + // End after drawing 4 times (length of the cable) + if (tState == 4) + { + DestroyTask(taskId); + return; + } + + tX--; + } + + // Draw the cable ball + MapGridSetMetatileIdAt(tX, tY, METATILE_SeaCottage_Teleporter_CableBall_Top | METATILE_COLLISION_MASK); + MapGridSetMetatileIdAt(tX, tY + 1, METATILE_SeaCottage_Teleporter_CableBall_Bottom | METATILE_COLLISION_MASK); + CurrentMapDrawMetatileAt(tX, tY); + CurrentMapDrawMetatileAt(tX, tY + 1); + } + + tTimer++; + if (tTimer == 4) + { + tTimer = 0; + tState++; + } +} + +#undef tTimer +#undef tState +#undef tX +#undef tY diff --git a/src/wild_encounter.c b/src/wild_encounter.c index b32eb583a..b3605db47 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -367,11 +367,11 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi headerId = GetCurrentMapWildMonHeaderId(); if (headerId != 0xFFFF) { - if (sub_8058F1C(currMetatileBehavior, 4) == TRUE) + if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == TRUE) { if (gWildMonHeaders[headerId].landMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) return FALSE; if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) { @@ -405,12 +405,12 @@ bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavi } } } - else if (sub_8058F1C(currMetatileBehavior, 4) == 2 - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetatileBehavior, 0)) == TRUE)) + else if (GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4) == 2 + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0)) == TRUE)) { if (gWildMonHeaders[headerId].waterMonsInfo == NULL) return FALSE; - else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) + else if (previousMetatileBehavior != GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) return FALSE; else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) { @@ -474,7 +474,7 @@ bool8 SweetScentWildEncounter(void) headerId = GetCurrentMapWildMonHeaderId(); if (headerId != 0xFFFF) { - if (sub_8058F48(x, y, 4) == 1) + if (MapGridGetMetatileAttributeAt(x, y, 4) == 1) { if (TryStartRoamerEncounter() == TRUE) { @@ -490,7 +490,7 @@ bool8 SweetScentWildEncounter(void) BattleSetup_StartWildBattle(); return TRUE; } - else if (sub_8058F48(x, y, 4) == 2) + else if (MapGridGetMetatileAttributeAt(x, y, 4) == 2) { if (TryStartRoamerEncounter() == TRUE) { @@ -711,7 +711,7 @@ void ResetEncounterRateModifiers(void) static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior) { - u8 unk = sub_8058F1C(currMetatileBehavior, 4); + u8 unk = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 4); u32 minSteps; u32 encRate; if (unk == 0) @@ -763,19 +763,19 @@ bool8 TryStandardWildEncounter(u32 currMetatileBehavior) { if (!HandleWildEncounterCooldown(currMetatileBehavior)) { - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return FALSE; } else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE) { sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.stepsSinceLastEncounter = 0; - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return TRUE; } else { - sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0); + sWildEncounterData.prevMetatileBehavior = GetMetatileAttributeFromRawMetatileBehavior(currMetatileBehavior, 0); return FALSE; } } |