From ba81930a4ab38c4a0d74a3f20b96fda1cdc3338e Mon Sep 17 00:00:00 2001
From: sparky4 <sparky4@cock.li>
Date: Thu, 2 Feb 2017 16:09:27 -0600
Subject: [PATCH] ==== old BG rendering is back ====

---
 src/lib/16_enti.c  | 11 +++---
 src/lib/16_sprit.c | 40 +++++++++-------------
 src/lib/16_vl.c    | 16 ++++++---
 src/lib/scroll16.c | 83 +++++++++++++++++++++++++---------------------
 src/lib/scroll16.h |  9 ++---
 5 files changed, 82 insertions(+), 77 deletions(-)

diff --git a/src/lib/16_enti.c b/src/lib/16_enti.c
index 19df4fd5..310aaab6 100755
--- a/src/lib/16_enti.c
+++ b/src/lib/16_enti.c
@@ -46,8 +46,7 @@ void EN_initentity(entity_t *enti, video_t *video)
 // 	modexClearRegion(&video->page[0], enti->x, enti->y, 16, 16, 2);
 // 	modexClearRegion(&video->page[2], 0, 0, video->page[2].sw, video->page[2].sh, 45);
 // 	modexClearRegion(&video->page[3], 0, 0, video->page[3].sw, video->page[3].sh, 47);
-	if(!video->bgps)
-	{
+	if(!video->bgps){
 		//video->ofs.pattern_ofs=(uint16_t)video->page[0].data;
 		//video->ofs.offscreen_ofs=(uint16_t)video->page[3].data;
 		w = (enti->x + 24) & (~3);
@@ -60,10 +59,10 @@ void EN_initentity(entity_t *enti, video_t *video)
 		for (i=0;i < h;i++,o += video->page[0].stridew,o2 += (w >> 2)) vga_wm1_mem_block_copy(o2,o,w >> 2);
 		// must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally
 		vga_restore_rm0wm0();
-	}else{
-		w=h=o=i=o2=0;
-		modexCopyPageRegion(&video->page[2], &video->page[0], enti->x, enti->y, 0, 0, 24, 32);
-	}
+	}//else{
+		//w=h=o=i=o2=0;
+		//modexCopyPageRegion(&video->page[2], &video->page[0], enti->x, enti->y, 0, 0, 24, 32);
+	//}
 }
 
 //init player!
