finished fldeff_dig + fldeff_rocksmash

This commit is contained in:
jiangzhengwenjz
2019-06-29 08:36:18 +08:00
parent 38febc8baf
commit b566ae26de
35 changed files with 422 additions and 682 deletions
+49
View File
@@ -0,0 +1,49 @@
#include "global.h"
#include "field_effect.h"
#include "field_player_avatar.h"
#include "fldeff.h"
#include "item_use.h"
#include "overworld.h"
#include "party_menu.h"
#include "sprite.h"
#include "constants/map_objects.h"
static void hm2_dig(void);
static void sub_80C9AFC(void);
bool8 SetUpFieldMove_Dig(void)
{
if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
gPostMenuFieldCallback = hm2_dig;
return TRUE;
}
return FALSE;
}
static void hm2_dig(void)
{
Overworld_ResetStateAfterDigEscRope();
FieldEffectStart(FLDEFF_USE_DIG);
gFieldEffectArguments[0] = GetCursorSelectionMonId();
}
bool8 FldEff_UseDig(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)sub_80C9AFC >> 16;
gTasks[taskId].data[9] = (u32)sub_80C9AFC;
SetPlayerAvatarTransitionFlags(PLAYER_AVATAR_FLAG_ON_FOOT);
return FALSE;
}
static void sub_80C9AFC(void)
{
u8 taskId;
FieldEffectActiveListRemove(FLDEFF_USE_DIG);
taskId = CreateTask(sub_80A1C44, 8);
gTasks[taskId].data[0] = 0;
}
+138
View File
@@ -0,0 +1,138 @@
#include "global.h"
#include "global.fieldmap.h"
#include "field_player_avatar.h"
#include "field_effect.h"
#include "party_menu.h"
#include "malloc.h"
#include "event_data.h"
#include "script.h"
#include "fldeff.h"
#include "event_scripts.h"
#include "field_weather.h"
#include "sound.h"
#include "palette.h"
#include "overworld.h"
#include "wild_encounter.h"
#include "field_map_obj.h"
#include "constants/songs.h"
#include "constants/map_objects.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 sub_80C9A10(void);
static void sub_80C9A60(void);
bool8 CheckObjectGraphicsInFrontOfPlayer(u8 graphicsId)
{
u8 mapObjId;
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
gPlayerFacingPosition.height = PlayerGetZCoord();
mapObjId = GetFieldObjectIdByXYZ(gPlayerFacingPosition.x, gPlayerFacingPosition.y, gPlayerFacingPosition.height);
if (gMapObjects[mapObjId].graphicsId != graphicsId)
return FALSE;
gSpecialVar_LastTalked = gMapObjects[mapObjId].localId;
return TRUE;
}
u8 oei_task_add(void)
{
GetXYCoordsOneStepInFrontOfPlayer(&gPlayerFacingPosition.x, &gPlayerFacingPosition.y);
return CreateTask(task08_080C9820, 8);
}
static void task08_080C9820(u8 taskId)
{
u8 mapObjId;
ScriptContext2_Enable();
gPlayerAvatar.unk6 = TRUE;
mapObjId = gPlayerAvatar.mapObjectId;
if (!FieldObjectIsMovementOverridden(&gMapObjects[mapObjId])
|| FieldObjectClearHeldMovementIfFinished(&gMapObjects[mapObjId]))
{
if (gMapHeader.mapType == MAP_TYPE_UNDERWATER)
{
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_80C98FC;
}
else
{
sub_805CB70();
FieldObjectSetHeldMovement(&gMapObjects[mapObjId], 0x45);
gTasks[taskId].func = sub_80C98B0;
}
}
}
static void sub_80C98B0(u8 taskId)
{
if (FieldObjectCheckHeldMovementStatus(&gMapObjects[gPlayerAvatar.mapObjectId]) == TRUE)
{
FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT);
gTasks[taskId].func = sub_80C98FC;
}
}
static void sub_80C98FC(u8 taskId)
{
if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON))
{
gFieldEffectArguments[1] = GetPlayerFacingDirection();
if (gFieldEffectArguments[1] == 1)
gFieldEffectArguments[2] = 0;
if (gFieldEffectArguments[1] == 2)
gFieldEffectArguments[2] = 1;
if (gFieldEffectArguments[1] == 3)
gFieldEffectArguments[2] = 2;
if (gFieldEffectArguments[1] == 4)
gFieldEffectArguments[2] = 3;
EventObjectSetGraphicsId(&gMapObjects[gPlayerAvatar.mapObjectId], GetPlayerAvatarGraphicsIdByCurrentState());
StartSpriteAnim(&gSprites[gPlayerAvatar.spriteId], gFieldEffectArguments[2]);
FieldEffectActiveListRemove(6);
gTasks[taskId].func = sub_80C99A0;
}
}
static void sub_80C99A0(u8 taskId)
{
((void (*)(void))(((u16)gTasks[taskId].data[8] << 16) | (u16)gTasks[taskId].data[9]))();
gPlayerAvatar.unk6 = FALSE;
DestroyTask(taskId);
}
bool8 SetUpFieldMove_RockSmash(void)
{
if (CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_BREAKABLE_ROCK*/0x60) == TRUE)
{
gFieldCallback2 = FieldCallback_PrepareFadeInFromMenu;
gPostMenuFieldCallback = sub_80C9A10;
return TRUE;
}
return FALSE;
}
static void sub_80C9A10(void)
{
gFieldEffectArguments[0] = GetCursorSelectionMonId();
ScriptContext1_SetupScript(EventScript_FldEffRockSmash);
}
bool8 FldEff_UseRockSmash(void)
{
u8 taskId = oei_task_add();
gTasks[taskId].data[8] = (u32)sub_80C9A60 >> 16;
gTasks[taskId].data[9] = (u32)sub_80C9A60;
IncrementGameStat(GAME_STAT_USED_ROCK_SMASH);
return FALSE;
}
static void sub_80C9A60(void)
{
PlaySE(SE_W145);
FieldEffectActiveListRemove(FLDEFF_USE_ROCK_SMASH);
EnableBothScriptContexts();
}
+3 -1
View File
@@ -6,13 +6,15 @@
#include "script.h"
#include "fldeff.h"
#include "event_scripts.h"
#include "constants/songs.h"
#include "constants/map_objects.h"
static void FldEff_UseStrength(void);
static void sub_80D08A8(void);
bool8 SetUpFieldMove_Strength(void)
{
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(0x61) != TRUE)
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) || CheckObjectGraphicsInFrontOfPlayer(/*MAP_OBJ_GFX_PUSHABLE_BOULDER*/0x61) != TRUE)
{
return FALSE;
}
+3 -4
View File
@@ -68,7 +68,6 @@ void sub_80A19E8(u8 taskId);
void sub_80A1A44(void);
void sub_80A1B48(u8 taskId);
void sub_80A1C08(u8 taskId);
void sub_80A1C44(u8 taskId);
void sub_80A1CAC(void);
void sub_80A1CC0(u8 taskId);
void sub_80A1D58(void);
@@ -557,7 +556,7 @@ void sub_80A1B48(u8 taskId)
}
}
bool8 sub_80A1B8C(void)
bool8 CanUseEscapeRopeOnCurrMap(void)
{
if (gMapHeader.escapeRope & 1)
return TRUE;
@@ -567,7 +566,7 @@ bool8 sub_80A1B8C(void)
void ItemUseOutOfBattle_EscapeRope(u8 taskId)
{
if (sub_80A1B8C() == TRUE)
if (CanUseEscapeRopeOnCurrMap() == TRUE)
{
ItemUse_SetQuestLogEvent(4, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId);
sItemUseOnFieldCB = sub_80A1C08;
@@ -579,7 +578,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId)
void sub_80A1C08(u8 taskId)
{
sub_8054D70();
Overworld_ResetStateAfterDigEscRope();
sub_80A1A44();
gTasks[taskId].data[0] = 0;
DisplayItemMessageOnField(taskId, 2, gStringVar4, sub_80A1C44);
+3 -3
View File
@@ -89,7 +89,7 @@ void LockSelectedMapObject(void)
void sub_80696C0(void)
{
u8 fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
sub_80974D8();
UnfreezeMapObjects();
}
@@ -98,9 +98,9 @@ void sub_80696F0(void)
{
u8 fieldObjectId;
if (gMapObjects[gSelectedEventObject].active)
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
fieldObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[fieldObjectId]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[fieldObjectId]);
sub_80974D8();
UnfreezeMapObjects();
}
+3 -3
View File
@@ -1705,7 +1705,7 @@ void sub_811246C(struct Sprite *sprite)
{
if (gUnknown_203AF9A[0][0] != 0xFF)
{
sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]);
FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[0][0]);
gUnknown_203AF9A[0][0] = 0xFF;
}
if (gUnknown_203AF9A[0][1] != 0xFF)
@@ -1719,7 +1719,7 @@ void sub_811246C(struct Sprite *sprite)
{
if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF)
{
sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
FieldObjectSetHeldMovement(mapObject, gUnknown_203AF9A[mapObject->localId][0]);
gUnknown_203AF9A[mapObject->localId][0] = 0xFF;
}
sub_8063E28(mapObject, sprite);
@@ -1911,7 +1911,7 @@ void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2)
gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0;
gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0;
gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0;
switch (player_get_direction_lower_nybble())
switch (GetPlayerFacingDirection())
{
case 0:
case 1:
+2 -2
View File
@@ -115,7 +115,7 @@ void sub_81505C4(u8 taskId)
gTasks[taskId].data[0]++;
break;
case 2:
StartSpriteAnim(sprite, sub_8063500(player_get_direction_lower_nybble()));
StartSpriteAnim(sprite, sub_8063500(GetPlayerFacingDirection()));
gTasks[taskId].data[0]++;
break;
case 3:
@@ -173,7 +173,7 @@ void sub_8150794(u8 taskId)
void sub_81507BC(struct MapObject * a0, u8 a1)
{
sub_805F060(a0, a1);
EventObjectSetGraphicsId(a0, a1);
}
void sub_81507CC(void)
+5 -5
View File
@@ -807,7 +807,7 @@ bool8 ScrCmd_warpteleport2(struct ScriptContext *ctx)
u16 y = VarGet(ScriptReadHalfword(ctx));
Overworld_SetWarpDestination(mapGroup, mapNum, warpId, x, y);
sub_805DAE4(player_get_direction_lower_nybble());
sub_805DAE4(GetPlayerFacingDirection());
sub_807E500();
ResetInitialPlayerAvatarState();
return TRUE;
@@ -1154,7 +1154,7 @@ bool8 ScrCmd_faceplayer(struct ScriptContext *ctx)
if (gMapObjects[gSelectedEventObject].active)
{
FieldObjectFaceOppositeDirection(&gMapObjects[gSelectedEventObject],
player_get_direction_lower_nybble());
GetPlayerFacingDirection());
}
return FALSE;
}
@@ -1241,7 +1241,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx)
HideFieldMessageBox();
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
sub_80974D8();
UnfreezeMapObjects();
return FALSE;
@@ -1253,9 +1253,9 @@ bool8 ScrCmd_release(struct ScriptContext *ctx)
HideFieldMessageBox();
if (gMapObjects[gSelectedEventObject].active)
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gSelectedEventObject]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[gSelectedEventObject]);
playerObjectId = GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0);
FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[playerObjectId]);
FieldObjectClearHeldMovementIfFinished(&gMapObjects[playerObjectId]);
sub_80974D8();
UnfreezeMapObjects();
return FALSE;