shithub: wl3d

Download patch

ref: 4c670f454f76120455674cd064d3f9bbb2e0d2aa
parent: 0441e14568c0254ba99e516d1282fd196cb1e0a3
author: Konstantinn Bonnet <qu7uux@gmail.com>
date: Wed Mar 23 19:18:29 EDT 2016

implement drawing text, highscores

--- a/dat.h
+++ b/dat.h
@@ -56,12 +56,12 @@
 extern uchar *pict;
 
 struct Fnt{
-	s16int h;
-	s16int ofs[256];
+	int h;
+	int ofs[256];
 	char w[256];
 	Dat;
 };
-extern Fnt fnts[];
+extern Fnt fnts[], *fnt;
 
 struct Sfx{
 	Dat pc;
--- a/fns.h
+++ b/fns.h
@@ -2,13 +2,16 @@
 void*	erealloc(void *, ulong);
 void	flush(void);
 void	dat(char *);
+void	palpic(uchar *);
+void	fadeout(int);
+void	fadein(int);
 void	out(void);
 void	put(int, int, int, int, uchar *, int);
+int	txt(int, int, char *, int);
+int	txtnl(int, int, char *, int);
+int	txtw(char *s);
 void	fill(int);
-void	palpic(uchar *);
 void	pic(int, int, int);
-void	fadein(int);
-void	fadeout(int);
 void	demos(void);
 void	init(void);
 int	rnd(void);
--- a/fs.c
+++ b/fs.c
@@ -841,7 +841,7 @@
 static void
 getfnts(Biobuf *dat, Biobuf *aux, u16int hf[])
 {
-	s16int *o;
+	int *o;
 	u32int v, n;
 	uchar *u, *p;
 	char *w;
@@ -855,7 +855,7 @@
 		unhuff(dat, hf, u, n);
 		f->h = GBIT16(p), p+=2;
 		for(o=f->ofs; o < f->ofs+nelem(f->ofs); o++)
-			*o = GBIT16(p), p+=2;
+			*o = GBIT16(p) - (2+256*3), p+=2;
 		for(w=f->w; w < f->w+nelem(f->w); w++)
 			*w = *p++;
 		n -= p-u;
--- a/inter.c
+++ b/inter.c
@@ -889,118 +889,6 @@
 	VW_UpdateScreen ();
 }
 
-
-//==========================================================================
-
-/*
-==================
-=
-= DrawHighScores
-=
-==================
-*/
-
-void	DrawHighScores(void)
-{
-	char		buffer[16],*str,buffer1[5];
-	u8int		temp,temp1,temp2,temp3;
-	u16int		i,j,
-				w,h,
-				x,y;
-	HighScore	*s;
-
-#ifndef SPEAR
-	fontnumber=0;
-#else
-	fontnumber = 1;
-#endif
-
-
-#ifndef SPEAR
-	SETFONTCOLOR(15,0x29);
-#else
-	SETFONTCOLOR(HIGHLIGHT,0x29);
-#endif
-
-	for (i = 0,s = Scores;i < MaxScores;i++,s++)
-	{
-		PrintY = 76 + (16 * i);
-
-		//
-		// name
-		//
-#ifndef SPEAR
-		PrintX = 4*8;
-#else
-		PrintX = 16;
-#endif
-		US_Print(s->name);
-
-		//
-		// level
-		//
-		ultoa(s->completed,buffer,10);
-#ifndef SPEAR
-		for (str = buffer;*str;str++)
-			*str = *str + (129 - '0');	// Used fixed-width numbers (129...)
-		USL_MeasureString(buffer,&w,&h);
-		PrintX = (22 * 8)-w;
-#else
-		USL_MeasureString(buffer,&w,&h);
-		PrintX = 194 - w;
-#endif
-
-#ifndef UPLOAD
-#ifndef SPEAR
-		PrintX -= 6;
-		itoa(s->episode+1,buffer1,10);
-		US_Print("E");
-		US_Print(buffer1);
-		US_Print("/L");
-#endif
-#endif
-
-#ifdef SPEAR
-		if (s->completed == 21)
-			VWB_DrawPic (PrintX+8,PrintY-1,Pspear);
-		else
-#endif
-		US_Print(buffer);
-
-		//
-		// score
-		//
-		ultoa(s->score,buffer,10);
-#ifndef SPEAR
-		for (str = buffer;*str;str++)
-			*str = *str + (129 - '0');	// Used fixed-width numbers (129...)
-		USL_MeasureString(buffer,&w,&h);
-		PrintX = (34 * 8) - 8 - w;
-#else
-		USL_MeasureString(buffer,&w,&h);
-		PrintX = 292 - w;
-#endif
-		US_Print(buffer);
-	}
-
-	VW_UpdateScreen ();
-
-#ifdef SPEAR
-	fontnumber = 0;
-#endif
-}
-
-//===========================================================================
-
-
-/*
-=======================
-=
-= CheckHighScore
-=
-=======================
-*/
-
 void	CheckHighScore (s32int score,u16int other)
 {
 	u16int		i,j;
--- a/mn.c
+++ b/mn.c
@@ -3,6 +3,23 @@
 #include "dat.h"
 #include "fns.h"
 
+typedef struct Score Score;
+struct Score{
+	char name[58];
+	int n;
+	int lvl;
+	int ep;
+};
+static Score score[] = {
+	{"id software-'92", 10000, 1},
+	{"Adrian Carmack", 10000, 1},
+	{"John Carmack", 10000, 1},
+	{"Kevin Cloud", 10000, 1},
+	{"Tom Hall", 10000, 1},
+	{"John Romero", 10000, 1},
+	{"Jay Wilbur", 10000, 1},
+};
+
 static void (*clear)(void);
 static void (*stripe)(int);
 static void (*scores)(void);
@@ -49,20 +66,70 @@
 }
 
 static void
+fixedw(char *s)
+{
+	char c;
+
+	while(c = *s, c != 0)
+		*s++ = c - '0' + 129;
+}
+
+static void
 wlscores(void)
 {
+	int x, y;
+	char a[16], b[16];
+	Score *s;
+
 	clear();
 	stripe(10);
 	pic(48, 0, pict[Pscores]);
-	pic(4*8, 68, pict[Pname]);
-	pic(20*8, 68, pict[Plvl]);
-	pic(28*8, 68, pict[Phigh]);
+	pic(32, 68, pict[Pname]);
+	pic(160, 68, pict[Plvl]);
+	pic(224, 68, pict[Phigh]);
+
+	fnt = fnts;
+	for(s=score, y=76; s<score+nelem(score); s++, y+=16){
+		txt(32, y, s->name, 0xf);
+
+		sprint(a, "%d", s->lvl);
+		fixedw(a);
+		x = 176 - txtw(a);
+		if(ver < WL1){
+			sprint(b, "E%d/L", s->ep+1);
+			x += txt(x-6, y, b, 0xf) - 6;
+		}
+		txt(x, y, a, 0xf);
+
+		sprint(a, "%d", s->n);
+		fixedw(a);
+		txt(264 - txtw(a), y, a, 0xf);
+	}
 }
 static void
 sdscores(void)
 {
+	int y;
+	char a[16];
+	Score *s;
+
 	clear();
 	pic(0, 0, pict[Pscores]);
+
+	fnt = fnts+1;
+	for(s=score, y=76; s<score+nelem(score); s++, y+=16){
+		txt(16, y, s->name, 0x13);
+
+		if(s->lvl == 21)
+			pic(176, y-1, pict[Pspear]);
+		else{
+			sprint(a, "%d", s->lvl);
+			txt(194 - txtw(a), y, a, 0xf);
+		}
+
+		sprint(a, "%d", s->n);
+		txt(292 - txtw(a), y, a, 0xf);
+	}
 }
 
 static void
--- a/rend.c
+++ b/rend.c
@@ -3,7 +3,7 @@
 #include "dat.h"
 #include "fns.h"
 
-Fnt fnts[2];
+Fnt fnts[2], *fnt;
 Pic *pics, *pice;
 Dat *exts, *exte;
 Dat *dems, *deme, *epis;
@@ -132,6 +132,65 @@
 			memset(d, c, dx);
 			d += Vw;
 		}	
