ref: e0c574f246597d2ad865bea66073903b0e6d990a
parent: b106a4c0a8e8fc1bedce0a25a5c9a7be4a1c06a2
author: rodri <rgl@antares-labs.eu>
date: Wed Aug 30 07:47:43 EDT 2023
change the cursor based on game state (waiting and playing).
--- a/bts.c
+++ b/bts.c
@@ -11,10 +11,39 @@
int debug;
+Cursor waitcursor = {
+ {0, 0},
+ { 0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x07, 0xe0,
+ 0x07, 0xe0, 0x07, 0xe0, 0x03, 0xc0, 0x0f, 0xf0,
+ 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8, 0x1f, 0xf8,
+ 0x0f, 0xf0, 0x1f, 0xf8, 0x3f, 0xfc, 0x3f, 0xfc,
+ },
+ { 0x01, 0x80, 0x03, 0xc0, 0x07, 0xe0, 0x04, 0x20,
+ 0x04, 0x20, 0x06, 0x60, 0x02, 0x40, 0x0c, 0x30,
+ 0x10, 0x08, 0x14, 0x08, 0x14, 0x28, 0x12, 0x28,
+ 0x0a, 0x50, 0x16, 0x68, 0x20, 0x04, 0x3f, 0xfc,
+ }
+};
+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,
+ },
+ { 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,
+ }
+};
+
+
char deffont[] = "/lib/font/bit/pelm/unicode.9.font";
char winspec[32];
Channel *drawchan;
Channel *ingress, *egress;
+Mousectl *mctl; /* only used to update the cursor */
RFrame worldrf;
Image *screenb;
Image *tiletab[NTILES];
@@ -327,6 +356,7 @@
int
confirmdone(Mousectl *mc)
{
+ /* thanks sigrid! */
Cursor yousure = {
{0, 0},
{ 0xf7, 0xfe, 0x15, 0x54, 0x1d, 0x54, 0x09, 0x54,
@@ -416,7 +446,7 @@
curship->bbox = mkshipbbox(curship->p, curship->orient, curship->ncells);
/* steer it, captain! don't let it go off-board! */
- if(!rectinrect(curship->bbox, localboard.bbox))
+ if(!rectinrect(curship->bbox, localboard.bbox)){
switch(curship->orient){
case OH:
curship->bbox.min.x -= curship->bbox.max.x-localboard.bbox.max.x;
@@ -428,7 +458,9 @@
break;
}
curship->p = toboard(&localboard, curship->bbox.min);
-
+ moveto(mc, addpt(screen->r.min, curship->bbox.min));
+ }
+ /* …nor ram allied ships! */
if(rectXarmada(curship->bbox))
curship->bbox = ZR;
}
@@ -495,10 +527,16 @@
if(rectinrect(newbbox, localboard.bbox) && !rectXarmada(newbbox)){
curship->p = toboard(&localboard, mc->xy);
curship->bbox = newbbox;
+ send(drawchan, nil);
}
- send(drawchan, nil);
}
+ if(game.state == Playing)
+ if(ptinrect(mc->xy, alienboard.bbox))
+ setcursor(mctl, &aimcursor);
+ else
+ setcursor(mctl, nil);
+
switch(mc->buttons){
case 1:
lmb(mc);
@@ -611,23 +649,26 @@
}
break;
case Outlaying:
- if(strcmp(cmd, "wait") == 0)
+ if(strcmp(cmd, "wait") == 0){
game.state = Waiting;
- else if(strcmp(cmd, "play") == 0)
+ setcursor(mctl, &waitcursor);
+ }else if(strcmp(cmd, "play") == 0)
game.state = Playing;
break;
case Playing:
- if(strcmp(cmd, "wait") == 0)
+ if(strcmp(cmd, "wait") == 0){
game.state = Waiting;
- else if(strcmp(cmd, "hit") == 0)
+ setcursor(mctl, &waitcursor);
+ }else if(strcmp(cmd, "hit") == 0)
settile(&alienboard, lastshot, Thit);
else if(strcmp(cmd, "miss") == 0)
settile(&alienboard, lastshot, Tmiss);
break;
case Waiting:
- if(strcmp(cmd, "play") == 0)
+ if(strcmp(cmd, "play") == 0){
game.state = Playing;
- else if(strncmp(cmd, "hit", 3) == 0){
+ setcursor(mctl, nil);
+ }else if(strncmp(cmd, "hit", 3) == 0){
cell = coords2cell(cmd+4);
for(i = 0; i < nelem(armada); i++)
if(ptinrect(fromboard(&localboard, cell), armada[i].bbox)){
@@ -735,6 +776,8 @@
display->locking = 1;
unlockdisplay(display);
+
+ mctl = in.mc;
screenb = eallocimage(display, rectsubpt(screen->r, screen->r.min), screen->chan, 0, DNofill);
worldrf.p = Pt2(0,0,1);