Improve R5 background, add water waves

This commit is contained in:
Lucas S. Vieira 2024-12-18 15:49:42 -03:00
parent 4b386f2127
commit bc659e5a38
9 changed files with 131 additions and 54 deletions

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 139 KiB

Before After
Before After

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

Before After
Before After

View file

@ -10,7 +10,7 @@
36,0,0,0,0,0,2,4,45,50,46,2,4,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,8,44,14,14,14,14,51,49,2,2,2,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
36,20,0,8,0,8,10,13,13,13,13,13,10,16,22,8,0,24,27,26,0,0,0,0,0,0,0,0,3,4,2,2,2,2,4,40,2,2,4,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
34,19,17,37,3,3,3,3,13,13,12,3,3,2,23,3,3,28,25,3,6,0,0,0,0,0,0,0,30,31,31,47,32,32,33,0,10,0,10,0,20,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,4,13,13,51,51,51,13,13,2,2,2,2,2,5,17,21,53,21,22,9,0,29,13,13,13,2,4,2,35,37,35,37,35,19,27,27,27,3,0,0,0,0,15,0,0,0,0,2,2,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,4,13,55,51,51,51,13,13,2,2,2,2,2,5,17,21,53,21,22,9,0,29,13,13,13,2,4,2,35,37,35,37,35,19,27,27,27,3,0,0,0,0,15,0,0,0,0,2,2,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
4,2,2,2,2,2,2,2,37,37,4,2,2,11,14,51,38,0,0,0,2,2,2,2,2,23,3,3,19,54,54,3,5,2,4,36,38,0,38,48,44,13,13,13,10,20,0,0,0,33,0,0,0,53,51,14,13,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,37,6,8,0,0,0,0,0,0,0,0,0,0,0,53,5,2,2,2,19,3,3,3,3,43,11,39,12,3,19,3,52,3,2,52,52,3,2,2,2,3,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,37,3,37,37,3,3,37,37,3,3,2,2,2,2,2,2,2,2,2,2,2,2,40,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

View file

@ -118,4 +118,25 @@ v0 = 256
scrollx = 0.3
speedx = 0
y0 = 274
single = false
single = false
[water_stream1]
width = 256
height = 130
u0 = 0
v0 = 110
scrollx = 0
speedx = 0.8
y0 = 180
single = false
[water_stream2]
width = 256
height = 130
u0 = 0
v0 = 110
scrollx = 0
speedx = 0.8
y0 = 310
single = false

View file

@ -107,14 +107,14 @@
18,35,35,19,0,0,157,158,126,127,126,160,160,160,160,127,22,143,143,23,22,23,157,158,22,23,157,158,20,21,157,158,
6,7,6,7,0,0,157,158,110,159,159,111,110,111,110,111,6,7,6,7,4,5,157,158,4,5,157,158,6,7,157,158,
22,23,22,23,0,0,22,23,126,160,160,127,126,127,126,127,22,23,22,23,20,21,22,23,20,21,22,23,22,23,22,23,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,2,3,110,111,110,111,110,111,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,157,158,173,174,126,127,126,127,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,17,17,3,0,0,157,158,173,174,110,111,110,111,173,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
18,35,35,19,18,19,157,158,126,127,126,127,126,127,126,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6,7,6,7,4,5,157,158,110,111,110,159,159,159,159,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
22,23,22,23,20,21,22,23,126,127,126,160,160,160,160,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,110,159,159,111,110,111,110,111,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,160,160,127,126,127,173,174,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,2,3,110,111,110,111,110,111,173,174,110,111,110,111,110,111,173,174,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,157,158,173,174,126,127,126,127,173,174,173,174,126,127,173,174,126,127,0,0,0,0,0,0,0,0,
2,17,17,3,0,0,157,158,173,174,110,111,110,111,173,174,173,174,110,111,173,174,110,188,0,0,0,0,0,0,0,0,
18,35,35,19,18,19,157,158,126,127,126,127,126,127,126,127,126,127,126,127,126,127,203,27,0,0,0,0,0,0,0,0,
6,7,6,7,4,5,157,158,110,111,110,159,159,159,159,111,110,159,159,111,110,188,6,7,0,0,0,0,0,0,0,0,
22,23,22,23,20,21,22,23,126,127,126,160,160,160,160,127,126,160,160,127,203,27,22,23,0,0,0,0,0,0,0,0
</data>
</layer>
<layer id="4" name="oneway" width="32" height="112" opacity="0.4">

View file