+}
+
+int
+txt(int x, int y, char *t, int col)
+{
+	int h, w;
+	uchar c, *d, *s, *p, *e, *q;
+
+	h = fnt->h;
+	p = fnt->p;
+	c = *t++;
+	d = pxb + x + y*Vw;
+	x = 0;
+	while(c != 0){
+		w = fnt->w[c];
+		s = p + fnt->ofs[c];
+		e = s + w*h;
+		while(s < e){
+			q = s + w;
+			while(s < q){
+				c = *s++;
+				if(c != 0)
+					*d = col;
+				d++;
+			}
+			d += Vw-w;
+		}
+		d -= Vw*h - w;
+		x += w;
+		c = *t++;
+	}
+	return x;
+}
+
+int
+txtnl(int x, int y, char *t, int col)
+{
+	int n;
+	char *s;
+
+	n = 0;
+	s = strtok(t, "\n");
+	while(s != nil){
+		n += txt(x, y, s, col);
+		s = strtok(nil, "\n");
+		y += fnt->h;
+	}
+	return n;
+}
+
+int
+txtw(char *t)
+{
+	int n;
+
+	n = 0;
+	while(*t != 0)
+		n += fnt->w[(uchar)*t++];
+	return n;
 }
 
 void
--- a/us.h
+++ b/us.h
@@ -94,7 +94,6 @@
 				US_StartCursor(void),
 				US_ShutCursor(void),
 				US_CheckHighScore(s32int score,u16int other),
