Port field_camera from Emerald
This commit is contained in:
+2
-2
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+20
-20
@@ -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
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
gFieldCamera
|
||||
gTotalCameraPixelOffsetY
|
||||
gTotalCameraPixelOffsetX
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user