@ -283,6 +283,105 @@ screen_level_update(void *d)
}
}
void
_screen_level_draw_water(screen_level_data *)
{
if(level_water_y >= 0) {
int32_t camera_bottom = camera.pos.vy + (CENTERY << 12);
if(camera_bottom > level_water_y) {
int32_t water_vh = camera_bottom - level_water_y;
uint16_t water_rh = water_vh >> 12;
uint16_t water_h = MIN(water_rh, SCREEN_YRES);
int16_t water_y = MAX(0, SCREEN_YRES - water_h);
int16_t water_ry = SCREEN_YRES - water_rh;
// Draw water overlay
{
POLY_G4 *poly = get_next_prim();
increment_prim(sizeof(POLY_G4));
setPolyG4(poly);
setXYWH(poly, 0, water_y, SCREEN_XRES, water_h);
setSemiTrans(poly, 1);
setRGB0(poly,
LERPC(level_fade, 31),
LERPC(level_fade, 36),
LERPC(level_fade, 121));
setRGB1(poly,
LERPC(level_fade, 31),
LERPC(level_fade, 36),
LERPC(level_fade, 121));
setRGB2(poly,
LERPC(level_fade, 25),
LERPC(level_fade, 12),
LERPC(level_fade, 64));
setRGB3(poly,
LERPC(level_fade, 25),
LERPC(level_fade, 12),
LERPC(level_fade, 64));
/* POLY_F4 *poly = get_next_prim(); */
/* increment_prim(sizeof(POLY_F4)); */
/* setPolyF4(poly); */
/* setXYWH(poly, 0, water_y, SCREEN_XRES, water_h); */
/* setSemiTrans(poly, 1); */
/* setRGB0(poly, */
/* LERPC(level_fade, 31), */
/* LERPC(level_fade, 36), */
/* LERPC(level_fade, 121)); */
sort_prim(poly, OTZ_LAYER_LEVEL_FG_FRONT);
}
// Draw water waves
{
static uint8_t wave_dir = 0;
static uint8_t wave_visible = 1;
uint32_t frame = get_global_frames();
if(!(frame % 6)) wave_dir = !wave_dir;
if(!(frame % 3)) wave_visible = !wave_visible;
// Water wave sprites is within common objects texture.
// uv0 = (146, 183); wh=(64, 9)
// Sprite plays for 20 frames and then flips direction
for(uint16_t i = 0; i < 6; i++) {
uint16_t x = i * 64;
uint8_t current_visible = (i + wave_visible) % 2;
POLY_FT4 *poly = get_next_prim();
increment_prim(sizeof(POLY_FT4));
setPolyFT4(poly);
setRGB0(poly, level_fade, level_fade, level_fade);
// There is some sort of trickery here.
// Rendering the waves actually influence on
// water color. We render the waves as a fully
// transparent pixel when invisible so
// the body of water doesn't blink
if(!current_visible)
setUVWH(poly, 0, 0, 0, 0);
else if(wave_dir)
setUVWH(poly, 146, 183, 64, 9);
else setUV4(poly,
146 + 63, 183,
146, 183,
146 + 63, 183 + 9,
146, 183 + 9);
setXYWH(poly, x, water_ry - 6, 64, 9);
// tpage and clut same as common objects
poly->tpage = getTPage(1, 0, 576, 0);
poly->clut = getClut(0, 481);
setSemiTrans(poly, 1);
sort_prim(poly, OTZ_LAYER_LEVEL_FG_FRONT);
}
}
}
}
}
void
screen_level_draw(void *d)
{
@ -293,50 +392,7 @@ screen_level_draw(void *d)
// When things are drawn on the same otz, anything drawn first
// is shown on front, as the ordering table is drawn backwards.
// Draw water
if(level_water_y >= 0) {
int32_t camera_bottom = camera.pos.vy + (CENTERY << 12);
if(camera_bottom > level_water_y) {
int32_t water_vh = camera_bottom - level_water_y;
uint16_t water_h = MIN(water_vh >> 12, SCREEN_YRES);
uint16_t water_y = MAX(0, SCREEN_YRES - water_h);
POLY_G4 *poly = get_next_prim();
increment_prim(sizeof(POLY_G4));
setPolyG4(poly);
setXYWH(poly, 0, water_y, SCREEN_XRES, water_h);
setSemiTrans(poly, 1);
setRGB0(poly,
LERPC(level_fade, 31),
LERPC(level_fade, 36),
LERPC(level_fade, 121));
setRGB1(poly,
LERPC(level_fade, 31),
LERPC(level_fade, 36),
LERPC(level_fade, 121));
setRGB2(poly,
LERPC(level_fade, 25),
LERPC(level_fade, 12),
LERPC(level_fade, 64));
setRGB3(poly,
LERPC(level_fade, 25),
LERPC(level_fade, 12),
LERPC(level_fade, 64));
/* POLY_F4 *poly = get_next_prim(); */
/* increment_prim(sizeof(POLY_F4)); */
/* setPolyF4(poly); */
/* setXYWH(poly, 0, water_y, SCREEN_XRES, water_h); */
/* setSemiTrans(poly, 1); */
/* setRGB0(poly, */
/* LERPC(level_fade, 31), */
/* LERPC(level_fade, 36), */
/* LERPC(level_fade, 121)); */
sort_prim(poly, OTZ_LAYER_LEVEL_FG_FRONT);
}
}
_screen_level_draw_water(data);
// Draw player
if(abs((player.pos.vx - camera.pos.vx) >> 12) <= SCREEN_XRES