-				US_DisplayHighScores(s16int which);
 extern	int	US_UpdateCursor(void),
 				US_LineInput(s16int x,s16int y,char *buf,char *def,int escok,
 								s16int maxchars,s16int maxwidth);
--- a/us1.c
+++ b/us1.c
@@ -11,16 +11,6 @@
 					(*USL_DrawString)(char far *) = VWB_DrawPropString;
 
 		SaveGame	Games[MaxSaveGames];
-		HighScore	Scores[MaxScores] =
-					{
-						{"id software-'92",10000,1},
-						{"Adrian Carmack",10000,1},
-						{"John Carmack",10000,1},
-						{"Kevin Cloud",10000,1},
-						{"Tom Hall",10000,1},
-						{"John Romero",10000,1},
-						{"Jay Wilbur",10000,1},
-					};
 
 //	Window/Printing routines
 
--- a/vh.c
+++ b/vh.c
@@ -13,144 +13,6 @@
 s16int bufferwidth,bufferheight;
 
 
-//==========================================================================
-
-void	VWL_UpdateScreenBlocks (void);
-
-//==========================================================================
-
-void VW_DrawPropString (char far *string)
-{
-	fontstruct	far	*font;
-	s16int		width,step,height,i;
-	u8int	far *source, far *dest, far *origdest;
-	u8int	ch,mask;
-
-	font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
-	height = bufferheight = font->height;
-	dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
-	mask = 1<<(px&3);
-
-
-	while ((ch = *string++)!=0)
-	{
-		width = step = font->width[ch];
-		source = ((u8int far *)font)+font->location[ch];
-		while (width--)
-		{
-			VGAMAPMASK(mask);
-
-asm	mov	ah,[BYTE PTR fontcolor]
-asm	mov	bx,[step]
-asm	mov	cx,[height]
-asm	mov	dx,[linewidth]
-asm	lds	si,[source]
-asm	les	di,[dest]
-
-vertloop:
-asm	mov	al,[si]
-asm	or	al,al
-asm	je	next
-asm	mov	[es:di],ah			// draw color
-
-next:
-asm	add	si,bx
-asm	add	di,dx
-asm	loop	vertloop
-asm	mov	ax,ss
-asm	mov	ds,ax
-
-			source++;
-			px++;
-			mask <<= 1;
-			if (mask == 16)
-			{
-				mask = 1;
-				dest++;
-			}
-		}
-	}
-bufferheight = height;
-bufferwidth = ((dest+1)-origdest)*4;
-}
-
-
-void VW_DrawColorPropString (char far *string)
-{
-	fontstruct	far	*font;
-	s16int		width,step,height,i;
-	u8int	far *source, far *dest, far *origdest;
-	u8int	ch,mask;
-
-	font = (fontstruct far *)grsegs[STARTFONT+fontnumber];
-	height = bufferheight = font->height;
-	dest = origdest = MK_FP(SCREENSEG,bufferofs+ylookup[py]+(px>>2));
-	mask = 1<<(px&3);
-
-
-	while ((ch = *string++)!=0)
-	{
-		width = step = font->width[ch];
-		source = ((u8int far *)font)+font->location[ch];
-		while (width--)
-		{
-			VGAMAPMASK(mask);
-
-asm	mov	ah,[BYTE PTR fontcolor]
-asm	mov	bx,[step]
-asm	mov	cx,[height]
-asm	mov	dx,[linewidth]
-asm	lds	si,[source]
-asm	les	di,[dest]
-
-vertloop:
-asm	mov	al,[si]
-asm	or	al,al
-asm	je	next
-asm	mov	[es:di],ah			// draw color
-
-next:
-asm	add	si,bx
-asm	add	di,dx
-
-asm rcr cx,1				// inc font color
-asm jc  cont
-asm	inc ah
-
-cont:
-asm rcl cx,1
-asm	loop	vertloop
-asm	mov	ax,ss
-asm	mov	ds,ax
-
-			source++;
-			px++;
-			mask <<= 1;
-			if (mask == 16)
-			{
-				mask = 1;
-				dest++;
-			}
-		}
-	}
-bufferheight = height;
-bufferwidth = ((dest+1)-origdest)*4;
-}
-
-void VWL_MeasureString (char far *string, u16int *width, u16int *height
-	, fontstruct _seg *font)
-{
-	*height = font->height;
-	for (*width = 0;*string;string++)
-		*width += font->width[*((u8int far *)string)];	// proportional width
-}
-
-void	VW_MeasurePropString (char far *string, u16int *width, u16int *height)
-{
-	VWL_MeasureString(string,width,height,(fontstruct _seg *)grsegs[STARTFONT+fontnumber]);
-}
-
-
 /*
 =============================================================================
 
@@ -222,47 +84,10 @@
 		LatchDrawChar(x,y,tile);
 }
 
-void VWB_DrawPic (s16int x, s16int y, s16int chunknum)
-{
-	s16int	picnum = chunknum - STARTPICS;
-	u16int width,height;
-
-	x &= ~7;
-
-	width = pictable[picnum].width;
-	height = pictable[picnum].height;
-
-	if (VW_MarkUpdateBlock (x,y,x+width-1,y+height-1))
-		VL_MemToScreen (grsegs[chunknum],width,height,x,y);
-}
-
-
-
-void VWB_DrawPropString	 (char far *string)
-{
-	s16int x;
-	x=px;
-	VW_DrawPropString (string);
-	VW_MarkUpdateBlock(x,py,px-1,py+bufferheight-1);
-}
-
-
-void VWB_Bar (s16int x, s16int y, s16int width, s16int height, s16int color)
-{
-	if (VW_MarkUpdateBlock (x,y,x+width,y+height-1) )
-		VW_Bar (x,y,width,height,color);
-}
-
 void VWB_Plot (s16int x, s16int y, s16int color)
 {
 	if (VW_MarkUpdateBlock (x,y,x,y))
 		VW_Plot(x,y,color);
-}
-
-void VWB_Hlin (s16int x1, s16int x2, s16int y, s16int color)
-{
-	if (VW_MarkUpdateBlock (x1,y,x2,y))
-		VW_Hlin(x1,x2,y,color);
 }
 
 void VWB_Vlin (s16int y1, s16int y2, s16int x, s16int color)
--- a/vl.c
+++ b/vl.c
@@ -51,136 +51,7 @@
 	}
 }
 
-//===========================================================================
-
 /*
-=================
-=
-= VL_SetColor
-=
-=================
-*/
-
-void VL_SetColor	(s16int color, s16int red, s16int green, s16int blue)
-{
-	outportb (PEL_WRITE_ADR,color);
-	outportb (PEL_DATA,red);
-	outportb (PEL_DATA,green);
-	outportb (PEL_DATA,blue);
-}
-
-//===========================================================================
-
-/*
-=================
-=
-= VL_GetColor
-=
-=================
-*/
-
-void VL_GetColor	(s16int color, s16int *red, s16int *green, s16int *blue)
-{
-	outportb (PEL_READ_ADR,color);
-	*red = inportb (PEL_DATA);
-	*green = inportb (PEL_DATA);
-	*blue = inportb (PEL_DATA);
-}
-
-/*
-=================
-=
-= VL_FadeOut
-=
-= Fades the current palette to the given color in the given number of steps
-=
-=================
-*/
-
-void VL_FadeOut (s16int start, s16int end, s16int red, s16int green, s16int blue, s16int steps)
-{
-	s16int		i,j,orig,delta;
-	u8int	far *origptr, far *newptr;
-
-	VL_WaitVBL(1);
-	VL_GetPalette (&palette1[0][0]);
-	_fmemcpy (palette2,palette1,768);
-
-//
-// fade through intermediate frames
-//
-	for (i=0;i<steps;i++)
-	{
-		origptr = &palette1[start][0];
-		newptr = &palette2[start][0];
-		for (j=start;j<=end;j++)
-		{
-			orig = *origptr++;
-			delta = red-orig;
-			*newptr++ = orig + delta * i / steps;
-			orig = *origptr++;
-			delta = green-orig;
-			*newptr++ = orig + delta * i / steps;
-			orig = *origptr++;
-			delta = blue-orig;
-			*newptr++ = orig + delta * i / steps;
-		}
-
-		VL_WaitVBL(1);
-		VL_SetPalette (&palette2[0][0]);
-	}
-
-//
-// final color
-//
-	VL_FillPalette (red,green,blue);
-
-	screenfaded = true;
-}
-
-
-/*
-=================
-=
-= VL_FadeIn
-=
-=================
-*/
-
-void VL_FadeIn (s16int start, s16int end, u8int far *palette, s16int steps)
-{
-	s16int		i,j,delta;
-
-	VL_WaitVBL(1);
-	VL_GetPalette (&palette1[0][0]);
-	_fmemcpy (&palette2[0][0],&palette1[0][0],sizeof(palette1));
-
-	start *= 3;
-	end = end*3+2;
-
-//
-// fade through intermediate frames
-//
-	for (i=0;i<steps;i++)
-	{
-		for (j=start;j<=end;j++)
-		{
-			delta = palette[j]-palette1[0][j];
-			palette2[0][j] = palette1[0][j] + delta * i / steps;
-		}
-
-		VL_WaitVBL(1);
-		VL_SetPalette (&palette2[0][0]);
-	}
-
-//
-// final color
-//
-	VL_SetPalette (palette);
-	screenfaded = false;
-}
-
-/*
 ==================
 =
 = VL_ColorBorder
@@ -227,51 +98,6 @@
 	mask = pixmasks[x&3];
 	VGAMAPMASK(mask);
 	*(u8int far *)MK_FP(SCREENSEG,bufferofs+(ylookup[y]+(x>>2))) = color;
-	VGAMAPMASK(15);
-}
-
-
-/*
-=================
-=
-= VL_Hlin
-=
-=================
-*/
-
-void VL_Hlin (u16int x, u16int y, u16int width, u16int color)
-{
-	u16int		xbyte;
-	u8int			far *dest;
-	u8int			leftmask,rightmask;
-	s16int				midbytes;
-
-	xbyte = x>>2;
-	leftmask = leftmasks[x&3];
-	rightmask = rightmasks[(x+width-1)&3];
-	midbytes = ((x+width+3)>>2) - xbyte - 2;
-
-	dest = MK_FP(SCREENSEG,bufferofs+ylookup[y]+xbyte);
-
-	if (midbytes<0)
-	{
-	// all in one byte
-		VGAMAPMASK(leftmask&rightmask);
-		*dest = color;
-		VGAMAPMASK(15);
-		return;
-	}
-
-	VGAMAPMASK(leftmask);
-	*dest++ = color;
-
-	VGAMAPMASK(15);
-	_fmemset (dest,color,midbytes);
-	dest+=midbytes;
-
-	VGAMAPMASK(rightmask);
-	*dest = color;
-
 	VGAMAPMASK(15);
 }