ReC98/th03/main/sprite16.hpp

88 lines
2.3 KiB
C++

#include "th03/main/playfld.hpp"
#include "th03/hardware/vram.hpp"
// Relative offset inside the SPRITE16 sprite area, with 0 corresponding to
// SPRITE16_OFFSET.
typedef uvram_byte_amount_t sprite16_offset_t;
extern struct {
vram_h_t h;
VRAMWord w;
void set(pixel_t w_, pixel_t h_) {
w = w_;
h = (h_ / 2);
}
} sprite16_put_size;
extern struct {
screen_x_t left;
screen_x_t right;
void reset(void) {
left = PLAYFIELD1_CLIP_LEFT;
right = PLAYFIELD2_CLIP_RIGHT;
}
// Additional variants for static constants
void set_for_pid_0(void) {
left = PLAYFIELD1_CLIP_LEFT;
right = PLAYFIELD1_CLIP_RIGHT;
}
void set_for_pid_1(void) {
left = PLAYFIELD2_CLIP_LEFT;
right = PLAYFIELD2_CLIP_RIGHT;
}
} sprite16_clip;
#define sprite16_clip_set_for_pid(pid) { \
if(pid == 0) { \
sprite16_clip.set_for_pid_0(); \
} else { \
sprite16_clip.set_for_pid_1(); \
} \
}
enum sprite16_put_func_t {
SPF_NORMAL = 0,
// Repeatedly draws the sprite to form a gapless column, starting from the
// top Y coordinate given to sprite16_putx() down to the bottom of VRAM.
SPF_DOWNWARDS_COLUMN = 24,
_sprite16_put_func_t_FORCE_UINT16 = 0xFFFF
};
extern "C" {
// Copies the entire sprite area in VRAM from page [dst_page ^ 1] to
// [dst_page]. Returns true if successful, false if the temporary memory
// couldn't be allocated.
bool16 pascal sprite16_sprites_copy_page(int dst_page);
// Initializes SPRITE16 for double-buffered blitting of the sprites that have
// been blitted to the sprite area on VRAM page 0.
void pascal sprite16_sprites_commit(void);
// Draws the sprite with the given offset in the SPRITE16 sprite area at the
// given (left, top) position in screen (not VRAM) coordinates. The left and
// right parts of the sprite are clipped in 16-pixel increments to stay within
// the left and right clipping points, so make sure to hide at least 16 more
// pixels right of `sprite16_clip_left` and left of `sprite16_clip_right` on
// purpose.
void pascal sprite16_put(screen_x_t left, screen_y_t top, sprite16_offset_t so);
// Like sprite16_put(), but using an optional drawing function.
void pascal sprite16_putx(
screen_x_t left,
screen_y_t top,
sprite16_offset_t so,
sprite16_put_func_t func
);
// Like sprite16_put(), but ignores the clipping points.
void pascal sprite16_put_noclip(
screen_x_t left, screen_y_t top, sprite16_offset_t so
);
}