Port field_camera from Emerald

This commit is contained in:
PikalaxALT
2020-03-10 15:19:50 -04:00
parent a9bc506b32
commit 4594c5dac9
14 changed files with 619 additions and 1351 deletions
+2 -2
View File
@@ -718,7 +718,7 @@ StartTransitionToFlipBikeState: @ 80BD5C8
push {r4,lr}
lsls r0, 24
lsrs r2, r0, 24
ldr r1, _080BD5F0 @ =gUnknown_2036E2C
ldr r1, _080BD5F0 @ =gUnusedBikeCameraAheadPanback
movs r0, 0
strb r0, [r1]
ldr r0, _080BD5F4 @ =gPlayerAvatar
@@ -733,7 +733,7 @@ StartTransitionToFlipBikeState: @ 80BD5C8
bl Overworld_PlaySpecialMapMusic
b _080BD618
.align 2, 0
_080BD5F0: .4byte gUnknown_2036E2C
_080BD5F0: .4byte gUnusedBikeCameraAheadPanback
_080BD5F4: .4byte gPlayerAvatar
_080BD5F8:
adds r0, r2, 0
+4 -4
View File
@@ -12924,7 +12924,7 @@ SetSpritePosToMapCoords: @ 8063B1C
ldr r0, _08063BB0 @ =gTotalCameraPixelOffsetX
ldrh r0, [r0]
negs r0, r0
ldr r1, _08063BB4 @ =gUnknown_3005050
ldr r1, _08063BB4 @ =gFieldCamera
ldr r2, [r1, 0x10]
subs r0, r2
lsls r0, 16
@@ -12993,7 +12993,7 @@ _08063B7C:
bx r0
.align 2, 0
_08063BB0: .4byte gTotalCameraPixelOffsetX
_08063BB4: .4byte gUnknown_3005050
_08063BB4: .4byte gFieldCamera
_08063BB8: .4byte gTotalCameraPixelOffsetY
_08063BBC: .4byte 0xfff00000
_08063BC0: .4byte gSaveBlock1Ptr
@@ -13046,7 +13046,7 @@ GetObjectEventMovingCameraOffset: @ 8063C10
movs r0, 0
strh r0, [r2]
strh r0, [r1]
ldr r3, _08063C4C @ =gUnknown_3005050
ldr r3, _08063C4C @ =gFieldCamera
ldr r0, [r3, 0x10]
cmp r0, 0
ble _08063C26
@@ -13076,7 +13076,7 @@ _08063C48:
pop {r0}
bx r0
.align 2, 0
_08063C4C: .4byte gUnknown_3005050
_08063C4C: .4byte gFieldCamera
thumb_func_end GetObjectEventMovingCameraOffset
thumb_func_start ObjectEventMoveDestCoords
-1291
View File
File diff suppressed because it is too large Load Diff
+20 -20
View File
@@ -3091,7 +3091,7 @@ InitOverworldBgs: @ 80562B0
movs r1, 0x5
movs r2, 0x1
bl SetBgAttribute
ldr r0, _08056348 @ =gUnknown_3005018
ldr r0, _08056348 @ =gBGTilemapBuffers2
mov r8, r0
movs r4, 0x80
lsls r4, 4
@@ -3099,11 +3099,11 @@ InitOverworldBgs: @ 80562B0
bl AllocZeroed
mov r1, r8
str r0, [r1]
ldr r6, _0805634C @ =gUnknown_3005014
ldr r6, _0805634C @ =gBGTilemapBuffers1
adds r0, r4, 0
bl AllocZeroed
str r0, [r6]
ldr r5, _08056350 @ =gUnknown_300501C
ldr r5, _08056350 @ =gBGTilemapBuffers3
adds r0, r4, 0
bl AllocZeroed
str r0, [r5]
@@ -3127,9 +3127,9 @@ InitOverworldBgs: @ 80562B0
bx r0
.align 2, 0
_08056344: .4byte gUnknown_826D320
_08056348: .4byte gUnknown_3005018
_0805634C: .4byte gUnknown_3005014
_08056350: .4byte gUnknown_300501C
_08056348: .4byte gBGTilemapBuffers2
_0805634C: .4byte gBGTilemapBuffers1
_08056350: .4byte gBGTilemapBuffers3
thumb_func_end InitOverworldBgs
thumb_func_start sub_8056354
@@ -3155,7 +3155,7 @@ sub_8056354: @ 8056354
movs r1, 0x5
movs r2, 0x1
bl SetBgAttribute
ldr r0, _080563E4 @ =gUnknown_3005018
ldr r0, _080563E4 @ =gBGTilemapBuffers2
mov r8, r0
movs r4, 0x80
lsls r4, 4
@@ -3163,11 +3163,11 @@ sub_8056354: @ 8056354
bl AllocZeroed
mov r1, r8
str r0, [r1]
ldr r6, _080563E8 @ =gUnknown_3005014
ldr r6, _080563E8 @ =gBGTilemapBuffers1
adds r0, r4, 0
bl AllocZeroed
str r0, [r6]
ldr r5, _080563EC @ =gUnknown_300501C
ldr r5, _080563EC @ =gBGTilemapBuffers3
adds r0, r4, 0
bl AllocZeroed
str r0, [r5]
@@ -3191,30 +3191,30 @@ sub_8056354: @ 8056354
bx r0
.align 2, 0
_080563E0: .4byte gUnknown_826D320
_080563E4: .4byte gUnknown_3005018
_080563E8: .4byte gUnknown_3005014
_080563EC: .4byte gUnknown_300501C
_080563E4: .4byte gBGTilemapBuffers2
_080563E8: .4byte gBGTilemapBuffers1
_080563EC: .4byte gBGTilemapBuffers3
thumb_func_end sub_8056354
thumb_func_start CleanupOverworldWindowsAndTilemaps
CleanupOverworldWindowsAndTilemaps: @ 80563F0
push {lr}
bl FreeAllOverworldWindowBuffers
ldr r0, _08056414 @ =gUnknown_300501C
ldr r0, _08056414 @ =gBGTilemapBuffers3
ldr r0, [r0]
bl Free
ldr r0, _08056418 @ =gUnknown_3005014
ldr r0, _08056418 @ =gBGTilemapBuffers1
ldr r0, [r0]
bl Free
ldr r0, _0805641C @ =gUnknown_3005018
ldr r0, _0805641C @ =gBGTilemapBuffers2
ldr r0, [r0]
bl Free
pop {r0}
bx r0
.align 2, 0
_08056414: .4byte gUnknown_300501C
_08056418: .4byte gUnknown_3005014
_0805641C: .4byte gUnknown_3005018
_08056414: .4byte gBGTilemapBuffers3
_08056418: .4byte gBGTilemapBuffers1
_0805641C: .4byte gBGTilemapBuffers2
thumb_func_end CleanupOverworldWindowsAndTilemaps
thumb_func_start sub_8056420
@@ -5344,7 +5344,7 @@ _08057620:
beq _08057648
b _0805754E
_0805762C:
ldr r0, _08057640 @ =gUnknown_3005050
ldr r0, _08057640 @ =gFieldCamera
ldr r1, _08057644 @ =sub_8057748
str r1, [r0]
bl SetFieldVBlankCallback
@@ -5353,7 +5353,7 @@ _0805762C:
movs r0, 0x1
b _0805764A
.align 2, 0
_08057640: .4byte gUnknown_3005050
_08057640: .4byte gFieldCamera
_08057644: .4byte sub_8057748
_08057648:
movs r0, 0
+3
View File
@@ -0,0 +1,3 @@
gFieldCamera
gTotalCameraPixelOffsetY
gTotalCameraPixelOffsetX
+2
View File
@@ -129,6 +129,8 @@ void UpdateObjectEventSpriteVisibility(struct Sprite *sprite, bool8 invisible);
u8 ZCoordToPriority(u8 z);
void SetObjectSubpriorityByZCoord(u8 z, struct Sprite * sprite, u8 offset);
void MakeObjectTemplateFromObjectEventGraphicsInfo(u16 graphicsId, void (*callback)(struct Sprite *), struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables);
u8 AddCameraObject(u8 trackedSpriteId);
void UpdateObjectEventsForCameraUpdate(s16 x, s16 y);
// Exported data declarations
+3 -3
View File
@@ -8,9 +8,9 @@
struct CameraObject
{
void (*callback)(struct CameraObject *);
u32 unk4;
s32 unk8;
s32 unkC;
u32 spriteId;
s32 movementSpeedX;
s32 movementSpeedY;
s32 x;
s32 y;
};
+1
View File
@@ -33,5 +33,6 @@ void save_serialize_map(void);
u32 GetMetatileAttributeFromRawMetatileBehavior(u32 original, u8 bit);
u32 MapGridGetMetatileAttributeAt(s16 x, s16 y, u8 attr);
void MapGridSetMetatileImpassabilityAt(s32 x, s32 y, bool32 arg2);
bool8 CameraMove(s32 x, s32 y);
#endif //GUARD_FIELDMAP_H
+3
View File
@@ -194,6 +194,9 @@ void CB1_Overworld(void);
void sub_80568C4(void);
u8 GetLastUsedWarpMapSectionId(void);
extern u16 *gBGTilemapBuffers1;
extern u16 *gBGTilemapBuffers2;
extern u16 *gBGTilemapBuffers3;
extern u16 gHeldKeyCodeToSend;
#endif //GUARD_OVERWORLD_H
+1 -1
View File
@@ -90,7 +90,7 @@ SECTIONS {
asm/overworld.o(.text);
src/fieldmap.o(.text);
src/metatile_behavior.o(.text);
asm/field_camera.o(.text);
src/field_camera.o(.text);
src/field_door.o(.text);
asm/field_player_avatar.o(.text);
asm/event_object_movement.o(.text);
+572
View File
@@ -0,0 +1,572 @@
#include "global.h"
#include "gflib.h"
#include "field_camera.h"
#include "field_player_avatar.h"
#include "fieldmap.h"
#include "event_object_movement.h"
#include "new_menu_helpers.h"
#include "overworld.h"
EWRAM_DATA bool8 gUnusedBikeCameraAheadPanback = FALSE;
// Static type declarations
struct FieldCameraOffset
{
u8 xPixelOffset;
u8 yPixelOffset;
u8 xTileOffset;
u8 yTileOffset;
bool8 copyBGToVRAM;
};
// static functions
static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout);
static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *a, s32 x, s32 y);
static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout);
static void DrawMetatileAt(const struct MapLayout *mapLayout, u16, int, int);
static void DrawMetatile(s32 a, const u16 *b, u16 c);
static void CameraPanningCB_PanAhead(void);
// IWRAM bss vars
static struct FieldCameraOffset sFieldCameraOffset;
static s16 sHorizontalCameraPan;
static s16 sVerticalCameraPan;
static u8 gUnknown_3000E9C;
static void (*sFieldCameraPanningCallback)(void);
struct CameraObject gFieldCamera;
u16 gTotalCameraPixelOffsetY;
u16 gTotalCameraPixelOffsetX;
// text
static void move_tilemap_camera_to_upper_left_corner_(struct FieldCameraOffset *cameraOffset)
{
cameraOffset->xTileOffset = 0;
cameraOffset->yTileOffset = 0;
cameraOffset->xPixelOffset = 0;
cameraOffset->yPixelOffset = 0;
cameraOffset->copyBGToVRAM = TRUE;
}
static void tilemap_move_something(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
{
cameraOffset->xTileOffset += b;
cameraOffset->xTileOffset %= 32;
cameraOffset->yTileOffset += c;
cameraOffset->yTileOffset %= 32;
}
static void coords8_add(struct FieldCameraOffset *cameraOffset, u32 b, u32 c)
{
cameraOffset->xPixelOffset += b;
cameraOffset->yPixelOffset += c;
}
void move_tilemap_camera_to_upper_left_corner(void)
{
move_tilemap_camera_to_upper_left_corner_(&sFieldCameraOffset);
}
void FieldUpdateBgTilemapScroll(void)
{
u32 r4, r5;
r5 = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
r4 = sVerticalCameraPan + sFieldCameraOffset.yPixelOffset + 8;
SetGpuReg(REG_OFFSET_BG1HOFS, r5);
SetGpuReg(REG_OFFSET_BG1VOFS, r4);
SetGpuReg(REG_OFFSET_BG2HOFS, r5);
SetGpuReg(REG_OFFSET_BG2VOFS, r4);
SetGpuReg(REG_OFFSET_BG3HOFS, r5);
SetGpuReg(REG_OFFSET_BG3VOFS, r4);
}
void sub_805A658(s16 *a, s16 *b)
{
*a = sFieldCameraOffset.xPixelOffset + sHorizontalCameraPan;
*b = sFieldCameraOffset.yPixelOffset + sVerticalCameraPan + 8;
}
void DrawWholeMapView(void)
{
DrawWholeMapViewInternal(gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y, gMapHeader.mapLayout);
// sFieldCameraOffset.copyBGToVRAM = TRUE;
}
static void DrawWholeMapViewInternal(int x, int y, const struct MapLayout *mapLayout)
{
u8 i;
u8 j;
u32 r6;
u8 temp;
for (i = 0; i < 32; i += 2)
{
temp = sFieldCameraOffset.yTileOffset + i;
if (temp >= 32)
temp -= 32;
r6 = temp * 32;
for (j = 0; j < 32; j += 2)
{
temp = sFieldCameraOffset.xTileOffset + j;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, r6 + temp, x + j / 2, y + i / 2);
}
}
}
static void RedrawMapSlicesForCameraUpdate(struct FieldCameraOffset *cameraOffset, int x, int y)
{
const struct MapLayout *mapLayout = gMapHeader.mapLayout;
if (x > 0)
RedrawMapSliceWest(cameraOffset, mapLayout);
if (x < 0)
RedrawMapSliceEast(cameraOffset, mapLayout);
if (y > 0)
RedrawMapSliceNorth(cameraOffset, mapLayout);
if (y < 0)
RedrawMapSliceSouth(cameraOffset, mapLayout);
cameraOffset->copyBGToVRAM = TRUE;
}
static void RedrawMapSliceNorth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
u32 r7;
temp = cameraOffset->yTileOffset + 28;
if (temp >= 32)
temp -= 32;
r7 = temp * 32;
for (i = 0; i < 32; i += 2)
{
temp = cameraOffset->xTileOffset + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y + 14);
}
}
static void RedrawMapSliceSouth(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
u32 r7 = cameraOffset->yTileOffset * 32;
for (i = 0; i < 32; i += 2)
{
temp = cameraOffset->xTileOffset + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, r7 + temp, gSaveBlock1Ptr->pos.x + i / 2, gSaveBlock1Ptr->pos.y);
}
}
static void RedrawMapSliceEast(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
u32 r6 = cameraOffset->xTileOffset;
for (i = 0; i < 32; i += 2)
{
temp = cameraOffset->yTileOffset + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, temp * 32 + r6, gSaveBlock1Ptr->pos.x, gSaveBlock1Ptr->pos.y + i / 2);
}
}
static void RedrawMapSliceWest(struct FieldCameraOffset *cameraOffset, const struct MapLayout *mapLayout)
{
u8 i;
u8 temp;
u8 r5 = cameraOffset->xTileOffset + 28;
if (r5 >= 32)
r5 -= 32;
for (i = 0; i < 32; i += 2)
{
temp = cameraOffset->yTileOffset + i;
if (temp >= 32)
temp -= 32;
DrawMetatileAt(mapLayout, temp * 32 + r5, gSaveBlock1Ptr->pos.x + 14, gSaveBlock1Ptr->pos.y + i / 2);
}
}
void CurrentMapDrawMetatileAt(int x, int y)
{
int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
if (offset >= 0)
{
DrawMetatileAt(gMapHeader.mapLayout, offset, x, y);
// sFieldCameraOffset.copyBGToVRAM = TRUE;
}
}
void DrawDoorMetatileAt(int x, int y, const u16 *arr)
{
int offset = MapPosToBgTilemapOffset(&sFieldCameraOffset, x, y);
if (offset >= 0)
{
DrawMetatile(1, arr, offset);
// sFieldCameraOffset.copyBGToVRAM = TRUE;
}
}
static void DrawMetatileAt(const struct MapLayout *mapLayout, u16 offset, int x, int y)
{
u16 metatileId = MapGridGetMetatileIdAt(x, y);
u16 *metatiles;
if (metatileId > NUM_METATILES_TOTAL)
metatileId = 0;
if (metatileId < NUM_METATILES_IN_PRIMARY)
metatiles = mapLayout->primaryTileset->metatiles;
else
{
metatiles = mapLayout->secondaryTileset->metatiles;
metatileId -= NUM_METATILES_IN_PRIMARY;
}
DrawMetatile(MapGridGetMetatileLayerTypeAt(x, y), metatiles + metatileId * 8, offset);
}
static void DrawMetatile(s32 metatileLayerType, const u16 *metatiles, u16 offset)
{
switch (metatileLayerType)
{
case 2: // LAYER_TYPE_
// Draw metatile's bottom layer to the bottom background layer.
gBGTilemapBuffers3[offset] = metatiles[0];
gBGTilemapBuffers3[offset + 1] = metatiles[1];
gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
// Draw transparent tiles to the middle background layer.
gBGTilemapBuffers1[offset] = 0;
gBGTilemapBuffers1[offset + 1] = 0;
gBGTilemapBuffers1[offset + 0x20] = 0;
gBGTilemapBuffers1[offset + 0x21] = 0;
// Draw metatile's top layer to the top background layer.
gBGTilemapBuffers2[offset] = metatiles[4];
gBGTilemapBuffers2[offset + 1] = metatiles[5];
gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
break;
case 1: // LAYER_TYPE_COVERED_BY_OBJECTS
// Draw metatile's bottom layer to the bottom background layer.
gBGTilemapBuffers3[offset] = metatiles[0];
gBGTilemapBuffers3[offset + 1] = metatiles[1];
gBGTilemapBuffers3[offset + 0x20] = metatiles[2];
gBGTilemapBuffers3[offset + 0x21] = metatiles[3];
// Draw metatile's top layer to the middle background layer.
gBGTilemapBuffers1[offset] = metatiles[4];
gBGTilemapBuffers1[offset + 1] = metatiles[5];
gBGTilemapBuffers1[offset + 0x20] = metatiles[6];
gBGTilemapBuffers1[offset + 0x21] = metatiles[7];
// Draw transparent tiles to the top background layer.
gBGTilemapBuffers2[offset] = 0;
gBGTilemapBuffers2[offset + 1] = 0;
gBGTilemapBuffers2[offset + 0x20] = 0;
gBGTilemapBuffers2[offset + 0x21] = 0;
break;
case 0: // LAYER_TYPE_NORMAL
// Draw garbage to the bottom background layer.
gBGTilemapBuffers3[offset] = 0x3014;
gBGTilemapBuffers3[offset + 1] = 0x3014;
gBGTilemapBuffers3[offset + 0x20] = 0x3014;
gBGTilemapBuffers3[offset + 0x21] = 0x3014;
// Draw metatile's bottom layer to the middle background layer.
gBGTilemapBuffers1[offset] = metatiles[0];
gBGTilemapBuffers1[offset + 1] = metatiles[1];
gBGTilemapBuffers1[offset + 0x20] = metatiles[2];
gBGTilemapBuffers1[offset + 0x21] = metatiles[3];
// Draw metatile's top layer to the top background layer, which covers object event sprites.
gBGTilemapBuffers2[offset] = metatiles[4];
gBGTilemapBuffers2[offset + 1] = metatiles[5];
gBGTilemapBuffers2[offset + 0x20] = metatiles[6];
gBGTilemapBuffers2[offset + 0x21] = metatiles[7];
break;
}
ScheduleBgCopyTilemapToVram(1);
ScheduleBgCopyTilemapToVram(2);
ScheduleBgCopyTilemapToVram(3);
}
static s32 MapPosToBgTilemapOffset(struct FieldCameraOffset *cameraOffset, s32 x, s32 y)
{
x -= gSaveBlock1Ptr->pos.x;
x *= 2;
if (x >= 32 || x < 0)
return -1;
x = x + cameraOffset->xTileOffset;
if (x >= 32)
x -= 32;
y = (y - gSaveBlock1Ptr->pos.y) * 2;
if (y >= 32 || y < 0)
return -1;
y = y + cameraOffset->yTileOffset;
if (y >= 32)
y -= 32;
return y * 32 + x;
}
static void CameraUpdateCallback(struct CameraObject *fieldCamera)
{
if (fieldCamera->spriteId != 0)
{
fieldCamera->movementSpeedX = gSprites[fieldCamera->spriteId].data[2];
fieldCamera->movementSpeedY = gSprites[fieldCamera->spriteId].data[3];
}
}
void ResetCameraUpdateInfo(void)
{
gFieldCamera.movementSpeedX = 0;
gFieldCamera.movementSpeedY = 0;
gFieldCamera.x = 0;
gFieldCamera.y = 0;
gFieldCamera.spriteId = 0;
gFieldCamera.callback = NULL;
}
u32 InitCameraUpdateCallback(u8 trackedSpriteId)
{
if (gFieldCamera.spriteId != 0)
DestroySprite(&gSprites[gFieldCamera.spriteId]);
gFieldCamera.spriteId = AddCameraObject(trackedSpriteId);
gFieldCamera.callback = CameraUpdateCallback;
return 0;
}
void CameraUpdate(void)
{
int deltaX;
int deltaY;
int curMovementOffsetY;
int curMovementOffsetX;
int movementSpeedX;
int movementSpeedY;
if (gFieldCamera.callback != NULL)
gFieldCamera.callback(&gFieldCamera);
movementSpeedX = gFieldCamera.movementSpeedX;
movementSpeedY = gFieldCamera.movementSpeedY;
deltaX = 0;
deltaY = 0;
curMovementOffsetX = gFieldCamera.x;
curMovementOffsetY = gFieldCamera.y;
if (curMovementOffsetX == 0 && movementSpeedX != 0)
{
if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
if (curMovementOffsetY == 0 && movementSpeedY != 0)
{
if (movementSpeedY > 0)
deltaY = 1;
else
deltaY = -1;
}
if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)
{
if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)
{
if (movementSpeedY > 0)
deltaX = 1;
else
deltaX = -1;
}
gFieldCamera.x += movementSpeedX;
gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);
gFieldCamera.y += movementSpeedY;
gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);
if (deltaX != 0 || deltaY != 0)
{
CameraMove(deltaX, deltaY);
UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
// RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
// ResetBerryTreeSparkleFlags();
tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
}
coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);
gTotalCameraPixelOffsetX -= movementSpeedX;
gTotalCameraPixelOffsetY -= movementSpeedY;
}
void MoveCameraAndRedrawMap(int deltaX, int deltaY) //unused
{
CameraMove(deltaX, deltaY);
UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
DrawWholeMapView();
gTotalCameraPixelOffsetX -= deltaX * 16;
gTotalCameraPixelOffsetY -= deltaY * 16;
}
void sub_805ACF0(void)
{
int deltaX;
int deltaY;
int curMovementOffsetY;
int curMovementOffsetX;
int movementSpeedX;
int movementSpeedY;
if (gFieldCamera.callback != NULL)
gFieldCamera.callback(&gFieldCamera);
movementSpeedX = gFieldCamera.movementSpeedX;
movementSpeedY = gFieldCamera.movementSpeedY;
deltaX = 0;
deltaY = 0;
curMovementOffsetX = gFieldCamera.x;
curMovementOffsetY = gFieldCamera.y;
if (curMovementOffsetX == 0 && movementSpeedX != 0)
{
if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
if (curMovementOffsetY == 0 && movementSpeedY != 0)
{
if (movementSpeedY > 0)
deltaY = 1;
else
deltaY = -1;
}
if (curMovementOffsetX != 0 && curMovementOffsetX == -movementSpeedX)
{
if (movementSpeedX > 0)
deltaX = 1;
else
deltaX = -1;
}
if (curMovementOffsetY != 0 && curMovementOffsetY == -movementSpeedY)
{
if (movementSpeedY > 0)
deltaX = 1;
else
deltaX = -1;
}
gFieldCamera.x += movementSpeedX;
gFieldCamera.x = gFieldCamera.x - 16 * (gFieldCamera.x / 16);
gFieldCamera.y += movementSpeedY;
gFieldCamera.y = gFieldCamera.y - 16 * (gFieldCamera.y / 16);
if (deltaX != 0 || deltaY != 0)
{
CameraMove(deltaX, deltaY);
// UpdateObjectEventsForCameraUpdate(deltaX, deltaY);
// RotatingGatePuzzleCameraUpdate(deltaX, deltaY);
// ResetBerryTreeSparkleFlags();
tilemap_move_something(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
RedrawMapSlicesForCameraUpdate(&sFieldCameraOffset, deltaX * 2, deltaY * 2);
}
coords8_add(&sFieldCameraOffset, movementSpeedX, movementSpeedY);
// gTotalCameraPixelOffsetX -= movementSpeedX;
// gTotalCameraPixelOffsetY -= movementSpeedY;
}
void SetCameraPanningCallback(void (*a)(void))
{
sFieldCameraPanningCallback = a;
}
void SetCameraPanning(s16 a, s16 b)
{
sHorizontalCameraPan = a;
sVerticalCameraPan = b + 32;
}
void InstallCameraPanAheadCallback(void)
{
sFieldCameraPanningCallback = CameraPanningCB_PanAhead;
gUnknown_3000E9C = 0;
sHorizontalCameraPan = 0;
sVerticalCameraPan = 32;
}
void UpdateCameraPanning(void)
{
if (sFieldCameraPanningCallback != NULL)
sFieldCameraPanningCallback();
//Update sprite offset of overworld objects
gSpriteCoordOffsetX = gTotalCameraPixelOffsetX - sHorizontalCameraPan;
gSpriteCoordOffsetY = gTotalCameraPixelOffsetY - sVerticalCameraPan - 8;
}
static void CameraPanningCB_PanAhead(void)
{
u8 var;
if (gUnusedBikeCameraAheadPanback == FALSE)
{
InstallCameraPanAheadCallback();
}
else
{
// this code is never reached.
if (gPlayerAvatar.tileTransitionState == 1)
{
gUnknown_3000E9C ^= 1;
if (gUnknown_3000E9C == 0)
return;
}
else
{
gUnknown_3000E9C = 0;
}
var = player_get_direction_upper_nybble();
if (var == 2)
{
if (sVerticalCameraPan > -8)
sVerticalCameraPan -= 2;
}
else if (var == 1)
{
if (sVerticalCameraPan < 72)
sVerticalCameraPan += 2;
}
else if (sVerticalCameraPan < 32)
{
sVerticalCameraPan += 2;
}
else if (sVerticalCameraPan > 32)
{
sVerticalCameraPan -= 2;
}
}
}
+3 -15
View File
@@ -37,22 +37,10 @@ gUnknown_3000E88: @ 3000E88
gUnknown_3000E89: @ 3000E89
.space 0x7
gUnknown_3000E90: @ 3000E90
.space 0x8
.align 3
.include "src/field_camera.o"
gUnknown_3000E98: @ 3000E98
.space 0x2
gUnknown_3000E9A: @ 3000E9A
.space 0x2
gUnknown_3000E9C: @ 3000E9C
.space 0x4
gUnknown_3000EA0: @ 3000EA0
.space 0x8
.align 2
.align 3
.include "src/script.o"
.align 2
.include "src/start_menu.o"
+4 -11
View File
@@ -20,13 +20,13 @@
.include "load_save.o"
.align 2
gUnknown_3005014: @ 3005014
gBGTilemapBuffers1: @ 3005014
.space 0x4
gUnknown_3005018: @ 3005018
gBGTilemapBuffers2: @ 3005018
.space 0x4
gUnknown_300501C: @ 300501C
gBGTilemapBuffers3: @ 300501C
.space 0x4
gFieldCallback: @ 3005020
@@ -48,14 +48,7 @@ gFieldLinkPlayerCount: @ 3005030
.include "fieldmap.o"
.align 4
gUnknown_3005050: @ 3005050
.space 0x18
gTotalCameraPixelOffsetY: @ 3005068
.space 0x4
gTotalCameraPixelOffsetX: @ 300506C
.space 0x4
.include "field_camera.o"
.align 2
.include "scrcmd.o"
+1 -4
View File
@@ -76,11 +76,8 @@ gUnknown_2031DEC: @ 2031DEC
.align 2
.include "src/fieldmap.o"
.align 2
@ .include "src/field_camera.o"
gUnknown_2036E2C: @ 2036E2C
.space 0x4
.include "src/field_camera.o"
.align 2
@ .include "src/field_player_avatar.o"