diff --git a/src/lib/16_sprit.c b/src/lib/16_sprit.c
index 1c37d46d..9f699e19 100755
--- a/src/lib/16_sprit.c
+++ b/src/lib/16_sprit.c
@@ -158,17 +158,16 @@ void animate_spri(entity_t *enti, video_t *video)
 	// render box bounds. y does not need modification, but x and width must be multiple of 4
 	if(!video->rss)
 	{
-		if(!video->bgps)
-		{
-			if (x >= enti->overdraww) rx = (x - enti->overdraww) & (~3);
-				else rx = -(video->page[0].dx);
-			if (y >= enti->overdrawh) ry = (y - enti->overdrawh);
-				else ry = -(video->page[0].dy);
-			h = enti->spri->sprite_vrl_cont->vrl_header->height + enti->overdrawh + y - ry;
-			w = (x + enti->spri->sprite_vrl_cont->vrl_header->width + (enti->overdraww*2) + 3 - rx) & (~3) - enti->overdraww;//round up
-			if ((rx+w) > video->page[0].width) w = video->page[0].width-rx;
-			if ((ry+h) > video->page[0].height) h = video->page[0].height-ry;
-
+		if (x >= enti->overdraww) rx = (x - enti->overdraww) & (~3);
+			else rx = -(video->page[0].dx);
+		if (y >= enti->overdrawh) ry = (y - enti->overdrawh);
+			else ry = -(video->page[0].dy);
+		h = enti->spri->sprite_vrl_cont->vrl_header->height + enti->overdrawh + y - ry;
+		w = (x + enti->spri->sprite_vrl_cont->vrl_header->width + (enti->overdraww*2) + 3 - rx) & (~3) - enti->overdraww;//round up
+		if ((rx+w) > video->page[0].width) w = video->page[0].width-rx;
+		if ((ry+h) > video->page[0].height) h = video->page[0].height-ry;
+
+		if(!video->bgps){
 			// block copy pattern to where we will draw the sprite
 			vga_setup_wm1_block_copy();
 			o2 = video->ofs.offscreen_ofs;
@@ -177,14 +176,10 @@ void animate_spri(entity_t *enti, video_t *video)
 
 			// must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally
 			vga_restore_rm0wm0();
-
-			// replace VGA stride with our own and mem ptr. then sprite rendering at this stage is just (0,0)
-			vga_state.vga_draw_stride = w >> 2;
-			vga_state.vga_graphics_ram = omemptr + video->ofs.offscreen_ofs;
-		}else{
-			w=h=i=o=o2=0;
-			modexCopyPageRegion(&video->page[2], &video->page[0], enti->x, enti->y, 0, 0, 24, 32);
 		}
+		// replace VGA stride with our own and mem ptr. then sprite rendering at this stage is just (0,0)
+		vga_state.vga_draw_stride = w >> 2;
+		vga_state.vga_graphics_ram = omemptr + video->ofs.offscreen_ofs;
 	}else{ rx=ry=w=h=0; vga_state.vga_graphics_ram = (VGA_RAM_PTR)video->page[0].data; }
 	vga_state.vga_draw_stride_limit = (video->page[0].width + 3 - x) >> 2;//round up
 
@@ -203,11 +198,10 @@ void animate_spri(entity_t *enti, video_t *video)
 #endif
 	if(!video->rss)
 	{
-		if(!video->bgps)
-		{
-			// restore ptr
-			vga_state.vga_graphics_ram = omemptr;
+		// restore ptr
+		vga_state.vga_graphics_ram = omemptr;
 
+		if(!video->bgps){
 			// block copy to visible RAM from offscreen
 			vga_setup_wm1_block_copy();
 			o = video->ofs.offscreen_ofs; // source offscreen
@@ -215,8 +209,6 @@ void animate_spri(entity_t *enti, video_t *video)
 			for (i=0;i < h;i++,o += vga_state.vga_draw_stride,o2 += video->page[0].stridew) vga_wm1_mem_block_copy(o2,o,w >> 2);
 			// must restore Write Mode 0/Read Mode 0 for this code to continue drawing normally
 			vga_restore_rm0wm0();
-		}else{
-			//modexCopyPageRegion(&video->page[0], &video->page[2], 0, 0, enti->x, enti->y, 24, 32);
 		}
 	}
 	// restore stride
diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c
index 5c485586..56b60684 100755
--- a/src/lib/16_vl.c
+++ b/src/lib/16_vl.c
@@ -279,8 +279,14 @@ void modexCalcVmemRemain(video_t *video)
 
 void VL_Initofs(video_t *video)
 {
-	video->ofs.offscreen_ofs =	video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);
-	video->ofs.pattern_ofs =	(uint16_t)video->page[3].data;
+	if(!video->bgps)
+	{
+		video->ofs.offscreen_ofs =	video->page[0].pagesize+video->page[1].pagesize;//(vga_state.vga_stride * vga_state.vga_height);
+		video->ofs.pattern_ofs =	(uint16_t)video->page[2].data;
+	}else{
+		video->ofs.offscreen_ofs =	0;
+		video->ofs.pattern_ofs =	0;//(uint16_t)video->page[0].data;
+	}
 }
 
 void modexHiganbanaPageSetup(video_t *video)
@@ -306,9 +312,9 @@ void modexHiganbanaPageSetup(video_t *video)
 	video->omemptr=			vga_state.vga_graphics_ram;
 	video->vga_draw_stride=	vga_state.vga_draw_stride;
 	video->vga_draw_stride_limit=	vga_state.vga_draw_stride_limit;
-	//sprite render switch
-	video->rss=		0;	//set to new
-	video->bgps=	0;	//set to new
+	//sprite render switch and bgpreservation switch
+	video->rss=		1;
+	video->bgps=	1;
 
 	//setup the buffersize
 	video->page[0].dx=video->page[0].dy=
diff --git a/src/lib/scroll16.c b/src/lib/scroll16.c
index b35d6159..c11f49bf 100755
--- a/src/lib/scroll16.c
+++ b/src/lib/scroll16.c
@@ -46,7 +46,8 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn)
 					ANIMATESPRIFUN(pip, player, pn, 2);
 					ScrollRight(pip, player, 3, pn);
 					ScrollRight(pip, player, 2, pn);
