1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2025-07-15 12:24:15 +00:00

nes: updated presets

This commit is contained in:
Steven Hugg
2019-08-07 21:23:08 -04:00
parent 5b39cd51ed
commit 9b42eaedb1

View File

@@ -44,7 +44,7 @@ typedef enum { SND_START, SND_HIT, SND_COIN, SND_JUMP } SFXIndex;
///// DEFINES ///// DEFINES
#define COLS 30 // floor width in tiles #define COLS 30 // floor width in tiles
#define ROWS 60 // total nametable height in tiles #define ROWS 60 // total scrollable height in tiles
#define MAX_FLOORS 20 // total # of floors in a stage #define MAX_FLOORS 20 // total # of floors in a stage
#define GAPSIZE 4 // gap size in tiles #define GAPSIZE 4 // gap size in tiles
@@ -64,6 +64,7 @@ typedef enum { SND_START, SND_HIT, SND_COIN, SND_JUMP } SFXIndex;
#define CH_LADDER 0xd4 #define CH_LADDER 0xd4
#define CH_ITEM 0xc4 #define CH_ITEM 0xc4
#define CH_BLANK 0x20 #define CH_BLANK 0x20
#define CH_BASEMENT 0x97
///// GLOBALS ///// GLOBALS
@@ -235,21 +236,26 @@ void make_floors() {
// creete actors on floor_index, if slot is empty // creete actors on floor_index, if slot is empty
void create_actors_on_floor(byte floor_index); void create_actors_on_floor(byte floor_index);
// draw a nametable line into the frame buffer at <screen_y> // draw a nametable line into the frame buffer at <row_height>
// 0 == bottom of stage // 0 == bottom of stage
void draw_floor_line(byte screen_y) { void draw_floor_line(byte row_height) {
char buf[COLS]; char buf[COLS]; // nametable buffer
char attrs[8]; char attrs[8]; // attribute buffer
byte floor, i; byte floor; // floor counter
byte y = screen_y; byte dy; // height in rows above floor
byte rowy; byte rowy; // row in nametable (0-59)
word addr; word addr; // nametable address
byte i; // loop counter
// loop over all floors
for (floor=0; floor<MAX_FLOORS; floor++) { for (floor=0; floor<MAX_FLOORS; floor++) {
Floor* lev = &floors[floor]; Floor* lev = &floors[floor];
byte dy = y - lev->ypos; // compute height in rows above floor
if (dy >= 254) dy = 0; // if below BOTTOM_Y_FLOOR dy = row_height - lev->ypos;
// is this floor visible on-screen? // if below bottom floor (in basement)
if (dy >= 255 - BOTTOM_FLOOR_Y) dy = 0;
// does this floor intersect the desired row?
if (dy < lev->height) { if (dy < lev->height) {
// first two rows (floor)?
if (dy <= 1) { if (dy <= 1) {
// iterate through all 32 columns // iterate through all 32 columns
for (i=0; i<COLS; i+=2) { for (i=0; i<COLS; i+=2) {
@@ -274,12 +280,12 @@ void draw_floor_line(byte screen_y) {
} }
// draw ladders // draw ladders
if (lev->ladder1) { if (lev->ladder1) {
buf[lev->ladder1*2] = CH_LADDER; buf[lev->ladder1*2] = CH_LADDER; // left
buf[lev->ladder1*2+1] = CH_LADDER+1; buf[lev->ladder1*2+1] = CH_LADDER+1; // right
} }
if (lev->ladder2) { if (lev->ladder2) {
buf[lev->ladder2*2] = CH_LADDER; buf[lev->ladder2*2] = CH_LADDER; // left
buf[lev->ladder2*2+1] = CH_LADDER+1; buf[lev->ladder2*2+1] = CH_LADDER+1; // right
} }
} }
// draw object, if it exists // draw object, if it exists
@@ -294,32 +300,32 @@ void draw_floor_line(byte screen_y) {
buf[lev->objpos*2+1] = ch+2; // top-right buf[lev->objpos*2+1] = ch+2; // top-right
} }
} }
// compute row in name buffer and address
rowy = (ROWS-1) - (screen_y%60);
addr = getntaddr(1, rowy);
// copy attribute table (every 4th row)
if ((addr & 0x60) == 0) {
byte a;
if (dy==1)
a = 0x05; // top of attribute block
else if (dy==3)
a = 0x50; // bottom of attribute block
else
a = 0x00; // does not intersect attr. block
// write entire row of attribute blocks
memset(attrs, a, 8);
vrambuf_put(nt2attraddr(addr), attrs, 8);
}
// copy line to screen buffer
vrambuf_put(addr, buf, COLS);
// create actors on this floor, if needed
// TODO: maybe this happens too early?
if (dy == 0 && (floor >= 2)) {
create_actors_on_floor(floor);
}
break; break;
} }
} }
// compute row in name buffer and address
rowy = (ROWS-1) - (row_height % ROWS);
addr = getntaddr(1, rowy);
// copy attribute table (every 4th row)
if ((addr & 0x60) == 0) {
byte a;
if (dy==1)
a = 0x05; // top of attribute block
else if (dy==3)
a = 0x50; // bottom of attribute block
else
a = 0x00; // does not intersect attr. block
// write entire row of attribute blocks
memset(attrs, a, 8);
vrambuf_put(nt2attraddr(addr), attrs, 8);
}
// copy line to screen buffer
vrambuf_put(addr, buf, COLS);
// create actors on this floor, if needed
// TODO: maybe this happens too early?
if (dy == 0 && (floor >= 2)) {
create_actors_on_floor(floor);
}
} }
// draw entire stage at current scroll position // draw entire stage at current scroll position
@@ -349,22 +355,22 @@ void set_scroll_pixel_yy(int yy) {
if ((yy & 7) == 0) { if ((yy & 7) == 0) {
// scrolling upward or downward? // scrolling upward or downward?
if (yy > scroll_pixel_yy) if (yy > scroll_pixel_yy)
draw_floor_line(scroll_tile_y+30); draw_floor_line(scroll_tile_y + 30); // above
else else
draw_floor_line(scroll_tile_y-30); draw_floor_line(scroll_tile_y - 30); // below
} }
// set scroll variables // set scroll variables
scroll_pixel_yy = yy; scroll_pixel_yy = yy; // get scroll pos. in pixels
scroll_tile_y = yy >> 3; // divide by 8 scroll_tile_y = yy >> 3; // divide by 8
// set scroll registers // set scroll registers
scroll(0, 479 - ((yy + 224) % 480)); scroll(0, 479 - ((yy + 224) % 480));
} }
// redraw a floor when object picked up // redraw a floor when object picked up
void refresh_floor(byte floor) { void refresh_floor(byte floor) {
byte y = floors[floor].ypos; byte y = floors[floor].ypos; // get floor bottom coordinate
draw_floor_line(y+2); draw_floor_line(y+2); // redraw 3rd line
draw_floor_line(y+3); draw_floor_line(y+3); // redraw 4th line
} }
///// ACTORS ///// ACTORS
@@ -518,14 +524,14 @@ byte mount_ladder(Actor* player, signed char floor_adjust) {
// should we scroll the screen upward? // should we scroll the screen upward?
void check_scroll_up() { void check_scroll_up() {
if (player_screen_y < ACTOR_SCROLL_UP_Y) { if (player_screen_y < ACTOR_SCROLL_UP_Y) {
set_scroll_pixel_yy(scroll_pixel_yy + 1); set_scroll_pixel_yy(scroll_pixel_yy + 1); // scroll up
} }
} }
// should we scroll the screen downward? // should we scroll the screen downward?
void check_scroll_down() { void check_scroll_down() {
if (player_screen_y > ACTOR_SCROLL_DOWN_Y && scroll_pixel_yy > 0) { if (player_screen_y > ACTOR_SCROLL_DOWN_Y && scroll_pixel_yy > 0) {
set_scroll_pixel_yy(scroll_pixel_yy - 1); set_scroll_pixel_yy(scroll_pixel_yy - 1); // scroll down
} }
} }