diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle_setup.c | 4 | ||||
-rw-r--r-- | src/field_control_avatar.c | 305 |
2 files changed, 304 insertions, 5 deletions
diff --git a/src/battle_setup.c b/src/battle_setup.c index 1abbbcec6..df8a3ac45 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -974,7 +974,7 @@ const u8 *BattleSetup_GetScriptAddrAfterBattle(void) if (sTrainerBattleEndScript != NULL) return sTrainerBattleEndScript; else - return Test_EventScript_Sign; + return EventScript_TestSignpostMsg; } const u8 *BattleSetup_GetTrainerPostBattleScript(void) @@ -982,7 +982,7 @@ const u8 *BattleSetup_GetTrainerPostBattleScript(void) if (sTrainerABattleScriptRetAddr != NULL) return sTrainerABattleScriptRetAddr; else - return Test_EventScript_Sign; + return EventScript_TestSignpostMsg; } void ShowTrainerCantBattleSpeech(void) diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index bf743d071..590589937 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -1,12 +1,14 @@ #include "global.h" #include "gflib.h" #include "bike.h" +#include "daycare.h" #include "event_data.h" #include "event_object_movement.h" #include "event_scripts.h" #include "fieldmap.h" #include "field_control_avatar.h" #include "field_player_avatar.h" +#include "field_poison.h" #include "field_specials.h" #include "item_menu.h" #include "link.h" @@ -15,11 +17,16 @@ #include "overworld.h" #include "renewable_hidden_items.h" #include "quest_log.h" +#include "safari_zone.h" #include "script.h" #include "start_menu.h" #include "trainer_see.h" +#include "vs_seeker.h" +#include "wild_encounter.h" #include "constants/songs.h" +#include "constants/event_bg.h" #include "constants/event_objects.h" +#include "constants/maps.h" void sub_806CA4C(struct FieldInput *input, u16 *newKeys, u16 *heldKeys); bool8 sub_80699D4(void); @@ -27,15 +34,24 @@ void sub_806CDF8(u8 taskId); void GetPlayerPosition(struct MapPosition * position); void GetInFrontOfPlayerPosition(struct MapPosition * position); u16 GetPlayerCurMetatileBehavior(void); -bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); -bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); -bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); bool8 TryStartInteractionScript(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); const u8 *GetInteractionScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); const u8 *GetInteractedObjectEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); const u8 *GetInteractedBackgroundEventScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +const struct BgEvent *GetBackgroundEventAtPosition(struct MapHeader *, u16, u16, u8); const u8 *GetInteractedMetatileScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); const u8 *GetInteractedWaterScript(struct MapPosition * position, u8 metatileBehavior, u8 playerDirection); +bool8 TryStartStepBasedScript(struct MapPosition * position, u16 metatileBehavior, u16 playerDirection); +bool8 TryStartCoordEventScript(struct MapPosition * position); +bool8 TryStartMiscWalkingScripts(u16 metatileBehavior); +bool8 TryStartStepCountScript(u16 metatileBehavior); +void UpdateHappinessStepCounter(void); +bool8 UpdatePoisonStepCounter(void); +u8 sub_806D898(u8 metatileBehvaior, u8 direction); +const u8 *GetCoordEventScriptAtPosition(struct MapHeader * mapHeader, u16 x, u16 y, u8 z); +bool8 TryStartWarpEventScript(struct MapPosition * position, u16 metatileBehavior); +bool8 TryArrowWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); +bool8 TryDoorWarp(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); bool8 sub_806D804(struct MapPosition * position, u16 metatileBehavior, u8 playerDirection); bool8 CheckStandardWildEncounter(u32 encounter); @@ -426,3 +442,286 @@ const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 metati script = GetRamScript(gSpecialVar_LastTalked, script); return script; } + +const u8 *GetInteractedBackgroundEventScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + u8 r2; + const struct BgEvent *bgEvent = GetBackgroundEventAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (bgEvent == NULL) + return NULL; + if (bgEvent->bgUnion.script == NULL) + return EventScript_TestSignpostMsg; + + r2 = sub_806D898(metatileBehavior, direction); + + switch (bgEvent->kind) + { + case BG_EVENT_PLAYER_FACING_ANY: + default: + break; + case BG_EVENT_PLAYER_FACING_NORTH: + if (direction != DIR_NORTH) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_SOUTH: + if (direction != DIR_SOUTH) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_EAST: + if (direction != DIR_EAST) + return NULL; + break; + case BG_EVENT_PLAYER_FACING_WEST: + if (direction != DIR_WEST) + return NULL; + break; + case 5: + case 6: + case BG_EVENT_HIDDEN_ITEM: + if (GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_UNDERFOOT) == TRUE) + return NULL; + gSpecialVar_0x8005 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_ID); + gSpecialVar_0x8004 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_FLAG); + gSpecialVar_0x8006 = GetHiddenItemAttr((u32)bgEvent->bgUnion.script, HIDDEN_ITEM_QUANTITY); + if (FlagGet(gSpecialVar_0x8004) == TRUE) + return NULL; + gSpecialVar_Facing = direction; + return EventScript_HiddenItemScript; + } + + if (r2 != 0xFF) + sub_8069A20(); + gSpecialVar_Facing = direction; + return bgEvent->bgUnion.script; +} + +const u8 *GetInteractedMetatileScript(struct MapPosition *position, u8 metatileBehavior, u8 direction) +{ + gSpecialVar_Facing = direction; + if (MetatileBehavior_IsPC(metatileBehavior) == TRUE) + return EventScript_PC; + if (MetatileBehavior_IsRegionMap(metatileBehavior) == TRUE) + return EventScript_WallTownMap; + if (MetatileBehavior_IsBookshelf(metatileBehavior) == TRUE) + return gUnknown_81A7606; + if (MetatileBehavior_IsPokeMartShelf(metatileBehavior) == TRUE) + return gUnknown_81A760F; + if (MetatileBehavior_IsFood(metatileBehavior) == TRUE) + return gUnknown_81A7618; + if (MetatileBehavior_IsImpressiveMachine(metatileBehavior) == TRUE) + return gUnknown_81A7633; + if (MetatileBehavior_IsBlueprints(metatileBehavior) == TRUE) + return gUnknown_81A763C; + if (MetatileBehavior_IsVideoGame(metatileBehavior) == TRUE) + return gUnknown_81A7621; + if (MetatileBehavior_IsBurglary(metatileBehavior) == TRUE) + return gUnknown_81A7645; + if (MetatileBehavior_IsComputer(metatileBehavior) == TRUE) + return gUnknown_81A762A; + if (MetatileBehavior_IsMBA3(metatileBehavior) == TRUE) + return TrainerTower_EventScript_ShowTime; + if (MetatileBehavior_IsPlayerFacingTVScreen(metatileBehavior, direction) == TRUE) + return gUnknown_81A764E; + if (MetatileBehavior_IsCabinet(metatileBehavior) == TRUE) + return gUnknown_81A7657; + if (MetatileBehavior_IsKitchen(metatileBehavior) == TRUE) + return gUnknown_81A7660; + if (MetatileBehavior_IsDresser(metatileBehavior) == TRUE) + return gUnknown_81A7669; + if (MetatileBehavior_IsSnacks(metatileBehavior) == TRUE) + return gUnknown_81A7672; + if (MetatileBehavior_IsPainting(metatileBehavior) == TRUE) + return gUnknown_81A767B; + if (MetatileBehavior_IsPowerPlantMachine(metatileBehavior) == TRUE) + return gUnknown_81A7684; + if (MetatileBehavior_IsTelephone(metatileBehavior) == TRUE) + return gUnknown_81A768D; + if (MetatileBehavior_IsAdvertisingPoster(metatileBehavior) == TRUE) + return gUnknown_81A7696; + if (MetatileBehavior_IsTastyFood(metatileBehavior) == TRUE) + return gUnknown_81A769F; + if (MetatileBehavior_IsTrashBin(metatileBehavior) == TRUE) + return gUnknown_81A76A8; + if (MetatileBehavior_IsCup(metatileBehavior) == TRUE) + return gUnknown_81A76B1; + if (MetatileBehavior_ReturnFalse_19(metatileBehavior) == TRUE) + return gUnknown_81A76BA; + if (MetatileBehavior_ReturnFalse_20(metatileBehavior) == TRUE) + return gUnknown_81A76C3; + if (MetatileBehavior_IsBlinkingLights(metatileBehavior) == TRUE) + return gUnknown_81A76CC; + if (MetatileBehavior_IsMB9F(metatileBehavior) == TRUE) + return gUnknown_81A76D5; + if (MetatileBehavior_IsPlayerFacingMB_8D(metatileBehavior, direction) == TRUE) + return CableClub_EventScript_81BBFD8; + if (MetatileBehavior_IsQuestionnaire(metatileBehavior) == TRUE) + return EventScript_Questionnaire; + if (MetatileBehavior_IsPlayerFacingBattleRecords(metatileBehavior, direction) == TRUE) + return CableClub_EventScript_ShowBattleRecords; + if (MetatileBehavior_IsIndigoPlateauMark(metatileBehavior) == TRUE) + { + sub_8069A20(); + return gUnknown_81A76F0; + } + if (MetatileBehavior_IsIndigoPlateauMark2(metatileBehavior) == TRUE) + { + sub_8069A20(); + return gUnknown_81A76F9; + } + if (MetatileBehavior_IsPlayerFacingPokeMartSign(metatileBehavior, direction) == TRUE) + { + sub_8069A20(); + return gUnknown_81A76DE; + } + if (MetatileBehavior_IsPlayerFacingPokemonCenterSign(metatileBehavior, direction) == TRUE) + { + sub_8069A20(); + return gUnknown_81A76E7; + } + return NULL; +} + +const u8 *GetInteractedWaterScript(struct MapPosition *unused1, u8 metatileBehavior, u8 direction) +{ + if (MetatileBehavior_IsSemiDeepWater(metatileBehavior) == TRUE &&PartyHasMonWithSurf() == TRUE) + return EventScript_CurrentTooFast; + if (FlagGet(FLAG_BADGE05_GET) == TRUE && PartyHasMonWithSurf() == TRUE && IsPlayerFacingSurfableFishableWater() == TRUE) + return EventScript_UseSurf; + + if (MetatileBehavior_IsWaterfall(metatileBehavior) == TRUE) + { + if (FlagGet(FLAG_BADGE07_GET) == TRUE && IsPlayerSurfingNorth() == TRUE) + return EventScript_Waterfall; + else + return EventScript_CantUseWaterfall; + } + return NULL; +} + +bool8 TryStartStepBasedScript(struct MapPosition *position, u16 metatileBehavior, u16 direction) +{ + if (TryStartCoordEventScript(position) == TRUE) + return TRUE; + if (TryStartWarpEventScript(position, metatileBehavior) == TRUE) + return TRUE; + if (TryStartMiscWalkingScripts(metatileBehavior) == TRUE) + return TRUE; + if (TryStartStepCountScript(metatileBehavior) == TRUE) + return TRUE; + if (!(gPlayerAvatar.flags & 0x40) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior) && UpdateRepelCounter() == TRUE) + return TRUE; + return FALSE; +} + +bool8 TryStartCoordEventScript(struct MapPosition *position) +{ + const u8 *script = GetCoordEventScriptAtPosition(&gMapHeader, position->x - 7, position->y - 7, position->height); + + if (script == NULL) + return FALSE; + ScriptContext1_SetupScript(script); + return TRUE; +} + +bool8 TryStartMiscWalkingScripts(u16 metatileBehavior) +{ + // Dummied + return FALSE; +} + +bool8 TryStartStepCountScript(u16 metatileBehavior) +{ + if (InUnionRoom() == TRUE) + return FALSE; + if (gQuestLogState == QL_STATE_2) + return FALSE; + + UpdateHappinessStepCounter(); + + if (!(gPlayerAvatar.flags & 0x40) && !MetatileBehavior_IsForcedMovementTile(metatileBehavior)) + { + if (sub_810C4EC() == TRUE) + { + ScriptContext1_SetupScript(gUnknown_81A8CED); + return TRUE; + } + else if (UpdatePoisonStepCounter() == TRUE) + { + ScriptContext1_SetupScript(EventScript_FieldPoison); + return TRUE; + } + else if (ShouldEggHatch()) + { + IncrementGameStat(GAME_STAT_HATCHED_EGGS); + ScriptContext1_SetupScript(EventScript_EggHatch); + return TRUE; + } + } + if (SafariZoneTakeStep() == TRUE) + return TRUE; + return FALSE; +} + +void Unref_ClearHappinessStepCounter(void) +{ + VarSet(VAR_HAPPINESS_STEP_COUNTER, 0); +} + +void UpdateHappinessStepCounter(void) +{ + u16 *ptr = GetVarPointer(VAR_HAPPINESS_STEP_COUNTER); + int i; + + (*ptr)++; + (*ptr) %= 128; + if (*ptr == 0) + { + struct Pokemon *mon = gPlayerParty; + for (i = 0; i < PARTY_SIZE; i++) + { + AdjustFriendship(mon, FRIENDSHIP_EVENT_WALKING); + mon++; + } + } +} + +void ClearPoisonStepCounter(void) +{ + VarSet(VAR_POISON_STEP_COUNTER, 0); +} + +bool8 UpdatePoisonStepCounter(void) +{ + u16 *ptr; + + if (gMapHeader.mapType != MAP_TYPE_SECRET_BASE) + { + ptr = GetVarPointer(VAR_POISON_STEP_COUNTER); + (*ptr)++; + (*ptr) %= 5; + if (*ptr == 0) + { + switch (DoPoisonFieldEffect()) + { + case FLDPSN_NONE: + return FALSE; + case FLDPSN_PSN: + return FALSE; + case FLDPSN_FNT: + return TRUE; + } + } + } + return FALSE; +} + +void RestartWildEncounterImmunitySteps(void) +{ + ResetEncounterRateModifiers(); +} + +bool8 CheckStandardWildEncounter(u32 encounter) +{ + return TryStandardWildEncounter(encounter); +} |