-					mapScrollRight(pip, player, (pip[0].video->p), pn);
+									mapScrollRight(pip, player, (0), pn);
+					if(pip[0].video->bgps)	mapScrollRight(pip, player, (1), pn);
 					player[pn].enti.q++;
 					//0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
 				} else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; }
@@ -83,7 +84,8 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn)
 					ANIMATESPRIFUN(pip, player, pn, 2);
 					ScrollLeft(pip, player, 3, pn);
 					ScrollLeft(pip, player, 2, pn);
-					mapScrollLeft(pip, player, (pip[0].video->p), pn);
+									mapScrollLeft(pip, player, (0), pn);
+					if(pip[0].video->bgps)	mapScrollLeft(pip, player, (1), pn);
 					player[pn].enti.q++;
 					//0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
 				} else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; }
@@ -120,7 +122,8 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn)
 					ANIMATESPRIFUN(pip, player, pn, 2);
 					ScrollDown(pip, player, 3, pn);
 					ScrollDown(pip, player, 2, pn);
-					mapScrollDown(pip, player, (pip[0].video->p), pn);
+									mapScrollDown(pip, player, (0), pn);
+					if(pip[0].video->bgps)	mapScrollDown(pip, player, (1), pn);
 					player[pn].enti.q++;
 					//0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
 				} else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; }
@@ -157,7 +160,8 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn)
 					ANIMATESPRIFUN(pip, player, pn, 2);
 					ScrollUp(pip, player, 3, pn);
 					ScrollUp(pip, player, 2, pn);
-					mapScrollUp(pip, player, (pip[0].video->p), pn);
+									mapScrollUp(pip, player, (0), pn);
+					if(pip[0].video->bgps)	mapScrollUp(pip, player, (1), pn);
 					player[pn].enti.q++;
 					//0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2;
 				} else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; }
@@ -351,17 +355,17 @@ void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid)
 	ScrollRight(mv, player, id, plid);
 
 	/* draw the next column */
-	x= mv[0].page->sw + mv[id].map->tiles->tileWidth;
+	x= mv[0].page->sw + mv[0].map->tiles->tileWidth;
 #ifndef FULLRCREND
 	if(player[plid].enti.q%4)
 #else
 	if(player[plid].enti.q==4)
 #endif
-		if(id==0)
-			mapDrawCol(&mv[0], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);
-		else
-			if(mv[0].video->bgps)
-				modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));
+//		if(id==0)
+			mapDrawCol(&mv[id], mv[0].tx + mv[0].page->ti.tw, mv[0].ty-1, x, player, DRAWCOLNUM);
+//		else
+//			if(mv[0].video->bgps)
+//				modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);
 	mv[0].video->r=1;
 }
 
@@ -379,11 +383,11 @@ void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid)
 #else
 	if(player[plid].enti.q==4)
 #endif
