2017-09-09 15:45:50 +02:00
|
|
|
#include "global.h"
|
|
|
|
#include "safari_zone.h"
|
|
|
|
#include "event_data.h"
|
2017-12-05 18:55:48 +01:00
|
|
|
#include "constants/game_stat.h"
|
2017-09-09 15:45:50 +02:00
|
|
|
#include "main.h"
|
|
|
|
#include "battle.h"
|
|
|
|
#include "string_util.h"
|
2017-12-11 16:52:28 +01:00
|
|
|
#include "pokeblock.h"
|
2017-09-09 15:45:50 +02:00
|
|
|
|
|
|
|
struct PokeblockFeeder
|
|
|
|
{
|
|
|
|
/*0x00*/ s16 x;
|
|
|
|
/*0x02*/ s16 y;
|
|
|
|
/*0x04*/ s8 mapNum;
|
|
|
|
/*0x05*/ u8 stepCounter;
|
|
|
|
/*0x08*/ struct Pokeblock pokeblock;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define NUM_POKEBLOCK_FEEDERS 10
|
|
|
|
|
|
|
|
extern u8 gBattleOutcome;
|
2017-09-18 18:36:05 +02:00
|
|
|
extern void* gFieldCallback;
|
2017-09-09 15:45:50 +02:00
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
extern u8 EventScript_2A4B8A[];
|
|
|
|
extern u8 EventScript_2A4B6F[];
|
|
|
|
extern u8 EventScript_2A4B4C[];
|
|
|
|
extern u8 EventScript_2A4B9B[];
|
2017-09-09 15:45:50 +02:00
|
|
|
|
|
|
|
extern void sub_80EE44C(u8, u8);
|
|
|
|
extern void IncrementGameStat(u8 index);
|
|
|
|
extern void ScriptContext1_SetupScript(u8*);
|
|
|
|
extern void ScriptContext2_RunNewScript(u8*);
|
|
|
|
extern void c2_exit_to_overworld_2_switch(void);
|
|
|
|
extern void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
|
|
|
|
extern void c2_load_new_map(void);
|
|
|
|
extern void sub_80AF6F0(void);
|
2017-09-10 23:05:23 +02:00
|
|
|
extern void ScriptContext1_Stop(void);
|
2017-09-09 15:45:50 +02:00
|
|
|
extern void warp_in(void);
|
|
|
|
extern void GetXYCoordsOneStepInFrontOfPlayer(s16* x, s16* y);
|
|
|
|
extern void PlayerGetDestCoords(s16* x, s16* y);
|
|
|
|
|
|
|
|
EWRAM_DATA u8 gNumSafariBalls = 0;
|
|
|
|
EWRAM_DATA static u16 sSafariZoneStepCounter = 0;
|
|
|
|
EWRAM_DATA static u8 sSafariZoneCaughtMons = 0;
|
|
|
|
EWRAM_DATA static u8 sSafariZoneFleedMons = 0;
|
|
|
|
EWRAM_DATA static struct PokeblockFeeder sPokeblockFeeders[NUM_POKEBLOCK_FEEDERS] = {0};
|
|
|
|
|
|
|
|
static void ClearAllPokeblockFeeders(void);
|
|
|
|
static void DecrementFeederStepCounters(void);
|
|
|
|
|
|
|
|
bool32 GetSafariZoneFlag(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
return FlagGet(FLAG_SYS_SAFARI_MODE);
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void SetSafariZoneFlag(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagSet(FLAG_SYS_SAFARI_MODE);
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void ResetSafariZoneFlag(void)
|
|
|
|
{
|
2017-11-08 22:20:10 +01:00
|
|
|
FlagClear(FLAG_SYS_SAFARI_MODE);
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void EnterSafariMode(void)
|
|
|
|
{
|
|
|
|
IncrementGameStat(GAME_STAT_ENTERED_SAFARI_ZONE);
|
|
|
|
SetSafariZoneFlag();
|
|
|
|
ClearAllPokeblockFeeders();
|
|
|
|
gNumSafariBalls = 30;
|
|
|
|
sSafariZoneStepCounter = 500;
|
|
|
|
sSafariZoneCaughtMons = 0;
|
|
|
|
sSafariZoneFleedMons = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void ExitSafariMode(void)
|
|
|
|
{
|
|
|
|
sub_80EE44C(sSafariZoneCaughtMons, sSafariZoneFleedMons);
|
|
|
|
ResetSafariZoneFlag();
|
|
|
|
ClearAllPokeblockFeeders();
|
|
|
|
gNumSafariBalls = 0;
|
|
|
|
sSafariZoneStepCounter = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool8 SafariZoneTakeStep(void)
|
|
|
|
{
|
|
|
|
if (GetSafariZoneFlag() == FALSE)
|
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
DecrementFeederStepCounters();
|
|
|
|
sSafariZoneStepCounter--;
|
|
|
|
if (sSafariZoneStepCounter == 0)
|
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
ScriptContext1_SetupScript(EventScript_2A4B8A);
|
2017-09-09 15:45:50 +02:00
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SafariZoneRetirePrompt(void)
|
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
ScriptContext1_SetupScript(EventScript_2A4B6F);
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
2017-11-28 23:02:09 +01:00
|
|
|
void CB2_EndSafariBattle(void)
|
2017-09-09 15:45:50 +02:00
|
|
|
{
|
|
|
|
sSafariZoneFleedMons += gBattleResults.field_1F;
|
|
|
|
if (gBattleOutcome == BATTLE_CAUGHT)
|
|
|
|
sSafariZoneCaughtMons++;
|
|
|
|
if (gNumSafariBalls != 0)
|
|
|
|
{
|
|
|
|
SetMainCallback2(c2_exit_to_overworld_2_switch);
|
|
|
|
}
|
2017-10-13 17:09:36 +02:00
|
|
|
else if (gBattleOutcome == BATTLE_SAFARI_OUT_OF_BALLS)
|
2017-09-09 15:45:50 +02:00
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
ScriptContext2_RunNewScript(EventScript_2A4B4C);
|
2017-09-09 15:45:50 +02:00
|
|
|
warp_in();
|
2017-09-18 18:36:05 +02:00
|
|
|
gFieldCallback = sub_80AF6F0;
|
2017-09-09 15:45:50 +02:00
|
|
|
SetMainCallback2(c2_load_new_map);
|
|
|
|
}
|
|
|
|
else if (gBattleOutcome == BATTLE_CAUGHT)
|
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
ScriptContext1_SetupScript(EventScript_2A4B9B);
|
2017-09-10 23:05:23 +02:00
|
|
|
ScriptContext1_Stop();
|
2017-09-09 15:45:50 +02:00
|
|
|
SetMainCallback2(c2_exit_to_overworld_1_continue_scripts_restart_music);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void ClearPokeblockFeeder(u8 index)
|
|
|
|
{
|
|
|
|
memset(&sPokeblockFeeders[index], 0, sizeof(struct PokeblockFeeder));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void ClearAllPokeblockFeeders(void)
|
|
|
|
{
|
|
|
|
memset(sPokeblockFeeders, 0, sizeof(sPokeblockFeeders));
|
|
|
|
}
|
|
|
|
|
2017-10-14 20:26:25 +02:00
|
|
|
void GetPokeblockFeederInFront(void)
|
2017-09-09 15:45:50 +02:00
|
|
|
{
|
|
|
|
s16 x, y;
|
|
|
|
u16 i;
|
|
|
|
|
|
|
|
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++)
|
|
|
|
{
|
|
|
|
if (gSaveBlock1Ptr->location.mapNum == sPokeblockFeeders[i].mapNum
|
|
|
|
&& sPokeblockFeeders[i].x == x
|
|
|
|
&& sPokeblockFeeders[i].y == y)
|
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
gSpecialVar_Result = i;
|
2017-09-09 15:45:50 +02:00
|
|
|
StringCopy(gStringVar1, gPokeblockNames[sPokeblockFeeders[i].pokeblock.color]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
gSpecialVar_Result = -1;
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void GetPokeblockFeederWithinRange(void)
|
|
|
|
{
|
|
|
|
s16 x, y;
|
|
|
|
u16 i;
|
|
|
|
|
|
|
|
PlayerGetDestCoords(&x, &y);
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++)
|
|
|
|
{
|
|
|
|
if (gSaveBlock1Ptr->location.mapNum == sPokeblockFeeders[i].mapNum)
|
|
|
|
{
|
|
|
|
//Get absolute value of x and y distance from Pokeblock feeder on current map
|
|
|
|
x -= sPokeblockFeeders[i].x;
|
|
|
|
y -= sPokeblockFeeders[i].y;
|
|
|
|
if (x < 0)
|
|
|
|
x *= -1;
|
|
|
|
if (y < 0)
|
|
|
|
y *= -1;
|
|
|
|
if ((x + y) <= 5)
|
|
|
|
{
|
2017-11-11 01:12:18 +01:00
|
|
|
gSpecialVar_Result = i;
|
2017-09-09 15:45:50 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
gSpecialVar_Result = -1;
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// unused
|
|
|
|
struct Pokeblock *SafariZoneGetPokeblockInFront(void)
|
|
|
|
{
|
|
|
|
GetPokeblockFeederInFront();
|
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
if (gSpecialVar_Result == 0xFFFF)
|
2017-09-09 15:45:50 +02:00
|
|
|
return NULL;
|
|
|
|
else
|
2017-11-11 01:12:18 +01:00
|
|
|
return &sPokeblockFeeders[gSpecialVar_Result].pokeblock;
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct Pokeblock *SafariZoneGetActivePokeblock(void)
|
|
|
|
{
|
|
|
|
GetPokeblockFeederWithinRange();
|
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
if (gSpecialVar_Result == 0xFFFF)
|
2017-09-09 15:45:50 +02:00
|
|
|
return NULL;
|
|
|
|
else
|
2017-11-11 01:12:18 +01:00
|
|
|
return &sPokeblockFeeders[gSpecialVar_Result].pokeblock;
|
2017-09-09 15:45:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void SafariZoneActivatePokeblockFeeder(u8 pkblId)
|
|
|
|
{
|
|
|
|
s16 x, y;
|
|
|
|
u8 i;
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++)
|
|
|
|
{
|
|
|
|
// Find free entry in sPokeblockFeeders
|
|
|
|
if (sPokeblockFeeders[i].mapNum == 0
|
|
|
|
&& sPokeblockFeeders[i].x == 0
|
|
|
|
&& sPokeblockFeeders[i].y == 0)
|
|
|
|
{
|
|
|
|
// Initialize Pokeblock feeder
|
|
|
|
GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
|
|
|
|
sPokeblockFeeders[i].mapNum = gSaveBlock1Ptr->location.mapNum;
|
|
|
|
sPokeblockFeeders[i].pokeblock = gSaveBlock1Ptr->pokeblocks[pkblId];
|
|
|
|
sPokeblockFeeders[i].stepCounter = 100;
|
|
|
|
sPokeblockFeeders[i].x = x;
|
|
|
|
sPokeblockFeeders[i].y = y;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void DecrementFeederStepCounters(void)
|
|
|
|
{
|
|
|
|
u8 i;
|
|
|
|
|
|
|
|
for (i = 0; i < NUM_POKEBLOCK_FEEDERS; i++)
|
|
|
|
{
|
|
|
|
if (sPokeblockFeeders[i].stepCounter != 0)
|
|
|
|
{
|
|
|
|
sPokeblockFeeders[i].stepCounter--;
|
|
|
|
if (sPokeblockFeeders[i].stepCounter == 0)
|
|
|
|
ClearPokeblockFeeder(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// unused
|
|
|
|
bool8 GetInFrontFeederPokeblockAndSteps(void)
|
|
|
|
{
|
|
|
|
GetPokeblockFeederInFront();
|
|
|
|
|
2017-11-11 01:12:18 +01:00
|
|
|
if (gSpecialVar_Result == 0xFFFF)
|
2017-09-09 15:45:50 +02:00
|
|
|
{
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
ConvertIntToDecimalStringN(gStringVar2,
|
2017-11-11 01:12:18 +01:00
|
|
|
sPokeblockFeeders[gSpecialVar_Result].stepCounter,
|
2017-09-09 15:45:50 +02:00
|
|
|
STR_CONV_MODE_LEADING_ZEROS, 3);
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|