#ifndef BG_H
#define BG_H

#include "global.h"

typedef struct {
    u16 displayControl;
    u8 filler2[0x2];
    u16 unk4;
    u16 unk6;
} LcdControls;

typedef struct {
    u16 bg0Control;
    u16 bg0xOffset;
    u16 bg0yOffset;
    u16 bg0Updated;
    void* bg0Tilemap;
    u16 bg1Control;
    u16 bg1xOffset;
    u16 bg1yOffset;
    u16 bg1Updated;
    void* bg1Tilemap;
} BgSettings;

typedef struct {
    u16 bg2Control;
    u16 bg2xOffset;
    u16 bg2yOffset;
    u16 bg2Updated;
    void* bg2Tilemap;
    u16 bg3Control;
    s16 bg3xOffset;
    s16 bg3yOffset;
    u16 bg3Updated;
    void* bg3Tilemap;
} BgAffSettings;

typedef struct {
    u16 bg2dx;
    u16 bg2dmx;
    u16 bg2dy;
    u16 bg2dmy;
    u16 bg2xPointLeastSig;
    u16 bg2xPointMostSig;
    u16 bg2yPointLeastSig;
    u16 bg2yPointMostSig;
    u16 bg3dx;
    u16 bg3dmx;
    u16 bg3dy;
    u16 bg3dmy;
    u16 bg3xPointLeastSig;
    u16 bg3xPointMostSig;
    u16 bg3yPointLeastSig;
    u16 bg3yPointMostSig;
    u16 window0HorizontalDimensions;
    u16 window1HorizontalDimensions;
    u16 window0VerticalDimensions;
    u16 window1VerticalDimensions;
    u16 windowInsideControl;
    u16 windowOutsideControl;
    u16 mosaicSize;
    u16 layerFXControl;
    u16 alphaBlend;
    u16 layerBrightness;
} BgControls;

typedef struct {
    /*0x00*/ LcdControls lcd;
    /*0x08*/ BgSettings bg;
    /*0x20*/ BgAffSettings affine;
    /*0x38*/ BgControls controls;
    /*0x6c*/ u8 _6c;
    /*0x6d*/ u8 _6d;
    /*0x70*/ u32 _70;
    /*0x74*/ u32 _74;
    /*0x78*/ u32 _78;
} Screen;

struct OAMCommand {
    u16 x;
    u16 y;
    u16 _4;
    u16 _6;
    u16 _8;
} extern gOamCmd;

extern BgControls gBgControls;
extern Screen gScreen;

#endif