-		if(id==0)
-			mapDrawCol(&mv[0], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);
-		else
-			if(mv[0].video->bgps)
-				modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[id].map->tiles->tileWidth, mv[id].map->tiles->tileHeight*(mv[0].page->ti.th+2));
+//		if(id==0)
+			mapDrawCol(&mv[id], mv[0].tx - 1, mv[0].ty-1, x, player, DRAWCOLNUM);
+//		else
+//			if(mv[0].video->bgps)
+//				modexCopyPageRegion(mv[id].page, mv[0].page, x, 0, x, 0, mv[0].map->tiles->tileWidth, mv[0].page->height);
 	mv[0].video->r=1;
 }
 
@@ -401,11 +405,11 @@ void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid)
 #else
 	if(player[plid].enti.q==4)
 #endif
-		if(id==0)
-			mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);
-		else
-			if(mv[0].video->bgps)
-				modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);
+//		if(id==0)
+			mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty-1, y, player, DRAWCOLNUM);
+//		else
+//			if(mv[0].video->bgps)
+//				modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);
 	mv[0].video->r=1;
 }
 
@@ -417,17 +421,17 @@ void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid)
 	ScrollDown(mv, player, id, plid);
 
 	/* draw the next row */
-	y= mv[0].page->sh + mv[id].map->tiles->tileHeight;
+	y= mv[0].page->sh + mv[0].map->tiles->tileHeight;
 #ifndef FULLRCREND
 	if(player[plid].enti.q%3)
 #else
 	if(player[plid].enti.q==4)
 #endif
-		if(id==0)
-			mapDrawRow(&mv[0], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWCOLNUM);
-		else
-			if(mv[0].video->bgps)
-				modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[id].map->tiles->tileWidth*(mv[0].page->ti.tw+2), mv[id].map->tiles->tileHeight);
+//		if(id==0)
+			mapDrawRow(&mv[id], mv[0].tx - 1, mv[0].ty+mv[0].page->ti.th, y, player, DRAWCOLNUM);
+//		else
+//			if(mv[0].video->bgps)
+//				modexCopyPageRegion(mv[id].page, mv[0].page, 0, y, 0, y, mv[0].page->width, mv[0].map->tiles->tileHeight);
 	mv[0].video->r=1;
 }
 
@@ -506,10 +510,15 @@ void mapGoTo(map_view_t *mv, int tx, int ty)
 	i=mv[0].ty * mv[0].map->width + mv[0].tx;
 	for(ty=mv[0].ty-1; py < mv[0].page->sh+mv->dyThresh && ty < mv[0].map->height; ty++, py+=mv[0].map->tiles->tileHeight) {
 		mapDrawWRow(&mv[0], tx-1, ty, py);
-	i+=mv->map->width - tx;
+		i+=mv->map->width - tx;
 	}
-	if(mv[0].video->bgps) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);
-//	modexCopyPageRegion(mv[3].page, mv[0].page, 0/**/, 0/**/, 0, 0, 24, 32);
+	py=0;
+	i=mv[1].ty * mv[1].map->width + mv[1].tx;
+	for(ty=mv[1].ty-1; py < mv[1].page->sh+mv->dyThresh && ty < mv[1].map->height; ty++, py+=mv[1].map->tiles->tileHeight) {
+		mapDrawWRow(&mv[1], tx-1, ty, py);
+		i+=mv->map->width - tx;
+	}
+	//if(mv[0].video->bgps) modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);
 }
 
 void ZC_mapinitMV(map_view_t *mv, int tx, int ty)
