Finish fldeff_cut
This commit is contained in:
+173
-10
@@ -1,7 +1,10 @@
|
||||
#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"
|
||||
@@ -10,17 +13,79 @@
|
||||
#include "overworld.h"
|
||||
#include "party_menu.h"
|
||||
#include "script.h"
|
||||
#include "trig.h"
|
||||
#include "constants/event_objects.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
|
||||
EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE;
|
||||
static EWRAM_DATA u8 *sCutGrassSpriteArrayPtr = NULL;
|
||||
static EWRAM_DATA bool8 sScheduleOpenDottedHole = FALSE;
|
||||
|
||||
void FieldCallback_CutGrass(void);
|
||||
void FieldCallback_CutTree(void);
|
||||
void sub_8097A20(void);
|
||||
void sub_8097C6C(void);
|
||||
static void FieldCallback_CutGrass(void);
|
||||
static void FieldCallback_CutTree(void);
|
||||
static void sub_8097A20(void);
|
||||
static void sub_8097B50(s16 x, s16 y);
|
||||
static void objc_8097BA8(struct Sprite * sprite);
|
||||
static void objc_8097BBC(struct Sprite * sprite);
|
||||
static void sub_8097C18(struct Sprite * sprite);
|
||||
static void sub_8097C6C(void);
|
||||
|
||||
u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y)
|
||||
static const u16 sCutGrassMetatileMapping[][2] = {
|
||||
{0x000d, 0x0001},
|
||||
{0x000a, 0x0013},
|
||||
{0x000b, 0x000e},
|
||||
{0x000c, 0x000f},
|
||||
{0x0352, 0x033e},
|
||||
{0x0300, 0x0310},
|
||||
{0x0301, 0x0311},
|
||||
{0x0302, 0x0312},
|
||||
{0x0284, 0x0281},
|
||||
{0xffff, 0xffff}
|
||||
};
|
||||
|
||||
static const struct OamData gOamData_83D4128 = {
|
||||
.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 gAnimCmd_83D4130[] = {
|
||||
ANIMCMD_FRAME(0, 30),
|
||||
ANIMCMD_JUMP(0)
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gSpriteAnimTable_83D4138[] = {
|
||||
gAnimCmd_83D4130
|
||||
};
|
||||
|
||||
static const struct SpriteFrameImage gUnknown_83D413C[] = {
|
||||
{gUnknown_8398648, 0x20}
|
||||
};
|
||||
|
||||
const struct SpritePalette gUnknown_83D4144[] = {
|
||||
gUnknown_8398688, 4096
|
||||
};
|
||||
|
||||
static const struct SpriteTemplate sSpriteTemplate_CutGrass = {
|
||||
.tileTag = 0xFFFF,
|
||||
.paletteTag = 4096,
|
||||
.oam = &gOamData_83D4128,
|
||||
.anims = gSpriteAnimTable_83D4138,
|
||||
.images = gUnknown_83D413C,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = objc_8097BA8
|
||||
};
|
||||
|
||||
static u8 MetatileAtCoordsIsGrassTile(s16 x, s16 y)
|
||||
{
|
||||
return TestMetatileAttributeBit(MapGridGetMetatileAttributeAt(x, y, 1), 1);
|
||||
}
|
||||
@@ -72,7 +137,7 @@ bool8 SetUpFieldMove_Cut(void)
|
||||
}
|
||||
}
|
||||
|
||||
void FieldCallback_CutGrass(void)
|
||||
static void FieldCallback_CutGrass(void)
|
||||
{
|
||||
FieldEffectStart(FLDEFF_USE_CUT_ON_GRASS);
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
@@ -86,7 +151,7 @@ bool8 sub_80979A0(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void FieldCallback_CutTree(void)
|
||||
static void FieldCallback_CutTree(void)
|
||||
{
|
||||
gFieldEffectArguments[0] = GetCursorSelectionMonId();
|
||||
ScriptContext1_SetupScript(EventScript_FldEffCut);
|
||||
@@ -100,7 +165,7 @@ bool8 sub_80979F0(void)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void sub_8097A20(void)
|
||||
static void sub_8097A20(void)
|
||||
{
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_GRASS);
|
||||
if (sScheduleOpenDottedHole == TRUE)
|
||||
@@ -108,3 +173,101 @@ void sub_8097A20(void)
|
||||
else
|
||||
FieldEffectStart(FLDEFF_CUT_GRASS);
|
||||
}
|
||||
|
||||
bool8 sub_8097A48(void)
|
||||
{
|
||||
u8 i, j;
|
||||
s16 x, y;
|
||||
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)
|
||||
{
|
||||
sub_8097B50(x, y);
|
||||
sub_805F378(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
DrawWholeMapView();
|
||||
sCutGrassSpriteArrayPtr = Alloc(8);
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
sCutGrassSpriteArrayPtr[i] = CreateSprite(&sSpriteTemplate_CutGrass, gSprites[gPlayerAvatar.spriteId].oam.x + 8, gSprites[gPlayerAvatar.spriteId].oam.y + 20, 0);
|
||||
gSprites[sCutGrassSpriteArrayPtr[i]].data[2] = i * 32;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void sub_8097B50(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 objc_8097BA8(struct Sprite * sprite)
|
||||
{
|
||||
sprite->data[0] = 8;
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[3] = 0;
|
||||
sprite->callback = objc_8097BBC;
|
||||
}
|
||||
|
||||
static void objc_8097BBC(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 = sub_8097C18;
|
||||
}
|
||||
|
||||
static void sub_8097C18(struct Sprite * sprite)
|
||||
{
|
||||
u8 i;
|
||||
for (i = 1; i < 8; i++)
|
||||
{
|
||||
DestroySprite(&gSprites[sCutGrassSpriteArrayPtr[i]]);
|
||||
}
|
||||
FieldEffectStop(&gSprites[sCutGrassSpriteArrayPtr[0]], FLDEFF_CUT_GRASS);
|
||||
Free(sCutGrassSpriteArrayPtr);
|
||||
sub_80696C0();
|
||||
ScriptContext2_Disable();
|
||||
}
|
||||
|
||||
static void sub_8097C6C(void)
|
||||
{
|
||||
PlaySE(SE_W015);
|
||||
FieldEffectActiveListRemove(FLDEFF_USE_CUT_ON_TREE);
|
||||
EnableBothScriptContexts();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user