shithub: battleship

Download patch

ref: 3d93e42d0e854a3bb7c3a380a0635cf927d59ab7
parent: e0c574f246597d2ad865bea66073903b0e6d990a
author: rodri <rgl@antares-labs.eu>
date: Wed Aug 30 12:18:39 EDT 2023

added new cursors and their switching.

--- a/bts.c
+++ b/bts.c
@@ -11,6 +11,19 @@
 
 int debug;
 
+Cursor patrolcursor = {
+	{0, 0},
+	{ 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x80,
+	  0x06, 0x80, 0x06, 0xc0, 0x0e, 0xe0, 0x1e, 0xf0,
+	  0x1f, 0xf8, 0x3f, 0x00, 0x01, 0x00, 0x41, 0x02,
+	  0x7f, 0xfe, 0x7f, 0xfc, 0x3f, 0xf8, 0x00, 0x00,
+	},
+	{ 0x03, 0x80, 0x06, 0x80, 0x04, 0xc0, 0x0c, 0x40,
+	  0x09, 0x60, 0x19, 0x30, 0x31, 0x18, 0x21, 0x0c,
+	  0x60, 0x04, 0x40, 0xfc, 0xfe, 0x87, 0xbe, 0xfd,
+	  0x80, 0x01, 0x80, 0x03, 0xc0, 0x06, 0x7f, 0xfc,
+	},
+};
 Cursor waitcursor = {
 	{0, 0},
 	{ 0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x07, 0xe0,
@@ -24,21 +37,33 @@
 	  0x0a, 0x50, 0x16, 0x68, 0x20, 0x04, 0x3f, 0xfc,
 	}
 };
+Cursor boxcursor = {
+	{-7, -7},
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	  0xFF, 0xFF, 0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F,
+	  0xF8, 0x1F, 0xF8, 0x1F, 0xF8, 0x1F, 0xFF, 0xFF,
+	  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+	},
+	{ 0x00, 0x00, 0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE,
+	  0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E,
+	  0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E, 0x70, 0x0E,
+	  0x7F, 0xFE, 0x7F, 0xFE, 0x7F, 0xFE, 0x00, 0x00
+	}
+};
 Cursor aimcursor = {
 	{-7, -7},
-	{ 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
-	  0x03, 0xC0, 0x03, 0xC0, 0xFF, 0xFF, 0xFF, 0xFF,
-	  0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0xC0, 0x03, 0xC0,
-	  0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0, 0x03, 0xC0,
+	{ 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0xfb, 0xdf,
+	  0xf3, 0xcf, 0xe3, 0xc7, 0xff, 0xff, 0xff, 0xff,
+	  0xff, 0xff, 0xff, 0xff, 0xe3, 0xc7, 0xf3, 0xcf,
+	  0x7b, 0xdf, 0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8,
 	},
-	{ 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
-	  0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x7F, 0xFE,
-	  0x7F, 0xFE, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80,
-	  0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00,
+	{ 0x00, 0x00, 0x0f, 0xf0, 0x31, 0x8c, 0x21, 0x84,
+	  0x41, 0x82, 0x41, 0x82, 0x41, 0x82, 0x7f, 0xfe,
+	  0x7f, 0xfe, 0x41, 0x82, 0x41, 0x82, 0x41, 0x82,
+	  0x21, 0x84, 0x31, 0x8c, 0x0f, 0xf0, 0x00, 0x00,
 	}
 };
 
-
 char deffont[] = "/lib/font/bit/pelm/unicode.9.font";
 char winspec[32];
 Channel *drawchan;
@@ -122,6 +147,17 @@
 	);
 }
 
