shithub: battleship

Download patch

ref: 30ac819359e5d6de7f6622ba6c01e79457fe8277
parent: 671c2cac38ffada7f9185b87ec27b84566db8c2b
author: rodri <rgl@antares-labs.eu>
date: Fri Nov 15 17:28:23 EST 2024

bts: add a cover image.

binary files /dev/null b/assets/vfx/battleship.png differ
--- a/bts.c
+++ b/bts.c
@@ -135,6 +135,7 @@
 Font *titlefont;
 char winspec[32];
 char uid[8+1], oid[8+1];
+Image *coverimg;
 Sprite *spritetab[NVFX];
 Vfx vfxqueue;
 Channel *drawchan;
@@ -353,6 +354,7 @@
 	static char s[] = "BATTLESHIP";
 
 	string(dst, Pt(SCRW/2 - stringwidth(titlefont, s)/2, 0), pal[PCWhite], ZP, titlefont, s);
+	draw(dst, rectaddpt(coverimg->r, subpt(dst->r.max, subpt(coverimg->r.max, coverimg->r.min))), coverimg, nil, ZP);
 }
 
 void
@@ -612,6 +614,8 @@
 {
 	char aux[64];
 
+	snprint(aux, sizeof aux, "%s/%s", assetdir, "vfx/battleship.png");
+	coverimg = readpngimage(aux);
 	snprint(aux, sizeof aux, "%s/%s", assetdir, "vfx/hit.png");
 	spritetab[VFXHit] = readpngsprite(aux, ZP, Rect(0, 0, 32, 32), 12, 100);
 	snprint(aux, sizeof aux, "%s/%s", assetdir, "vfx/miss.png");
--- a/fns.h
+++ b/fns.h
@@ -40,6 +40,7 @@
  */
 Sprite *newsprite(Image*, Point, Rectangle, int, ulong);
 Sprite *readsprite(char*, Point, Rectangle, int, ulong);
+Image *readpngimage(char*);
 Sprite *readpngsprite(char*, Point, Rectangle, int, ulong);
 void delsprite(Sprite*);
 
--- a/sprite.c
+++ b/sprite.c
@@ -90,27 +90,44 @@
 	close(pfd[1]);
 
 	execl("/bin/png", "png", "-t9", nil);
-	threadexitsall("execl: %r");
+	sysfatal("execl: %r");
 }
 
-Sprite *
-readpngsprite(char *sheetfile, Point sp, Rectangle r, int nframes, ulong period)
+Image *
+readpngimage(char *path)
 {
-	Image *sheet;
+	Image *i;
 	int fd, pfd[3];
 
 	if(pipe(pfd) < 0)
 		sysfatal("pipe: %r");
-	fd = open(sheetfile, OREAD);
+	fd = open(path, OREAD);
 	if(fd < 0)
-		sysfatal("readpngsprite: %r");
+		sysfatal("open: %r");
 	pfd[2] = fd;
-	procrfork(decproc, pfd, mainstacksize, RFFDG|RFNAMEG|RFNOTEG);
-	close(pfd[1]);
-	sheet = readimage(display, pfd[0], 1);
-	close(pfd[0]);
-	close(fd);
+	switch(fork()){
+	case -1:
+		sysfatal("fork: %r");
+	case 0:
+		decproc(pfd);
+	default:
+		close(pfd[1]);
+		i = readimage(display, pfd[0], 1);
+		close(pfd[0]);
+		close(fd);
+	}
 
+	return i;
+}
+
+Sprite *
+readpngsprite(char *sheetfile, Point sp, Rectangle r, int nframes, ulong period)
+{
+	Image *sheet;
+
+	sheet = readpngimage(sheetfile);
+	if(sheet == nil)
+		sysfatal("readpngimage: %r");
 	return newsprite(sheet, sp, r, nframes, period);
 }