summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/field_fadetransition.c7
-rw-r--r--src/fieldmap.c100
-rw-r--r--src/fldeff_cut.c299
-rw-r--r--src/fldeff_dig.c2
-rw-r--r--src/fldeff_rocksmash.c44
-rw-r--r--src/fldeff_strength.c2
-rw-r--r--src/fldeff_sweetscent.c2
-rw-r--r--src/fldeff_teleport.c2
-rw-r--r--src/metatile_behavior.c41
-rw-r--r--src/prof_pc.c72
-rw-r--r--src/quest_log.c30
-rw-r--r--src/sea_cottage_special_anim.c262
-rw-r--r--src/special_field_anim.c341
-rw-r--r--src/wild_encounter.c22
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;
}
}