+void
+csetcursor(Mousectl *mc, Cursor *c)
+{
+	static Cursor *oc;
+
+	if(c == oc)
+		return;
+	setcursor(mc, c);
+	oc = c;
+}
+
 Image *
 gettileimage(int type)
 {
@@ -357,34 +393,34 @@
 confirmdone(Mousectl *mc)
 {
 	/* thanks sigrid! */
-	Cursor yousure = {
+	Cursor anchor = {
 		{0, 0},
-		{ 0xf7, 0xfe, 0x15, 0x54, 0x1d, 0x54, 0x09, 0x54,
-		  0x09, 0xdc, 0x00, 0x00, 0x75, 0x77, 0x45, 0x54,
-		  0x75, 0x66, 0x15, 0x54, 0x77, 0x57, 0x00, 0x00,
-		  0x00, 0x02, 0x2a, 0x84, 0x11, 0x28, 0x2a, 0x90,
+		{ 0x00, 0x00, 0x00, 0x1e, 0x01, 0x92, 0x30, 0xd2,
+		  0x70, 0x7e, 0x60, 0x70, 0x40, 0xf8, 0x41, 0xcc,
+		  0x43, 0x84, 0x47, 0x00, 0x4e, 0x00, 0x5c, 0x00,
+		  0x78, 0x18, 0x70, 0x38, 0x7f, 0xf0, 0x00, 0x00,
 		},
-		{ 0xea, 0x2b, 0xea, 0xab, 0xe2, 0xab, 0xf6, 0xab,
-		  0xf6, 0x23, 0xff, 0xff, 0x8a, 0x88, 0xba, 0xab,
-		  0x8a, 0x99, 0xea, 0xab, 0x88, 0xa8, 0xff, 0xff,
-		  0xff, 0xfd, 0xd5, 0x7b, 0xee, 0xd7, 0xd5, 0x6f,
-		}
+		{ 0x00, 0x3f, 0x03, 0xe1, 0x7a, 0x6d, 0xcb, 0x2d,
+		  0x89, 0x81, 0x99, 0x8f, 0xb3, 0x07, 0xa6, 0x33,
+		  0xac, 0x7a, 0xb8, 0xce, 0xb1, 0x80, 0xa3, 0x3c,
+		  0x86, 0x64, 0x8f, 0xc4, 0x80, 0x0c, 0xff, 0xf8,
+		},
 	};
-	setcursor(mc, &yousure);
+	csetcursor(mc, &anchor);
 	while(mc->buttons == 0)
 		readmouse(mc);
 	if(mc->buttons != 4){
-		setcursor(mc, nil);
+		csetcursor(mc, nil);
 		return 0;
 	}
 	while(mc->buttons){
 		if(mc->buttons != 4){
-			setcursor(mc, nil);
+			csetcursor(mc, nil);
 			return 0;
 		}
 		readmouse(mc);
 	}
-	setcursor(mc, nil);
+	csetcursor(mc, nil);
 	return 1;
 }
 
@@ -524,6 +560,11 @@
 	if(game.state == Outlaying && curship != nil){
 		newbbox = mkshipbbox(toboard(&localboard, mc->xy), curship->orient, curship->ncells);
 
+		if(ptinrect(mc->xy, localboard.bbox))
+			csetcursor(mctl, &boxcursor);
+		else
+			csetcursor(mctl, nil);
+
 		if(rectinrect(newbbox, localboard.bbox) && !rectXarmada(newbbox)){
 			curship->p = toboard(&localboard, mc->xy);
 			curship->bbox = newbbox;
@@ -533,9 +574,9 @@
 
 	if(game.state == Playing)
 		if(ptinrect(mc->xy, alienboard.bbox))
-			setcursor(mctl, &aimcursor);
+			csetcursor(mctl, &aimcursor);
 		else
-			setcursor(mctl, nil);
+			csetcursor(mctl, nil);
 
 	switch(mc->buttons){
 	case 1:
@@ -647,11 +688,12 @@
 			game.state = Outlaying;
 			curship = &armada[0];
 		}
+		csetcursor(mctl, &patrolcursor);
 		break;
 	case Outlaying:
 		if(strcmp(cmd, "wait") == 0){
 			game.state = Waiting;
-			setcursor(mctl, &waitcursor);
+			csetcursor(mctl, &waitcursor);
 		}else if(strcmp(cmd, "play") == 0)
 			game.state = Playing;
 		break;
@@ -658,7 +700,7 @@
 	case Playing:
 		if(strcmp(cmd, "wait") == 0){
 			game.state = Waiting;
-			setcursor(mctl, &waitcursor);
+			csetcursor(mctl, &waitcursor);
 		}else if(strcmp(cmd, "hit") == 0)
 			settile(&alienboard, lastshot, Thit);
 		else if(strcmp(cmd, "miss") == 0)
@@ -667,7 +709,7 @@
 	case Waiting:
 		if(strcmp(cmd, "play") == 0){
 			game.state = Playing;
-			setcursor(mctl, nil);
+			csetcursor(mctl, nil);
 		}else if(strncmp(cmd, "hit", 3) == 0){
 			cell = coords2cell(cmd+4);
 			for(i = 0; i < nelem(armada); i++)
@@ -788,6 +830,7 @@
 	initboards();
 	initarmada();
 	game.state = Waiting0;
+	csetcursor(mctl, &patrolcursor);
 
 	drawchan = chancreate(sizeof(void*), 0);
 	ingress = chancreate(sizeof(char*), 1);