Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion include/bmdifficulty.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ extern struct Text gUnknown_02003B48[8];

extern struct ProcCmd CONST_DATA sProcScr_DisplayDungeonRecord_FromMenu[];
extern struct ProcCmd CONST_DATA sProcScr_DisplayDungeonRecord_AfterDungeonClear[];
extern const u16 CONST_DATA obj_859E79C[];
extern const struct SpriteCfg CONST_DATA obj_859E79C;
extern u16 CONST_DATA gUnknown_0859E7C8[];
extern int CONST_DATA gUnknown_0859E7D4[];
extern struct ProcCmd CONST_DATA sProcScr_DungeonRecord_UpdateNewRecordValues[];
Expand Down
43 changes: 22 additions & 21 deletions include/ctc.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include "global.h"
#include "gba_sprites.h"
#include "types.h"

struct OAM_Attr0 {
u16 Y : 8;
Expand Down Expand Up @@ -61,30 +62,30 @@ struct oam2_data {
u16 pal : 0x4;
};

extern u16 CONST_DATA gObject_8x8[];
extern u16 CONST_DATA gObject_16x16[];
extern u16 CONST_DATA gObject_32x32[];
extern u16 CONST_DATA gObject_64x64[]; // Unused
extern u16 CONST_DATA gObject_8x16[];
extern u16 CONST_DATA gObject_16x32[];
extern u16 CONST_DATA gObject_32x64[]; // Unused
extern u16 CONST_DATA gObject_16x8[];
extern u16 CONST_DATA gObject_16x8_VFlipped[]; // Unused
extern u16 CONST_DATA gObject_32x16[];
extern u16 CONST_DATA gObject_64x32[];
extern u16 CONST_DATA gObject_32x8[];
extern u16 CONST_DATA gObject_8x32[];
extern u16 CONST_DATA gObject_32x8_VFlipped[]; // Unused
extern u16 CONST_DATA gObject_8x16_HFlipped[];
extern u16 CONST_DATA gObject_8x8_HFlipped[];
extern u16 CONST_DATA gObject_8x8_VFlipped[]; // Unused
extern u16 CONST_DATA gObject_8x8_HFlipped_VFlipped[]; // Unused
extern u16 CONST_DATA gObject_16x16_VFlipped[];
extern struct SpriteCfg CONST_DATA gObject_8x8;
extern struct SpriteCfg CONST_DATA gObject_16x16;
extern struct SpriteCfg CONST_DATA gObject_32x32;
extern struct SpriteCfg CONST_DATA gObject_64x64; // Unused
extern struct SpriteCfg CONST_DATA gObject_8x16;
extern struct SpriteCfg CONST_DATA gObject_16x32;
extern struct SpriteCfg CONST_DATA gObject_32x64; // Unused
extern struct SpriteCfg CONST_DATA gObject_16x8;
extern struct SpriteCfg CONST_DATA gObject_16x8_VFlipped; // Unused
extern struct SpriteCfg CONST_DATA gObject_32x16;
extern struct SpriteCfg CONST_DATA gObject_64x32;
extern struct SpriteCfg CONST_DATA gObject_32x8;
extern struct SpriteCfg CONST_DATA gObject_8x32;
extern struct SpriteCfg CONST_DATA gObject_32x8_VFlipped; // Unused
extern struct SpriteCfg CONST_DATA gObject_8x16_HFlipped;
extern struct SpriteCfg CONST_DATA gObject_8x8_HFlipped;
extern struct SpriteCfg CONST_DATA gObject_8x8_VFlipped; // Unused
extern struct SpriteCfg CONST_DATA gObject_8x8_HFlipped_VFlipped; // Unused
extern struct SpriteCfg CONST_DATA gObject_16x16_VFlipped;

void PutObjectAffine(int id, int pa, int pb, int pc, int pd);
void ClearSprites(void);
void PutSprite(int layer, int x, int y, const u16* object, int oam2);
void PutSpriteExt(int layer, int xOam1, int yOam0, const u16* object, int oam2);
void PutSprite(int layer, int x, int y, const struct SpriteCfg *cfg, int oam2);
void PutSpriteExt(int layer, int xOam1, int yOam0, const struct SpriteCfg *cfg, int oam2);
void PushSpriteLayerObjects(int layer);

struct SpriteProc * StartSpriteRefresher(ProcPtr parent, int layer, int x, int y, const u16* object, int tileref);
Expand Down
4 changes: 2 additions & 2 deletions include/functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ u8 FormatTime(u32 frameTotal, u16 * hours, u16 * minutes, u16 * seconds);
void StoreRoutinesToIRAM();
void DrawGlyphRam();
void CallARM_DecompText(const char *, char *);
void CallARM_PushToSecondaryOAM(int a, int b, const u16 *c, int d);
void CallARM_PushToPrimaryOAM(int x, int y, const u16* data, int oam2base);
void CallARM_PushToSecondaryOAM(int x, int y, const struct SpriteCfg *data, int oam2base);
void CallARM_PushToPrimaryOAM(int x, int y, const struct SpriteCfg *data, int oam2base);
// ??? CallARM_Func5(???);
void CallARM_FillMovementMap(void);
// ??? ResetIconGraphics_(???);
Expand Down
22 changes: 21 additions & 1 deletion include/gba/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,14 @@ struct OamData
/*0x04*/ u16 tileNum:10;
u16 priority:2;
u16 paletteNum:4;
/*0x06*/ u16 affineParam;
// This is mentioned in GBATek but all actual instances of this struct seem
// to be six bytes only.
///*0x06*/ u16 affineParam;
};

