ref: 8b5dae4088f803b1d40f1a38cdeceb59fc3d1270
parent: 26c869c7b582570ece8753db24a76db46b0ea3ea
author: mkf <mkf@cloud9p.org>
date: Thu May 23 11:42:18 EDT 2024
gui9net: so long...
--- a/gui9net.c
+++ /dev/null
@@ -1,404 +1,0 @@
-#include <u.h>
-#include <libc.h>
-#include <draw.h>
-#include <event.h>
-#include "netclient.h"
-#include "engine.h"
-
-Font *font;
-
-Image *gl; /* glenda */
-Image *glm; /* glenda's mask */
-Image *cc; /* clicked */
-Image *ec; /* empty; not clicked */
-Image *bg;
-Image *lost;
-Image *won;
-
-int debug;
-char *server = nil;
-enum
-{
- New = 0,
- Undo,
- Restart,
- Exit,
-
- Border = 3,
-};
-
-char *mbuttons[] =
-{
- "Easy",
- "Medium",
- "Hard",
- "Impossible",
- 0
-};
-
-char *rbuttons[] =
-{
- "New",
- "Undo",
- "Reset",
- "Exit",
- 0
-};
-
-Menu mmenu =
-{
- mbuttons,
-};
-
-Menu rmenu =
-{
- rbuttons,
-};
-
-Image *
-eallocimage(Rectangle r, int repl, uint color)
-{
- Image *tmp;
-
- tmp = allocimage(display, r, screen->chan, repl, color);
- if(tmp == nil)
- sysfatal("cannot allocate buffer image: %r");
-
- return tmp;
-}
-
-Image *
-eloadfile(char *path)
-{
- Image *img;
- int fd;
-
- fd = open(path, OREAD);
- if(fd < 0) {
- fprint(2, "cannot open image file %s: %r\n", path);
- exits("image");
- }
- img = readimage(display, fd, 0);
- if(img == nil)
- sysfatal("cannot load image: %r");
- close(fd);
-
- return img;
-}
-
-void
-allocimages(void)
-{
- Rectangle one = Rect(0, 0, 1, 1);
-
- cc = eallocimage(one, 1, DGreyblue);
- ec = eallocimage(one, 1, DPalebluegreen);
- bg = eallocimage(one, 1, DPaleyellow);
- lost = eallocimage(one, 1, DRed);
- won = eallocimage(one, 1, DPalegreen);
- gl = eloadfile("/lib/face/48x48x4/g/glenda.1");
-
- glm = allocimage(display, Rect(0, 0, 48, 48), gl->chan, 1, DCyan);
- if(glm == nil)
- sysfatal("cannot allocate mask: %r");
-
- draw(glm, glm->r, display->white, nil, ZP);
- gendraw(glm, glm->r, display->black, ZP, gl, gl->r.min);
- freeimage(gl);
- gl = display->black;
-
-
-}
-
-Point
-pix2board(int x, int y)
-{
- float d, rx, ry, yh;
- int ny, nx;
-
- /* XXX: float→int causes small rounding errors */
-
- d = (float)(Dx(screen->r) > Dy(screen->r)) ? Dy(screen->r) -20: Dx(screen->r)-20;
- rx = d/(float)SzX;
- rx = rx/2.0;
- ry =d/(float)SzY;
- ry = ry/2.0;
-
- yh = ry/3.73205082;
-
- /* reverse board2pix() */
- ny = (int)(((float)y - ry)/(2*ry - ((y>2*ry)?yh:0.0)) + 0.5); /* ny = (y - ry)/(2ry-yh) */
- nx = (int)(((float)x - rx - (ny%2?rx:0.0))/(rx*2.0) + 0.5); /* nx = (x - rx - rx)/2rx */
-
- if (nx >= SzX)
- nx = SzX-1;
- if (ny >=SzY)
- ny = SzY-1;
-
- return Pt(nx, ny);
-}
-
-/* unnecessary calculations here, but it's fine */
-Point
-board2pix(int x, int y)
-{
- float d, rx, ry, yh;
- int nx, ny;
-
- d = (float)(Dx(screen->r) > Dy(screen->r)) ? Dy(screen->r) -20 : Dx(screen->r) -20;
- rx = d/(float)SzX;
- rx = rx/2.0;
- ry = d/(float)SzY;
- ry = ry/2.0;
-
- yh = ry/3.73205082;
-
- nx = (int)((float)x*rx*2.0+rx +(y%2?rx:0.0)); /* nx = x*(2rx) + rx + rx (conditional) */
- ny = (int)((float)y*(ry*2.0-(y>0?yh:0.0)) + ry); /* ny = y*(2ry-yh) +ry */
- return Pt(nx, ny);
-}
-
-void
-drawlevel(void)
-{
- Point p;
- int x, y, rx, ry, d;
- char *s = nil;
-
- if(state == Won)
- draw(screen, screen->r, won, nil, ZP);
- else if(state == Lost)
- draw(screen, screen->r, lost, nil, ZP);
- else
- draw(screen, screen->r, bg, nil, ZP);
-
- d = (Dx(screen->r) > Dy(screen->r)) ? Dy(screen->r) -20: Dx(screen->r) -20;
- rx = (int)ceil((float)(d-2*Border)/(float)SzX)/2;
- ry = (int)ceil((float)(d-2*Border)/(float)SzY)/2;
-
- for(x = 0; x < SzX; x++) {
- for(y = 0; y < SzY; y++)
- {
- p = board2pix(x, y);
- switch(grid[x][y])
- {
- case Wall:
- fillellipse(screen, addpt(screen->r.min, p), rx, ry, cc, ZP);
- break;
- case Glenda:
- p = addpt(screen->r.min, p);
- fillellipse(screen, p, rx, ry, ec, ZP);
- p = subpt(p, Pt(24, 24));
- draw(screen, Rpt(p, addpt(p, Pt(48, 48))), gl, glm, ZP);
- break;
- default:
- fillellipse(screen, addpt(screen->r.min, p), rx, ry, ec, ZP);
- USED(s);
- if(debug)
- {
- s = smprint("%d", grid[x][y]);
- string(screen, addpt(screen->r.min, p), display->black, ZP, font, s);
- free(s);
- }
-
- break;
- }
- }
- }
- flushimage(display, 1);
-}
-void
-move(Point m)
-{
- int dir;
- Point g, p, nm;
-
- nm = subpt(m, screen->r.min);
-
- /* figure out where the click falls */
- p = pix2board(nm.x, nm.y);
- g = findglenda();
-
- dir = pointdir(g, p);
-
- if(grid[p.x][p.y] >= 999 || dir == Err)
- return;
-
- /* find the direction to p from our currently pos, then move */
- domove(dir);
-}
-
-void
-put(Point m)
-{
- Point p, nm;
-
- nm = subpt(m, screen->r.min);
-
- /* figure out where the click falls */
- p = pix2board(nm.x, nm.y);
-
- if(grid[p.x][p.y] >= 999)
- return;
-
- doput(p);
-}
-
-void
-resize(void)
-{
- int fd, size = (Dx(screen->r) > Dy(screen->r)) ? Dy(screen->r) + 20 : Dx(screen->r)+20;
-
- fd = open("/dev/wctl", OWRITE);
- if(fd >= 0)
- {
- fprint(fd, "resize -dx %d -dy %d", size, size);
- close(fd);
- }
-}
-
-void
-eresized(int new)
-{
- if(new && getwindow(display, Refnone) < 0)
- sysfatal("can't reattach to window");
-
- drawlevel();
-}
-
-void
-usage(void)
-{
- fprint(2, "usage: %s [-dg] [-n server]\n", argv0);
- exits("usage");
-}
-
-void
-main(int argc, char **argv)
-{
- Mouse m;
- Event ev;
- Netmsg *msg;
- int e, mousedown=0;
-
- /* todo, add flags for human playing */
- ARGBEGIN{
- case 'D':
- debug++;
- break;
- case 'd':
- //ptype[0] = Computer /* todo */
- sysfatal("No computer player for defenders yet");
- break;
- case 'g':
- ptype[1] = Computer;
- break;
- case 'n':
- ptype[0] = Net;
- ptype[1] = Net;
- networked = 1;
- server = EARGF(usage());
- break;
- default:
- usage();
- }ARGEND
- if(initdraw(nil, nil, "glendy") < 0)
- sysfatal("initdraw failed: %r");
- einit(Emouse);
-
- if(server != nil && networked)
- {
- srvfd = dial(server, nil, nil, nil);
- if(srvfd < 0)
- sysfatal("unable to connect: %r");
- }
-
- resize();
-
- srand(time(0));
-
- allocimages();
-
- if(networked)
- {
- netmain(); /* CONN */
- netmain(); /* SYNC */
- netmain(); /* TURN/WAIT */
- }
- else
- initlevel(); /* must happen before "eresized" */
- eresized(0);
- for(;;)
- {
- if(networked && waitbit && isplaying)
- {
- msg = netmain();
- if(msg->tokens[0] != nil && strcmp(msg->tokens[0], "SYNC"))
- drawlevel();
- }
- e = event(&ev);
- switch(e)
- {
- case Emouse:
- m = ev.mouse;
- if(m.buttons == 0)
- {
- if(mousedown && isplaying)
- {
- mousedown = 0;
- if(turn % 2 == 0)
- put(m.xy);
- else
- move(m.xy);
- if(!networked)
- drawlevel();
- }
- }
- if(m.buttons&1)
- {
- mousedown = 1;
- }
- if(m.buttons&2)
- {
- switch(emenuhit(2, &m, &mmenu))
- {
- case 0:
- difficulty = DEasy;
- initlevel();
- break;
- case 1:
- difficulty = DMed;
- initlevel();
- break;
- case 2:
- difficulty = DHard;
- initlevel();
- break;
- case 3:
- difficulty = DImp;
- initlevel();
- break;
- }
- drawlevel();
- }
- if(m.buttons&4) {
- switch(emenuhit(3, &m, &rmenu))
- {
- case New:
- initlevel();
- break;
- case Undo:
- undo();
- break;
- case Restart:
- restart();
- break;
- case Exit:
- exits(nil);
- }
- drawlevel();
- }
- break;
- }
- }
-}