@@ -703,16 +712,12 @@ void shinku(global_game_variables_t *gv)
 	//render!!
 	if(gv->video.r )
 	{//r=1
-		if(gv->video.bgps )
-		{//bgps=1
-			/*modexCopyPageRegion(&(gv->video.page[
-			]), &(gv->video.page[(
-			]), 0, 0, 0, 0, gv->video.page[
-			].width, gv->video.page[
-			].height);*/
+		/*if(video->bgp s)
+		{
+			modexCopyPageRegion(&(gv->video.page[ ]), &(gv->video.page[ ]), 0, 0, 0, 0, gv->video.page[ ].width, gv->video.page[ ].height);
 		}else{
 			//modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32);
-		}
+		}*/
 		VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0);
 		gv->video.r =!gv->video.r ;
 		//0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2;
@@ -799,7 +804,7 @@ void animatePlayer(map_view_t *pip, player_t *player, word pn, sword scrollswitc
 		break;
 	}
 
-	if(pip[0].video->bgps) modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 36);
+// 	if(!pageflipflop) modexCopyPageRegion(pip[1].page, pip[0].page, x-4, y-4, x-4, y-4, 28, 36);
 // 	else{
 // 		//copy old bg to page0
 // 		//modexCopyPageRegion(pip[3].page, pip[0].page, bx, by,	0, 0,	20, 36);
@@ -895,6 +900,8 @@ void near ZC_animatePlayer(map_view_t *pip, player_t *player, word pn, sword scr
 	player[pn].enti.spri->x = x;
 	player[pn].enti.spri->y = y;
 
+	if(pip[0].video->bgps)
+		modexCopyPageRegion(pip[0].page, pip[1].page, x-4, y-4, x-4, y-4, 28, 40);
 	//draw sprite
 	ZC_drawframe(pip, &player[pn].enti, x, y);
 //0000if(player[pn].enti.q<2) delay(200);
diff --git a/src/lib/scroll16.h b/src/lib/scroll16.h
index 976a0d0d..bed922b1 100755
--- a/src/lib/scroll16.h
+++ b/src/lib/scroll16.h
@@ -56,8 +56,8 @@
 
 //row and colum drawing routines
 #define FULLRCREND
-#define DRAWCOLNUM mv->page[0].dx
-#define DRAWROLNUM mv->page[0].dy
+#define DRAWCOLNUM mv->page[id].dx
+#define DRAWROLNUM mv->page[id].dy
 //#define DRAWCOLNUM player[plid].enti.q
 //#define DRAWROLNUM player[plid].enti.q
 
@@ -77,8 +77,8 @@
 //printf("&global_temp_status_text = %Fp\n", &global_temp_status_text);
 //printf("middle tile position: %dx", gvar.video.page[0].tilemidposscreenx);	printf("%d\n", gvar.video.page[0].tilemidposscreeny);
 //printf("	aniframe=%u", player[0].enti.persist_aniframe);
-#define SCROLLEXITMESG 	printf("txy: %dx%d\n", mv[0].tx, mv[0].ty);\
-	printf("\n");\
+#define SCROLLEXITMESG 	printf("[0]txy: %dx%d	", mv[0].tx, mv[0].ty); printf("[1]txy: %dx%d", mv[1].tx, mv[1].ty);\
+	printf("\n\n");\
 	printf("player vars:\n");\
 	printf("	xy: %dx%d", player[0].enti.x, player[0].enti.y); printf("	txy: %dx%d", player[0].enti.tx, player[0].enti.ty); printf("	triggxy: %dx%d", player[0].enti.triggerx, player[0].enti.triggery); printf("	value: %d\n", mv[0].map->data[(player[0].enti.triggerx-1)+(map.width*(player[0].enti.triggery-1))]);\
 	printf("	hp: %d", (player[0].enti.hp));	printf("	q: %d", player[0].enti.q);	printf("	info.dir: %d", player[0].info.dir);	printf("	d: %d ", player[0].enti.d);\
@@ -87,6 +87,7 @@ printf("\n\n");\
 	VL_PrintmodexmemInfo(&gvar.video);\
 \
 	printf("gvar.video.r=%u ", gvar.video.r);\
+	printf("gvar.video.bgps=%u ", gvar.video.bgps);\
 printf("\n\n");
 
 extern boolean pagenorendermap, pagedelayrendermap;
-- 
2.39.5