// We could use the enums from `gba_sprites.h` here, but I think using enums
// in bitfields is compiler-dependent.

#define ST_OAM_OBJ_NORMAL 0
#define ST_OAM_OBJ_BLEND 1
#define ST_OAM_OBJ_WINDOW 2
Expand All @@ -74,6 +79,21 @@ struct OamData
#define ST_OAM_H_RECTANGLE 1
#define ST_OAM_V_RECTANGLE 2

#define ST_OAM_SQ_8x8 0
#define ST_OAM_SQ_16x16 1
#define ST_OAM_SQ_32x32 2
#define ST_OAM_SQ_64x64 3

#define ST_OAM_H_16x8 0
#define ST_OAM_H_32x8 1
#define ST_OAM_H_32x16 2
#define ST_OAM_H_64x32 3

#define ST_OAM_V_8x16 0
#define ST_OAM_V_8x32 1
#define ST_OAM_V_16x32 2
#define ST_OAM_V_32x64 3

struct BgAffineSrcData
{
s32 texX;
Expand Down
8 changes: 8 additions & 0 deletions include/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -445,4 +445,12 @@ struct gfx_set {
void * pal;
};

struct SpriteCfg
{
u16 count;
// In a modern C compiler, we would declare this as `oam[]`, a so-called
// "flexible array member". This array should have size `count`.
struct OamData oam[0];
} __attribute__((packed));

#endif // GUARD_TYPES_H
4 changes: 3 additions & 1 deletion src/ap.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ void AP_Display(struct APHandle* handle, int x, int y) {
PutSpriteExt(
handle->objLayer,
x | rotScaleMask, y,
handle->pCurrentObjData,
// CR-someday cam: adjust these structs to hold `SpriteCfg`s instead of
// `u16 *`s
(struct SpriteCfg *)handle->pCurrentObjData,
handle->tileBase
);

Expand Down
2 changes: 1 addition & 1 deletion src/bb.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void PutSubtitleHelpText(struct SubtitleHelpProc * proc, int y)
int x = (i * 32) - 32 + proc->textOffset;
int index = (proc->textNum + i) % proc->textCount;

PutSprite(2, x, y, gObject_32x16, 0x4240 + lut[index]);
PutSprite(2, x, y, &gObject_32x16, 0x4240 + lut[index]);
}

return;
Expand Down
4 changes: 2 additions & 2 deletions src/bksel.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,11 +457,11 @@ void PutBattleForecastMultipliers(struct BattleForecastProc * proc)
y += proc->y * 8;

if (proc->hitCountA > 1) {
PutSprite(4, x + 72, y + 40, gObject_16x16, proc->hitCountA + 0x22E6);
PutSprite(4, x + 72, y + 40, &gObject_16x16, proc->hitCountA + 0x22E6);
}

if (proc->hitCountB > 1) {
PutSprite(4, x + 24, y + 40, gObject_16x16, proc->hitCountB + 0x22E6);
PutSprite(4, x + 24, y + 40, &gObject_16x16, proc->hitCountB + 0x22E6);
}
}

Expand Down
Loading