Merge pull request #564 from GriffinRichards/sync-field-screen-effect
Sync field_screen_effect
This commit is contained in:
+54
-51
@@ -12,14 +12,14 @@
|
|||||||
#include "event_object_movement.h"
|
#include "event_object_movement.h"
|
||||||
#include "field_fadetransition.h"
|
#include "field_fadetransition.h"
|
||||||
#include "event_scripts.h"
|
#include "event_scripts.h"
|
||||||
|
#include "constants/heal_locations.h"
|
||||||
|
#include "constants/maps.h"
|
||||||
|
|
||||||
static const u16 sFlashLevelPixelRadii[] = {
|
static const u16 sFlashLevelToRadius[] = { 200, 72, 56, 40, 24 };
|
||||||
0x00c8, 0x0048, 0x0038, 0x0028, 0x0018
|
const s32 gMaxFlashLevel = ARRAY_COUNT(sFlashLevelToRadius) - 1;
|
||||||
};
|
|
||||||
|
|
||||||
const s32 gMaxFlashLevel = NELEMS(sFlashLevelPixelRadii) - 1;
|
static const struct WindowTemplate sWindowTemplate_WhiteoutText =
|
||||||
|
{
|
||||||
static const struct WindowTemplate gUnknown_83C68E4 = {
|
|
||||||
.bg = 0,
|
.bg = 0,
|
||||||
.tilemapLeft = 0,
|
.tilemapLeft = 0,
|
||||||
.tilemapTop = 5,
|
.tilemapTop = 5,
|
||||||
@@ -29,7 +29,7 @@ static const struct WindowTemplate gUnknown_83C68E4 = {
|
|||||||
.baseBlock = 1,
|
.baseBlock = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u8 gUnknown_83C68EC[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };
|
static const u8 sWhiteoutTextColors[] = { TEXT_COLOR_TRANSPARENT, TEXT_COLOR_WHITE, TEXT_COLOR_DARK_GRAY };
|
||||||
|
|
||||||
static void Task_EnableScriptAfterMusicFade(u8 taskId);
|
static void Task_EnableScriptAfterMusicFade(u8 taskId);
|
||||||
static void Task_BarnDoorWipeChild(u8 taskId);
|
static void Task_BarnDoorWipeChild(u8 taskId);
|
||||||
@@ -150,7 +150,7 @@ static void UpdateFlashLevelEffect(u8 taskId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sub_807EF7C(u8 taskId)
|
static void Task_WaitForFlashUpdate(u8 taskId)
|
||||||
{
|
{
|
||||||
if (!FuncIsActiveTask(UpdateFlashLevelEffect))
|
if (!FuncIsActiveTask(UpdateFlashLevelEffect))
|
||||||
{
|
{
|
||||||
@@ -159,13 +159,13 @@ static void sub_807EF7C(u8 taskId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sub_807EFA4(void)
|
static void StartWaitForFlashUpdate(void)
|
||||||
{
|
{
|
||||||
if (!FuncIsActiveTask(sub_807EF7C))
|
if (!FuncIsActiveTask(Task_WaitForFlashUpdate))
|
||||||
CreateTask(sub_807EF7C, 80);
|
CreateTask(Task_WaitForFlashUpdate, 80);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 sub_807EFC8(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, bool32 clearScanlineEffect, u8 delta)
|
static u8 StartUpdateFlashLevelEffect(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 destFlashRadius, bool32 clearScanlineEffect, u8 delta)
|
||||||
{
|
{
|
||||||
u8 taskId = CreateTask(UpdateFlashLevelEffect, 80);
|
u8 taskId = CreateTask(UpdateFlashLevelEffect, 80);
|
||||||
s16 *data = gTasks[taskId].data;
|
s16 *data = gTasks[taskId].data;
|
||||||
@@ -190,14 +190,15 @@ static u8 sub_807EFC8(s32 centerX, s32 centerY, s32 initialFlashRadius, s32 dest
|
|||||||
#undef tFlashRadiusDelta
|
#undef tFlashRadiusDelta
|
||||||
#undef tClearScanlineEffect
|
#undef tClearScanlineEffect
|
||||||
|
|
||||||
void AnimateFlash(u8 flashLevel)
|
// A higher flash level is a smaller flash radius (more darkness). 0 is full brightness
|
||||||
|
void AnimateFlash(u8 newFlashLevel)
|
||||||
{
|
{
|
||||||
u8 curFlashLevel = Overworld_GetFlashLevel();
|
u8 curFlashLevel = Overworld_GetFlashLevel();
|
||||||
bool32 value = FALSE;
|
bool32 fullBrightness = FALSE;
|
||||||
if (!flashLevel)
|
if (newFlashLevel == 0)
|
||||||
value = TRUE;
|
fullBrightness = TRUE;
|
||||||
sub_807EFC8(120, 80, sFlashLevelPixelRadii[curFlashLevel], sFlashLevelPixelRadii[flashLevel], value, 2);
|
StartUpdateFlashLevelEffect(DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2, sFlashLevelToRadius[curFlashLevel], sFlashLevelToRadius[newFlashLevel], fullBrightness, 2);
|
||||||
sub_807EFA4();
|
StartWaitForFlashUpdate();
|
||||||
LockPlayerFieldControls();
|
LockPlayerFieldControls();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +206,7 @@ void WriteFlashScanlineEffectBuffer(u8 flashLevel)
|
|||||||
{
|
{
|
||||||
if (flashLevel)
|
if (flashLevel)
|
||||||
{
|
{
|
||||||
SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, sFlashLevelPixelRadii[flashLevel]);
|
SetFlashScanlineEffectWindowBoundaries(&gScanlineEffectRegBuffers[0][0], 120, 80, sFlashLevelToRadius[flashLevel]);
|
||||||
CpuFastCopy(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 240 * 8);
|
CpuFastCopy(&gScanlineEffectRegBuffers[0], &gScanlineEffectRegBuffers[1], 240 * 8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -283,15 +284,15 @@ void Task_BarnDoorWipe(u8 taskId)
|
|||||||
if (data[10] == 0)
|
if (data[10] == 0)
|
||||||
{
|
{
|
||||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0));
|
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0));
|
||||||
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(240, 255));
|
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH, 255));
|
||||||
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));
|
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));
|
||||||
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));
|
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 120));
|
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH / 2));
|
||||||
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));
|
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 255));
|
||||||
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(120, 255));
|
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(DISPLAY_WIDTH / 2, 255));
|
||||||
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));
|
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(0, 255));
|
||||||
}
|
}
|
||||||
SetGpuReg(REG_OFFSET_WININ, 0);
|
SetGpuReg(REG_OFFSET_WININ, 0);
|
||||||
@@ -323,8 +324,8 @@ static void Task_BarnDoorWipeChild(u8 taskId)
|
|||||||
if (gTasks[parentTaskId].tDirection == DIR_WIPE_IN)
|
if (gTasks[parentTaskId].tDirection == DIR_WIPE_IN)
|
||||||
{
|
{
|
||||||
lhs = tChildOffset;
|
lhs = tChildOffset;
|
||||||
rhs = 240 - tChildOffset;
|
rhs = DISPLAY_WIDTH - tChildOffset;
|
||||||
if (lhs > 120)
|
if (lhs > DISPLAY_WIDTH / 2)
|
||||||
{
|
{
|
||||||
DestroyTask(taskId);
|
DestroyTask(taskId);
|
||||||
return;
|
return;
|
||||||
@@ -332,8 +333,8 @@ static void Task_BarnDoorWipeChild(u8 taskId)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lhs = 120 - tChildOffset;
|
lhs = DISPLAY_WIDTH / 2 - tChildOffset;
|
||||||
rhs = 120 + tChildOffset;
|
rhs = DISPLAY_WIDTH / 2 + tChildOffset;
|
||||||
if (lhs < 0)
|
if (lhs < 0)
|
||||||
{
|
{
|
||||||
DestroyTask(taskId);
|
DestroyTask(taskId);
|
||||||
@@ -341,15 +342,11 @@ static void Task_BarnDoorWipeChild(u8 taskId)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, lhs));
|
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, lhs));
|
||||||
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(rhs, 240));
|
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(rhs, DISPLAY_WIDTH));
|
||||||
if (lhs <= 89)
|
if (lhs < 90)
|
||||||
{
|
|
||||||
tChildOffset += 4;
|
tChildOffset += 4;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
tChildOffset += 2;
|
tChildOffset += 2;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef tState
|
#undef tState
|
||||||
@@ -358,24 +355,28 @@ static void Task_BarnDoorWipeChild(u8 taskId)
|
|||||||
#undef DIR_WIPE_OUT
|
#undef DIR_WIPE_OUT
|
||||||
#undef tChildOffset
|
#undef tChildOffset
|
||||||
|
|
||||||
|
#define tState data[0]
|
||||||
|
#define tWindowId data[1]
|
||||||
|
#define tPrintState data[2]
|
||||||
|
|
||||||
static bool8 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u8 x, u8 y)
|
static bool8 PrintWhiteOutRecoveryMessage(u8 taskId, const u8 *text, u8 x, u8 y)
|
||||||
{
|
{
|
||||||
u8 windowId = gTasks[taskId].data[1];
|
u8 windowId = gTasks[taskId].tWindowId;
|
||||||
|
|
||||||
switch (gTasks[taskId].data[2])
|
switch (gTasks[taskId].tPrintState)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||||
StringExpandPlaceholders(gStringVar4, text);
|
StringExpandPlaceholders(gStringVar4, text);
|
||||||
AddTextPrinterParameterized4(windowId, FONT_2, x, y, 1, 0, gUnknown_83C68EC, 1, gStringVar4);
|
AddTextPrinterParameterized4(windowId, FONT_2, x, y, 1, 0, sWhiteoutTextColors, 1, gStringVar4);
|
||||||
gTextFlags.canABSpeedUpPrint = FALSE;
|
gTextFlags.canABSpeedUpPrint = FALSE;
|
||||||
gTasks[taskId].data[2] = 1;
|
gTasks[taskId].tPrintState = 1;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
RunTextPrinters();
|
RunTextPrinters();
|
||||||
if (!IsTextPrinterActive(windowId))
|
if (!IsTextPrinterActive(windowId))
|
||||||
{
|
{
|
||||||
gTasks[taskId].data[2] = 0;
|
gTasks[taskId].tPrintState = 0;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -388,48 +389,50 @@ static void Task_RushInjuredPokemonToCenter(u8 taskId)
|
|||||||
u8 windowId;
|
u8 windowId;
|
||||||
const struct HealLocation *loc;
|
const struct HealLocation *loc;
|
||||||
|
|
||||||
switch (gTasks[taskId].data[0])
|
switch (gTasks[taskId].tState)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
windowId = AddWindow(&gUnknown_83C68E4);
|
windowId = AddWindow(&sWindowTemplate_WhiteoutText);
|
||||||
gTasks[taskId].data[1] = windowId;
|
gTasks[taskId].tWindowId = windowId;
|
||||||
Menu_LoadStdPalAt(0xF0);
|
Menu_LoadStdPalAt(0xF0);
|
||||||
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
|
||||||
PutWindowTilemap(windowId);
|
PutWindowTilemap(windowId);
|
||||||
CopyWindowToVram(windowId, COPYWIN_FULL);
|
CopyWindowToVram(windowId, COPYWIN_FULL);
|
||||||
loc = GetHealLocation(1);
|
|
||||||
|
// Scene changes if last heal location was the player's house
|
||||||
|
loc = GetHealLocation(SPAWN_PALLET_TOWN);
|
||||||
if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group
|
if (gSaveBlock1Ptr->lastHealLocation.mapGroup == loc->group
|
||||||
&& gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map
|
&& gSaveBlock1Ptr->lastHealLocation.mapNum == loc->map
|
||||||
&& gSaveBlock1Ptr->lastHealLocation.warpId == -1
|
&& gSaveBlock1Ptr->lastHealLocation.warpId == WARP_ID_NONE
|
||||||
&& gSaveBlock1Ptr->lastHealLocation.x == loc->x
|
&& gSaveBlock1Ptr->lastHealLocation.x == loc->x
|
||||||
&& gSaveBlock1Ptr->lastHealLocation.y == loc->y)
|
&& gSaveBlock1Ptr->lastHealLocation.y == loc->y)
|
||||||
gTasks[taskId].data[0] = 4;
|
gTasks[taskId].tState = 4;
|
||||||
else
|
else
|
||||||
gTasks[taskId].data[0] = 1;
|
gTasks[taskId].tState = 1;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedToCenter, 2, 8))
|
if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedToCenter, 2, 8))
|
||||||
{
|
{
|
||||||
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], 2);
|
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH);
|
||||||
++gTasks[taskId].data[0];
|
gTasks[taskId].tState++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedBackHome, 2, 8))
|
if (PrintWhiteOutRecoveryMessage(taskId, gText_PlayerScurriedBackHome, 2, 8))
|
||||||
{
|
{
|
||||||
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], 2);
|
ObjectEventTurn(&gObjectEvents[gPlayerAvatar.objectEventId], DIR_NORTH);
|
||||||
++gTasks[taskId].data[0];
|
gTasks[taskId].tState++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
case 5:
|
case 5:
|
||||||
windowId = gTasks[taskId].data[1];
|
windowId = gTasks[taskId].tWindowId;
|
||||||
ClearWindowTilemap(windowId);
|
ClearWindowTilemap(windowId);
|
||||||
CopyWindowToVram(windowId, COPYWIN_MAP);
|
CopyWindowToVram(windowId, COPYWIN_MAP);
|
||||||
RemoveWindow(windowId);
|
RemoveWindow(windowId);
|
||||||
palette_bg_faded_fill_black();
|
palette_bg_faded_fill_black();
|
||||||
FadeInFromBlack();
|
FadeInFromBlack();
|
||||||
++gTasks[taskId].data[0];
|
gTasks[taskId].tState++;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)
|
if (FieldFadeTransitionBackgroundEffectIsFinished() == TRUE)
|
||||||
@@ -455,5 +458,5 @@ void FieldCB_RushInjuredPokemonToCenter(void)
|
|||||||
LockPlayerFieldControls();
|
LockPlayerFieldControls();
|
||||||
palette_bg_faded_fill_black();
|
palette_bg_faded_fill_black();
|
||||||
taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10);
|
taskId = CreateTask(Task_RushInjuredPokemonToCenter, 10);
|
||||||
gTasks[taskId].data[0] = 0;
|
gTasks[taskId].tState = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user