ref: 02341a2305a07f7551c52464ed0da810bf9942e4
parent: 77536ac40b44c210f01141a3722104550a937cbe
author: qwx <qwx@sciops.net>
date: Sat Mar 1 21:24:53 EST 2025
remove stuff now in fork repo
--- a/doom-chat
+++ /dev/null
@@ -1,38 +1,0 @@
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/hu_lib.c
-+++ b/sys/src/games/doom/hu_lib.c
-@@ -320,7 +320,7 @@
- unsigned char ch )
- {
-
-- if (ch >= ' ' && ch <= '_')
-+ if (ch >= ' ' && ch < '~')
- HUlib_addCharToTextLine(&it->l, (char) ch);
- else
- if (ch == KEY_BACKSPACE)
---- a/sys/src/games/doom/hu_stuff.c
-+++ b/sys/src/games/doom/hu_stuff.c
-@@ -535,10 +535,10 @@
- return false;
- }
- /* no break */
-- case ev_char:
-- break;
- default:
- return false;
-+ case ev_char:
-+ break;
- }
-
- if (!chat_on)
---- a/sys/src/games/doom/i_video.c
-+++ b/sys/src/games/doom/i_video.c
-@@ -290,7 +290,7 @@
- case 'c':
- chartorune(&r, buf+1);
- if(r){
-- e.data1 = r;
-+ e.data1 = runetokey(r);
- e.type = ev_char;
- D_PostEvent(&e);
- }
--- a/doom-iwad
+++ /dev/null
@@ -1,35 +1,0 @@
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/d_main.c
-+++ b/sys/src/games/doom/d_main.c
-@@ -578,6 +578,7 @@
- //
- void IdentifyVersion (void)
- {
-+ int p;
- char *wadfile, *slash;
-
- if (M_CheckParm ("-shdev"))
-@@ -623,7 +624,22 @@
- */
- }
-
-- if ( (wadfile = I_IdentifyWAD("doom2f.wad")) ) {
-+ p = M_CheckParm ("-iwad");
-+ if (p && p < myargc-1 && (wadfile = I_IdentifyWAD(myargv[p+1])) )
-+ {
-+ p = M_CheckParm ("-gamemode");
-+ gamemode = commercial;
-+ if (p && p < myargc-1)
-+ {
-+ if (!strcmp(myargv[p+1], "ultimate"))
-+ gamemode = retail;
-+ else if (!strcmp(myargv[p+1], "registered"))
-+ gamemode = registered;
-+ else if (!strcmp(myargv[p+1], "shareware"))
-+ gamemode = shareware;
-+ }
-+ D_AddFile (wadfile);
-+ } else if ( (wadfile = I_IdentifyWAD("doom2f.wad")) ) {
- gamemode = commercial;
- // C'est ridicule!
- // Let's handle languages in config files, okay?
--- a/doom-mousegrab
+++ /dev/null
@@ -1,32 +1,0 @@
-doom: re-center mouse more often to limit it escaping
-
-when a mouse motion reaches grabout's limits without crossing them, a following
-event in which the mouse passes the remaining distance between grabout and the
-window's limits will have the mouse jump out of the window.
-this happens too frequently on terminals with a good drawing speed.
-
-to reduce this, make grabout smaller, so that the distance to cross in one
-event is larger. Dx(screen->r)/4 is sufficient for the terminals i have tested
-this on.
-
-diff d5938c597328adb8abb8785b4ac820ca0f094b6b uncommitted
---- a/sys/src/games/doom/i_video.c
-+++ b/sys/src/games/doom/i_video.c
-@@ -44,7 +44,7 @@
- draw(screen, screen->r, display->black, nil, ZP);
-
- center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
-- grabout = insetrect(screen->r, Dx(screen->r)/8);
-+ grabout = insetrect(screen->r, Dx(screen->r)/4);
-
- kbdpid = proccreate(kbdproc, nil, 4096);
- mousepid = proccreate(mouseproc, nil, 4096);
-@@ -152,7 +152,7 @@
- draw(screen, screen->r, display->black, nil, ZP);
-
- center = addpt(screen->r.min, Pt(Dx(screen->r)/2, Dy(screen->r)/2));
-- grabout = insetrect(screen->r, Dx(screen->r)/8);
-+ grabout = insetrect(screen->r, Dx(screen->r)/4);
- }
-
- if(conv == nil){
--- a/doom-skywallhit
+++ /dev/null
@@ -1,76 +1,0 @@
-bullet puffs and plasma splashes don't spawn, and rockets don't explode,
-when fired against a linedef bridging two sectors of differing heights but
-with a sky texture. example: ultimate doom e4m6: fire at the green
-structure surrounded by a moat of lava outside, or at the moat's walls.
-the "sky hack" is meant to show the sky (in this particular configuration)
-rather than a texture, and to make projectiles disappear when fired at this
-"sky". however, the check for the wall's attributes and the projectiles
-coordinates is wrong.
-this patches fixes that. however, it affects gameplay, and as such, demos
-will desync anytime this mechanism is encountered. it is therefore turned
-off by default.
-not sure if this should be merged.
-TODO: better explanation, more testing
-
-diff -Naur a/sys/src/games/doom/d_main.c b/sys/src/games/doom/d_main.c
---- a/sys/src/games/doom/d_main.c Sun Aug 2 19:57:59 2015
-+++ b/sys/src/games/doom/d_main.c Fri Aug 21 15:09:01 2015
-@@ -94,6 +94,8 @@
- boolean noztele;
- boolean nobounce;
-
-+/* demo breaking bug fixes */
-+boolean noskyabs;
-
- //extern int soundVolume;
- //extern int sfxVolume;
-@@ -743,6 +745,8 @@
- noztele = 1;
- if (M_CheckParm ("-nobounce") && (gamemode == commercial || gamemode == registered))
- nobounce = 1;
-+ if (M_CheckParm ("-noskyabs"))
-+ noskyabs = 1;
- if (M_CheckParm ("-altdeath"))
- deathmatch = 2;
- else if (M_CheckParm ("-deathmatch"))
-diff -Naur a/sys/src/games/doom/p_local.h b/sys/src/games/doom/p_local.h
---- a/sys/src/games/doom/p_local.h Sun Aug 2 19:57:59 2015
-+++ b/sys/src/games/doom/p_local.h Fri Aug 21 15:05:02 2015
-@@ -62,6 +62,7 @@
-
- extern boolean noztele;
- extern boolean nobounce;
-+extern boolean noskyabs;
-
-
- //
-diff -Naur a/sys/src/games/doom/p_map.c b/sys/src/games/doom/p_map.c
---- a/sys/src/games/doom/p_map.c Mon Jul 27 20:08:20 2015
-+++ b/sys/src/games/doom/p_map.c Fri Aug 21 15:10:30 2015
-@@ -958,7 +958,8 @@
- return false;
-
- // it's a sky hack wall
-- if (li->backsector && li->backsector->ceilingpic == skyflatnum)
-+ if (li->backsector != nil && li->backsector->ceilingpic == skyflatnum
-+ && (!noskyabs || z > li->backsector->ceilingheight))
- return false;
- }
-
-diff -Naur a/sys/src/games/doom/p_mobj.c b/sys/src/games/doom/p_mobj.c
---- a/sys/src/games/doom/p_mobj.c Sun Aug 2 19:57:59 2015
-+++ b/sys/src/games/doom/p_mobj.c Fri Aug 21 15:03:11 2015
-@@ -173,9 +173,10 @@
- else if (mo->flags & MF_MISSILE)
- {
- // explode a missile
-- if (ceilingline &&
-- ceilingline->backsector &&
-- ceilingline->backsector->ceilingpic == skyflatnum)
-+ if (ceilingline != nil &&
-+ ceilingline->backsector != nil &&
-+ ceilingline->backsector->ceilingpic == skyflatnum &&
-+ (!noskyabs || mo->z > ceilingline->backsector->ceilingheight))
- {
- // Hack to prevent missiles exploding
- // against the sky.
--- a/doom-spy
+++ /dev/null
@@ -1,57 +1,0 @@
-diff -Naur a/sys/src/games/doom/g_game.c b/sys/src/games/doom/g_game.c
---- a/sys/src/games/doom/g_game.c Mon Aug 31 01:13:18 2015
-+++ b/sys/src/games/doom/g_game.c Wed Sep 16 08:16:55 2015
-@@ -510,6 +510,9 @@
- displayplayer++;
- if (displayplayer == MAXPLAYERS)
- displayplayer = 0;
-+ /* FIXME */
-+ extern player_t *plyr;
-+ plyr = &players[displayplayer];
- } while (!playeringame[displayplayer] && displayplayer != consoleplayer);
- return true;
- }
-diff -Naur a/sys/src/games/doom/s_sound.c b/sys/src/games/doom/s_sound.c
---- a/sys/src/games/doom/s_sound.c Sun Jul 29 23:01:33 2012
-+++ b/sys/src/games/doom/s_sound.c Wed Sep 16 08:16:08 2015
-@@ -38,6 +38,7 @@
-
- #include "doomstat.h"
-
-+extern player_t *plyr;
-
- // Purpose?
- const char snd_prefixen[]
-@@ -281,16 +282,16 @@
-
- // Check to see if it is audible,
- // and if not, modify the params
-- if (origin && origin != players[consoleplayer].mo)
-+ if (origin && origin != plyr->mo)
- {
-- rc = S_AdjustSoundParams(players[consoleplayer].mo,
-+ rc = S_AdjustSoundParams(plyr->mo,
- origin,
- &volume,
- &sep,
- &pitch);
-
-- if ( origin->x == players[consoleplayer].mo->x
-- && origin->y == players[consoleplayer].mo->y)
-+ if ( origin->x == plyr->mo->x
-+ && origin->y == plyr->mo->y)
- {
- sep = NORM_SEP;
- }
-diff -Naur a/sys/src/games/doom/st_stuff.c b/sys/src/games/doom/st_stuff.c
---- a/sys/src/games/doom/st_stuff.c Mon Aug 17 23:00:05 2015
-+++ b/sys/src/games/doom/st_stuff.c Wed Sep 16 08:14:48 2015
-@@ -264,7 +264,7 @@
-
-
- // main player in game
--static player_t* plyr;
-+player_t* plyr;
-
- // ST_Start() has just been called
- static boolean st_firsttime;
--- a/doom-udpip
+++ /dev/null
@@ -1,462 +1,0 @@
-diff 790a516884e45ee2a3a11b915f5e125a0ccb02ca uncommitted
---- a/sys/src/games/doom/i_net.c
-+++ b/sys/src/games/doom/i_net.c
-@@ -20,142 +20,296 @@
- //
- //-----------------------------------------------------------------------------
-
--static const char
--rcsid[] = "$Id: m_bbox.c,v 1.1 1997/02/03 22:45:10 b1 Exp $";
--
- #include "doomdef.h"
- #include "doomstat.h"
--
--// #include "i_system.h"
--// #include "d_event.h"
--#include "d_net.h"
-+#include <bio.h>
-+#include <ndb.h>
-+#include <ip.h>
-+#include <thread.h>
- #include "m_argv.h"
--
-+#include "i_system.h"
-+#include "d_net.h"
- #include "i_net.h"
-+#include "w_wad.h"
-
-+typedef struct Addr Addr;
-
--//
--// I_InitNetwork
--//
--void I_InitNetwork (void)
-+enum{
-+ HDRSZ = 16+16+16+2+2 /* sizeof Udphdr w/o padding */
-+};
-+
-+static char lsrv[6] = "666";
-+
-+struct Addr{
-+ Udphdr h;
-+ char srv[6]; /* convenience */
-+ int ready; /* is connected to udp!*!lsrv */
-+ long called;
-+};
-+static Addr raddr[MAXNETNODES];
-+
-+static int ucfd;
-+static int udfd;
-+static int upfd[2];
-+static int upid;
-+
-+
-+static void
-+conreq(doomdata_t *d)
- {
--printf("PORTME i_net.c I_InitNetwork (use 9P)\n");
-+ int fd;
-+ long t;
-+ char ip[64];
-+ Addr *p;
-
-- doomcom = malloc (sizeof(*doomcom));
-- memset (doomcom, 0, sizeof(*doomcom));
-+ p = &raddr[doomcom->remotenode];
-
-- /* set up for network */
-- doomcom->ticdup = 1;
-- doomcom->extratics = 0;
-+ t = time(nil);
-+ if(t - p->called < 1)
-+ return;
-
--// netsend = PacketSend;
--// netget = PacketGet;
--// netgame = true;
-+ snprint(ip, sizeof ip, "%I", p->h.raddr);
-+ if((fd = dial(netmkaddr(ip, "udp", p->srv), lsrv, nil, nil)) < 0)
-+ sysfatal("dial: %r");
-+ if(write(fd, d, doomcom->datalength) != doomcom->datalength)
-+ sysfatal("conreq: %r");
-+ close(fd);
-+ p->called = t;
-+}
-
-- /* parse player number and host list */
--// doomcom->consoleplayer = myargv[i+1][0]-'1';
-+static void
-+dsend(void)
-+{
-+ int i;
-+ uchar buf[HDRSZ+sizeof(doomdata_t)];
-+ doomdata_t d;
-
-- doomcom->numnodes = 1; // this node for sure
-+ hnputl(&d.checksum, netbuffer->checksum);
-+ d.player = netbuffer->player;
-+ d.retransmitfrom = netbuffer->retransmitfrom;
-+ d.starttic = netbuffer->starttic;
-+ d.numtics = netbuffer->numtics;
-
-- doomcom->id = DOOMCOM_ID;
-- doomcom->numplayers = doomcom->numnodes;
-+ for(i = 0; i < netbuffer->numtics; i++){
-+ d.cmds[i].forwardmove = netbuffer->cmds[i].forwardmove;
-+ d.cmds[i].sidemove = netbuffer->cmds[i].sidemove;
-+ hnputs(&d.cmds[i].angleturn, netbuffer->cmds[i].angleturn);
-+ hnputs(&d.cmds[i].consistancy, netbuffer->cmds[i].consistancy);
-+ d.cmds[i].chatchar = netbuffer->cmds[i].chatchar;
-+ d.cmds[i].buttons = netbuffer->cmds[i].buttons;
-+ }
-
--/*
-- boolean trueval = true;
-- int i;
-- int p;
-- struct hostent* hostentry; // host information entry
--
-- doomcom = malloc (sizeof (*doomcom) );
-- memset (doomcom, 0, sizeof(*doomcom) );
--
-- // set up for network
-- i = M_CheckParm ("-dup");
-- if (i && i< myargc-1)
-- {
-- doomcom->ticdup = myargv[i+1][0]-'0';
-- if (doomcom->ticdup < 1)
-- doomcom->ticdup = 1;
-- if (doomcom->ticdup > 9)
-- doomcom->ticdup = 9;
-- }
-- else
-- doomcom-> ticdup = 1;
--
-- if (M_CheckParm ("-extratic"))
-- doomcom-> extratics = 1;
-- else
-- doomcom-> extratics = 0;
--
-- p = M_CheckParm ("-port");
-- if (p && p<myargc-1)
-- {
-- DOOMPORT = atoi (myargv[p+1]);
-- printf ("using alternate port %i\n",DOOMPORT);
-- }
--
-- // parse network game options,
-- // -net <consoleplayer> <host> <host> ...
-- i = M_CheckParm ("-net");
-- if (!i)
-- {
-- // single player game
-- netgame = false;
-- doomcom->id = DOOMCOM_ID;
-- doomcom->numplayers = doomcom->numnodes = 1;
-- doomcom->deathmatch = false;
-- doomcom->consoleplayer = 0;
-- return;
-- }
-+ if(!raddr[doomcom->remotenode].ready){
-+ conreq(&d);
-+ return;
-+ }
-+ memcpy(buf, &raddr[doomcom->remotenode].h, HDRSZ);
-+ memcpy(buf+HDRSZ, &d, sizeof d);
-
-- netsend = PacketSend;
-- netget = PacketGet;
-- netgame = true;
-+ i = doomcom->datalength + HDRSZ;
-+ if(write(udfd, buf, i) != i)
-+ sysfatal("dsend: %r");
-+}
-
-- // parse player number and host list
-- doomcom->consoleplayer = myargv[i+1][0]-'1';
-+static void
-+drecv(void)
-+{
-+ int n;
-+ ushort i;
-+ doomdata_t d;
-
-- doomcom->numnodes = 1; // this node for sure
--
-- i++;
-- while (++i < myargc && myargv[i][0] != '-')
-- {
-- sendaddress[doomcom->numnodes].sin_family = AF_INET;
-- sendaddress[doomcom->numnodes].sin_port = htons(DOOMPORT);
-- if (myargv[i][0] == '.')
-- {
-- sendaddress[doomcom->numnodes].sin_addr.s_addr
-- = inet_addr (myargv[i]+1);
-+ if(filelength(upfd[1]) < 1){
-+ doomcom->remotenode = -1;
-+ return;
- }
-- else
-- {
-- hostentry = gethostbyname (myargv[i]);
-- if (!hostentry)
-- I_Error ("gethostbyname: couldn't find %s", myargv[i]);
-- sendaddress[doomcom->numnodes].sin_addr.s_addr
-- = *(int *)hostentry->h_addr_list[0];
-+ if((n = read(upfd[1], &d, sizeof d)) <= 0
-+ || read(upfd[1], &i, sizeof i) <= 0)
-+ sysfatal("drecv: %r");
-+
-+ doomcom->remotenode = i;
-+ doomcom->datalength = n;
-+
-+ /* FIXME: proper read/write from/to struct */
-+ netbuffer->checksum = nhgetl(&d.checksum);
-+ netbuffer->player = d.player;
-+ netbuffer->retransmitfrom = d.retransmitfrom;
-+ netbuffer->starttic = d.starttic;
-+ netbuffer->numtics = d.numtics;
-+ for(i = 0; i < netbuffer->numtics; i++){
-+ netbuffer->cmds[i].forwardmove = d.cmds[i].forwardmove;
-+ netbuffer->cmds[i].sidemove = d.cmds[i].sidemove;
-+ netbuffer->cmds[i].angleturn = nhgets(&d.cmds[i].angleturn);
-+ netbuffer->cmds[i].consistancy = nhgets(&d.cmds[i].consistancy);
-+ netbuffer->cmds[i].chatchar = d.cmds[i].chatchar;
-+ netbuffer->cmds[i].buttons = d.cmds[i].buttons;
- }
-- doomcom->numnodes++;
-- }
--
-- doomcom->id = DOOMCOM_ID;
-- doomcom->numplayers = doomcom->numnodes;
--*/
- }
-
-+static void
-+uproc(void*)
-+{
-+ int n;
-+ ushort i;
-+ uchar buf[HDRSZ+sizeof(doomdata_t)];
-+ Udphdr h;
-
--void I_NetCmd (void)
-+ upid = getpid();
-+ for(;;){
-+ if((n = read(udfd, buf, sizeof buf)) <= 0)
-+ break;
-+ memcpy(&h, buf, HDRSZ);
-+
-+ for(i = 0; i < doomcom->numnodes; i++)
-+ if(equivip6(h.raddr, raddr[i].h.raddr)
-+ && nhgets(h.rport) == nhgets(raddr[i].h.rport))
-+ break;
-+ if(i == doomcom->numnodes)
-+ continue; /* ignore messages from strangers */
-+ if(!raddr[i].ready){ /* FIXME: urgh */
-+ raddr[i].ready++;
-+ memcpy(&raddr[i].h, &h, sizeof h);
-+ }
-+
-+ if(write(upfd[0], buf+HDRSZ, n - HDRSZ) != n - HDRSZ
-+ || write(upfd[0], &i, sizeof i) != sizeof i)
-+ break;
-+ }
-+}
-+
-+void
-+I_NetCmd(void)
- {
--/*
-- if (doomcom->command == CMD_SEND)
-- {
-- netsend ();
-- }
-- else if (doomcom->command == CMD_GET)
-- {
-- netget ();
-- }
-- else
-- I_Error ("Bad net cmd: %i\n",doomcom->command);
--*/
-+ if(doomcom->command == CMD_SEND)
-+ dsend();
-+ else if(doomcom->command == CMD_GET)
-+ drecv();
-+ else
-+ I_Error("invalid netcmd %d", doomcom->command);
-+}
-+
-+void
-+I_ShutdownNet(void)
-+{
-+ postnote(PNPROC, upid, "shutdown");
-+ close(upfd[0]);
-+ close(upfd[1]);
-+ close(udfd);
-+ close(ucfd);
-+}
-+
-+static void
-+initudp(void)
-+{
-+ char data[64], adir[40];
-+
-+ /* FIXME */
-+ //if(myipaddr(raddr[0].h.raddr, nil) < 0)
-+ // sysfatal("myipaddr: %r");
-+
-+ if((ucfd = announce(netmkaddr("*", "udp", lsrv), adir)) < 0)
-+ sysfatal("announce: %r");
-+ if(fprint(ucfd, "headers") < 0)
-+ sysfatal("failed to set headers mode: %r");
-+ snprint(data, sizeof data, "%s/data", adir);
-+ if((udfd = open(data, ORDWR)) < 0)
-+ sysfatal("open: %r");
-+
-+ if(pipe(upfd) < 0)
-+ sysfatal("pipe: %r");
-+ if(procrfork(uproc, nil, mainstacksize, RFFDG) < 0)
-+ sysfatal("procrfork: %r");
-+}
-+
-+static void
-+csip(char *s, Addr *a) /* raddr!rsrv */
-+{
-+ int fd, n;
-+ char buf[128], *f[3];
-+
-+ /* FIXME: get netmnt... */
-+
-+ if((fd = open("/net/cs", ORDWR)) < 0)
-+ sysfatal("open: %r");
-+
-+ snprint(buf, sizeof buf, "udp!%s", s);
-+ n = strlen(buf);
-+ if(write(fd, buf, n) != n)
-+ sysfatal("translating %s: %r", s);
-+
-+ seek(fd, 0, 0);
-+ if((n = read(fd, buf, sizeof(buf)-1)) <= 0)
-+ sysfatal("reading cs tables: %r");
-+ buf[n] = 0;
-+ close(fd);
-+
-+ if(getfields(buf, f, 3, 1, " !") < 2)
-+ sysfatal("bad cs entry %s", buf);
-+
-+ if(parseip(a->h.raddr, f[1]) < 0)
-+ sysfatal("parseip: %r");
-+ hnputs(a->h.rport, atoi(f[2])); /* FIXME */
-+ strncpy(a->srv, f[2], sizeof(a->srv)-1);
-+}
-+
-+static int
-+netopts(void)
-+{
-+ int i;
-+
-+ if((i = M_CheckParm("-dup")) && i < myargc - 1){
-+ doomcom->ticdup = myargv[i+1][0] - '0';
-+ if(doomcom->ticdup < 1)
-+ doomcom->ticdup = 1;
-+ if(doomcom->ticdup > 9)
-+ doomcom->ticdup = 9;
-+ }
-+
-+ if(M_CheckParm("-extratic"))
-+ doomcom->extratics = 1;
-+
-+ if((i = M_CheckParm("-srv")) && i < myargc - 1)
-+ strncpy(lsrv, myargv[i+1], sizeof(lsrv)-1);
-+
-+ /* [0-3], default 0; player 0 is special */
-+ if((i = M_CheckParm("-pn")) && i < myargc - 1)
-+ doomcom->consoleplayer = myargv[i+1][0] - '0';
-+
-+ /* FIXME: d_net.c: don't use remoteaddr=0 as special case (max+1?) */
-+ /* remote host address list: -net raddr!rsrv.. */
-+ if((i = M_CheckParm("-net")) == 0){
-+ /* single player game */
-+ doomcom->id = DOOMCOM_ID;
-+ doomcom->numplayers = doomcom->numnodes = 1;
-+ doomcom->deathmatch = false;
-+ netgame = false;
-+ return -1;
-+ }
-+ doomcom->numnodes++; /* raddr[0] is special cased because ??? */
-+ while(++i < myargc && myargv[i][0] != '-'){
-+ csip(myargv[i], &raddr[doomcom->numnodes]);
-+ doomcom->numnodes++;
-+ }
-+
-+ return 0;
-+}
-+
-+void
-+I_InitNetwork(void)
-+{
-+ doomcom = malloc(sizeof *doomcom);
-+ memset(doomcom, 0, sizeof *doomcom);
-+
-+ doomcom->ticdup = 1;
-+ doomcom->extratics = 0;
-+ if(netopts() < 0)
-+ return;
-+ if(doomcom->numnodes < 2)
-+ I_Error("netgame with a single node");
-+ doomcom->id = DOOMCOM_ID;
-+ doomcom->numplayers = doomcom->numnodes;
-+
-+ fmtinstall('I', eipfmt);
-+ initudp();
-+
-+ netgame = true;
- }
---- a/sys/src/games/doom/i_net.h
-+++ b/sys/src/games/doom/i_net.h
-@@ -35,6 +35,7 @@
-
- void I_InitNetwork (void);
- void I_NetCmd (void);
-+void I_ShutdownNet (void);
-
-
- #endif
---- a/sys/src/games/doom/i_system.c
-+++ b/sys/src/games/doom/i_system.c
-@@ -6,6 +6,7 @@
- #include "i_system.h"
- #include "i_sound.h"
- #include "i_video.h"
-+#include "i_net.h"
-
- #include "d_main.h"
- #include "d_net.h"
-@@ -42,6 +43,7 @@
- void I_Quit (void)
- {
- D_QuitNetGame ();
-+ I_ShutdownNet();
- I_ShutdownSound();
- I_ShutdownMusic();
- M_SaveDefaults ();
-@@ -86,6 +88,7 @@
- G_CheckDemoStatus();
-
- D_QuitNetGame ();
-+ I_ShutdownNet();
- I_ShutdownGraphics();
-
- exits("I_Error");
---- a/sys/src/games/doom/w_wad.h
-+++ b/sys/src/games/doom/w_wad.h
-@@ -67,6 +67,8 @@
- void* W_CacheLumpNum (int lump, int tag);
- void* W_CacheLumpName (char* name, int tag);
-
-+vlong filelength(int);
-+
- #endif
- //-----------------------------------------------------------------------------
- //
--- a/kbdfs-fshalt
+++ /dev/null
@@ -1,39 +1,0 @@
-diff 27a63ae22975171efbee5549d100f416ccb4066a uncommitted
---- a/sys/src/cmd/aux/kbdfs/kbdfs.c
-+++ b/sys/src/cmd/aux/kbdfs/kbdfs.c
-@@ -366,6 +366,25 @@
- }
-
- void
-+emergencywarp(void)
-+{
-+ int fd;
-+
-+ if(debug)
-+ return;
-+
-+ if(access("/srv/cwfs.cmd", AEXIST) == 0 && (fd = eopen("/srv/cwfs.cmd", OWRITE)) >= 0){
-+ fprint(fd, "halt\n");
-+ close(fd);
-+ }
-+ if(access("/srv/hjfs.cmd", AEXIST) == 0 && (fd = eopen("/srv/hjfs.cmd", OWRITE)) >= 0){
-+ fprint(fd, "halt\n");
-+ close(fd);
-+ }
-+ reboot();
-+}
-+
-+void
- shutdown(void)
- {
- if(notefd >= 0)
-@@ -443,6 +462,9 @@
-
- if(scan->caps && key.r<='z' && key.r>='a')
- key.r += 'A' - 'a';
-+
-+ if(scan->ctl && scan->altgr && key.r == Kdel)
-+ emergencywarp();
-
- if(scan->ctl && scan->alt && key.r == Kdel){
- if(scan->shift)
--- a/mothra-font
+++ /dev/null
@@ -1,45 +1,0 @@
-diff -r b012b1555646 sys/src/cmd/mothra/rdhtml.c
---- a/sys/src/cmd/mothra/rdhtml.c Sat Apr 25 20:46:45 2020 -0700
-+++ b/sys/src/cmd/mothra/rdhtml.c Sun Apr 26 11:07:53 2020 +0200
-@@ -14,25 +14,25 @@
- int space;
- }fontlist[4][4]={
- /* original */
-- "lucidasans/unicode.7", 0, 0,
-- "lucidasans/unicode.8", 0, 0,
-- "lucidasans/unicode.10", 0, 0,
-- "lucidasans/unicode.13", 0, 0,
-+ "dejavusans/unicode.12", 0, 0,
-+ "dejavusans/unicode.12", 0, 0,
-+ "dejavusans/unicode.14", 0, 0,
-+ "dejavusans/unicode.16", 0, 0,
-
-- "lucidasans/italicunicode.7", 0, 0,
-- "lucidasans/italicunicode.8", 0, 0,
-- "lucidasans/italicunicode.10", 0, 0,
-- "lucidasans/italicunicode.13", 0, 0,
-+ "dejavusansit/unicode.12", 0, 0,
-+ "dejavusansit/unicode.12", 0, 0,
-+ "dejavusansit/unicode.14", 0, 0,
-+ "dejavusansit/unicode.16", 0, 0,
-
-- "lucidasans/boldunicode.7", 0, 0,
-- "lucidasans/boldunicode.8", 0, 0,
-- "lucidasans/boldunicode.10", 0, 0,
-- "lucidasans/boldunicode.13", 0, 0,
-+ "dejavusansbd/unicode.12", 0, 0,
-+ "dejavusansbd/unicode.12", 0, 0,
-+ "dejavusansbd/unicode.14", 0, 0,
-+ "dejavusansbd/unicode.16", 0, 0,
-
-- "lucidasans/typeunicode.7", 0, 0,
-- "pelm/unicode.8", 0, 0,
-- "lucidasans/typeunicode.12", 0, 0,
-- "lucidasans/typeunicode.16", 0, 0,
-+ "terminus/unicode.12", 0, 0,
-+ "terminus/unicode.12", 0, 0,
-+ "terminus/unicode.14", 0, 0,
-+ "terminus/unicode.16", 0, 0,
- };
-
- static struct{
--- a/mothra-unifont
+++ /dev/null
@@ -1,384 +1,0 @@
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/draw.c
---- a/sys/src/cmd/mothra/libpanel/draw.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/draw.c Wed Feb 13 15:03:32 2019 +0100
-@@ -15,14 +15,16 @@
- #define CKBORDER 2 /* space around X inside frame */
- static int plldepth;
- static Image *pl_white, *pl_light, *pl_dark, *pl_black, *pl_hilit;
-+Image *txtcol;
- int pl_drawinit(int ldepth){
- plldepth=ldepth;
-- pl_white=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0xFFFFFFFF);
-- pl_light=allocimagemix(display, DPalebluegreen, DWhite);
-- pl_dark =allocimage(display, Rect(0,0,1,1), screen->chan, 1, DPurpleblue);
-- pl_black=allocimage(display, Rect(0,0,1,1), screen->chan, 1, 0x000000FF);
-+ pl_white=display->black;
-+ pl_light=display->black;
-+ pl_dark=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x222222FF);
-+ pl_black=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x770000FF);
- pl_hilit=allocimage(display, Rect(0,0,1,1), CHAN1(CAlpha,8), 1, 0x80);
-- if(pl_white==0 || pl_light==0 || pl_black==0 || pl_dark==0) return 0;
-+ txtcol=allocimage(display, Rect(0,0,1,1), CMAP8, 1, 0x884400FF);
-+ if(pl_white==0 || pl_light==0 || pl_black==0 || pl_dark==0 || txtcol==0) return 0;
- return 1;
- }
- void pl_relief(Image *b, Image *ul, Image *lr, Rectangle r, int wid){
-@@ -38,6 +40,13 @@
- }
- Rectangle pl_boxoutline(Image *b, Rectangle r, int style, int fill){
- if(plldepth==0) switch(style){
-+ case SUP:
-+ case TUP:
-+ pl_relief(b, pl_white, pl_white, r, BWID);
-+ r=insetrect(r, BWID);
-+ if(fill) draw(b, r, pl_white, 0, ZP);
-+ else border(b, r, SPACE, pl_white, ZP);
-+ break;
- case UP:
- pl_relief(b, pl_black, pl_black, r, BWID);
- r=insetrect(r, BWID);
-@@ -68,6 +77,13 @@
- break;
- }
- else switch(style){
-+ case SUP:
-+ case TUP:
-+ pl_relief(b, pl_white, pl_white, r, BWID);
-+ r=insetrect(r, BWID);
-+ if(fill) draw(b, r, pl_light, 0, ZP);
-+ else border(b, r, SPACE, pl_white, ZP);
-+ break;
- case UP:
- pl_relief(b, pl_white, pl_black, r, BWID);
- r=insetrect(r, BWID);
-@@ -97,7 +113,10 @@
- else border(b, r, SPACE, pl_white, ZP);
- break;
- }
-- return insetrect(r, SPACE);
-+ switch(style){
-+ case SUP: return insetrect(r, SPACE-SPACE);
-+ default: return insetrect(r, SPACE);
-+ }
- }
- Rectangle pl_outline(Image *b, Rectangle r, int style){
- return pl_boxoutline(b, r, style, 0);
-@@ -269,7 +288,7 @@
- draw(b, r, pl_dark, pl_hilit, ZP);
- }
- void pl_clr(Image *b, Rectangle r){
-- draw(b, r, display->white, 0, ZP);
-+ draw(b, r, display->black, 0, ZP);
- }
- void pl_fill(Image *b, Rectangle r){
- draw(b, r, plldepth==0? pl_white : pl_light, 0, ZP);
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/message.c
---- a/sys/src/cmd/mothra/libpanel/message.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/message.c Wed Feb 13 15:03:32 2019 +0100
-@@ -29,7 +29,7 @@
- end=s;
- c=*end;
- *end='\0';
-- string(b, where, display->black, ZP, f, start);
-+ string(b, where, txtcol, ZP, f, start);
- *end=c;
- where.y+=font->height;
- s=end;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/panel.h
---- a/sys/src/cmd/mothra/libpanel/panel.h Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/panel.h Wed Feb 13 15:03:32 2019 +0100
-@@ -108,6 +108,7 @@
- #define PL_STR 4
-
- Panel *plkbfocus; /* the panel in keyboard focus */
-+extern Image *txtcol;
-
- int plinit(int); /* initialization */
- void plpack(Panel *, Rectangle); /* figure out where to put the Panel & children */
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/pldefs.h
---- a/sys/src/cmd/mothra/libpanel/pldefs.h Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/pldefs.h Wed Feb 13 15:03:32 2019 +0100
-@@ -17,7 +17,9 @@
- * States, also styles
- */
- enum{
-- UP,
-+ SUP, // scrollbar
-+ TUP, // textview
-+ UP, // deprecated
- DOWN1,
- DOWN2,
- DOWN3,
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/rtext.c
---- a/sys/src/cmd/mothra/libpanel/rtext.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/rtext.c Wed Feb 13 15:03:32 2019 +0100
-@@ -11,7 +11,7 @@
- #include "rtext.h"
-
- #define LEAD 4 /* extra space between lines */
--#define BORD 2 /* extra border for images */
-+#define BORD 0 /* extra border for images */
-
- Rtext *pl_rtnew(Rtext **t, int space, int indent, int voff, Image *b, Panel *p, Font *f, char *s, int flags, void *user){
- Rtext *new;
-@@ -195,14 +195,14 @@
- && dr.min.x<r.max.x){
- if(t->b){
- draw(b, insetrect(dr, BORD), t->b, 0, t->b->r.min);
-- if(t->flags&PL_HOT) border(b, dr, 1, display->black, ZP);
-+ if(t->flags&PL_HOT) border(b, dr, 1, txtcol, ZP);
- if(t->flags&PL_STR) {
- line(b, Pt(dr.min.x, dr.min.y), Pt(dr.max.x, dr.max.y),
- Endsquare, Endsquare, 0,
-- display->black, ZP);
-+ txtcol, ZP);
- line(b, Pt(dr.min.x, dr.max.y), Pt(dr.max.x, dr.min.y),
- Endsquare, Endsquare, 0,
-- display->black, ZP);
-+ txtcol, ZP);
- }
- if(t->flags&PL_SEL)
- pl_highlight(b, dr);
-@@ -214,7 +214,7 @@
- pl_stuffbitmap(t->p, bb);
- }
- else{
-- string(b, dr.min, display->black, ZP, t->font, t->text);
-+ string(b, dr.min, txtcol, ZP, t->font, t->text);
- if(t->flags&PL_SEL)
- pl_highlight(b, dr);
- if(t->flags&PL_STR){
-@@ -223,7 +223,7 @@
- sp = Pt(dr.min.x, y);
- line(b, sp, Pt(dr.max.x, y),
- Endsquare, Endsquare, 0,
-- display->black, ZP);
-+ txtcol, ZP);
- sp = Pt(dr.max.x, y);
- } else
- sp = ZP;
-@@ -233,7 +233,7 @@
- lp = Pt(dr.min.x, y);
- line(b, lp, Pt(dr.max.x, y),
- Endsquare, Endsquare, 0,
-- display->black, ZP);
-+ txtcol, ZP);
- lp = Pt(dr.max.x, y);
- } else
- lp = ZP;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/scrollbar.c
---- a/sys/src/cmd/mothra/libpanel/scrollbar.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/scrollbar.c Wed Feb 13 15:03:32 2019 +0100
-@@ -16,7 +16,7 @@
- void pl_drawscrollbar(Panel *p){
- Scrollbar *sp;
- sp=p->data;
-- sp->interior=pl_outline(p->b, p->r, p->state);
-+ sp->interior=pl_outline(p->b, p->r, SUP); /* SUP was p->state */
- pl_sliderupd(p->b, sp->interior, sp->dir, sp->lo, sp->hi);
- }
- int pl_hitscrollbar(Panel *g, Mouse *m){
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/textview.c
---- a/sys/src/cmd/mothra/libpanel/textview.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/textview.c Wed Feb 13 15:03:32 2019 +0100
-@@ -47,7 +47,7 @@
- Point size;
-
- tp=p->data;
-- r=pl_outline(p->b, p->r, UP);
-+ r=pl_outline(p->b, p->r, TUP);
- twid=r.max.x-r.min.x;
- if(twid!=tp->twid){
- tp->twid=twid;
-@@ -80,7 +80,7 @@
- if(oldhitword==oldhitfirst)
- pl_passon(oldhitword, m);
- if(m->buttons&OUT)
-- p->state=UP;
-+ p->state=PASSIVE;
- else if(m->buttons&7){
- p->state=DOWN;
- tp->buttons=m->buttons;
-@@ -100,7 +100,7 @@
- }
- else{
- if(p->state==DOWN) hitme=1;
-- p->state=UP;
-+ p->state=PASSIVE;
- }
- if(tp->hitfirst!=oldhitfirst || tp->hitword!=oldhitword){
- plrtseltext(tp->text, tp->hitword, tp->hitfirst);
-@@ -214,7 +214,7 @@
- Textview *tp;
- tp=v->data;
- v->flags=flags|LEAF;
-- v->state=UP;
-+ v->state=PASSIVE;
- v->draw=pl_drawtextview;
- v->hit=pl_hittextview;
- v->type=pl_typetextview;
-diff -r b619d1fc23f6 sys/src/cmd/mothra/libpanel/textwin.c
---- a/sys/src/cmd/mothra/libpanel/textwin.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/libpanel/textwin.c Wed Feb 13 15:03:32 2019 +0100
-@@ -136,7 +136,7 @@
- er=t->text+last;
- for(r=t->text+first,lp=t->loc+(first-t->top);r!=er;r++,lp++){
- if(lp->y+t->hgt>t->r.max.y){
-- fprint(2, "chr %C, index %ld of %d, loc %d %d, off bottom\n",
-+ fprint(2, "chr %C, index %zd of %d, loc %d %d, off bottom\n",
- *r, lp-t->loc, t->bot-t->top, lp->x, lp->y);
- return;
- }
-@@ -155,7 +155,7 @@
- default:
- buf[runetochar(buf, r)]='\0';
- /***/ pl_clr(t->b, Rpt(*lp, addpt(*lp, stringsize(t->font, buf))));
-- ur=string(t->b, *lp, display->black, ZP, t->font, buf);
-+ ur=string(t->b, *lp, txtcol, ZP, t->font, buf);
- break;
- }
- if(lp[1].y!=lp[0].y)
-diff -r b619d1fc23f6 sys/src/cmd/mothra/mothra.c
---- a/sys/src/cmd/mothra/mothra.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/mothra.c Wed Feb 13 15:03:32 2019 +0100
-@@ -39,17 +39,17 @@
- 0x10, 0x08, 0x14, 0x08, 0x14, 0x28, 0x12, 0x28,
- 0x0A, 0x50, 0x16, 0x68, 0x20, 0x04, 0x3F, 0xFC,
- };
--Cursor confirmcursor={
-+Cursor confirmcurs={
- 0, 0,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+ 0x0F, 0xBF, 0x0F, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF,
-+ 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFE,
-+ 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF,
-+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFC,
-
- 0x00, 0x0E, 0x07, 0x1F, 0x03, 0x17, 0x73, 0x6F,
- 0xFB, 0xCE, 0xDB, 0x8C, 0xDB, 0xC0, 0xFB, 0x6C,
- 0x77, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
-- 0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90,
-+ 0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90
- };
- Cursor readingcurs={
- -10, -3,
-@@ -351,15 +351,15 @@
- plinit(screen->depth);
- if(debug) notify(dienow);
- getfonts();
-- hrule=allocimage(display, Rect(0, 0, 1, 5), screen->chan, 1, DWhite);
-+ hrule=allocimage(display, Rect(0, 0, 2048, 5), screen->chan, 1, DBlack);
- if(hrule==0)
- sysfatal("can't allocimage!");
-- draw(hrule, Rect(0,1,1,3), display->black, 0, ZP);
-- linespace=allocimage(display, Rect(0, 0, 1, 5), screen->chan, 1, DWhite);
-+ draw(hrule, Rect(0,1,1280,3), txtcol, 0, ZP);
-+ linespace=display->black;
- if(linespace==0)
- sysfatal("can't allocimage!");
-- bullet=allocimage(display, Rect(0,0,25, 8), screen->chan, 0, DWhite);
-- fillellipse(bullet, Pt(4,4), 3, 3, display->black, ZP);
-+ bullet=allocimage(display, Rect(0,0,25, 8), screen->chan, 0, DBlack);
-+ fillellipse(bullet, Pt(4,4), 3, 3, txtcol, ZP);
- mkpanels();
- unlockdisplay(display);
- eresized(0);
-@@ -423,11 +423,17 @@
- search();
- break;
- case Kright:
-- sidescroll(text->size.x/4, 1);
-+ scrolltext(text->size.y/24, 1); /* down one line */
- break;
- case Kleft:
-+ scrolltext(-text->size.y/24, 1); /* up one line */
-+ break;
-+ case Kins:
- sidescroll(-text->size.x/4, 1);
- break;
-+ case Kdel:
-+ sidescroll(text->size.x/4, 1);
-+ break;
- }
- break;
- case Emouse:
-@@ -450,6 +456,18 @@
- }
- }
- }
-+Cursor confirmcursor={
-+ 0, 0,
-+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-+
-+ 0x00, 0x0E, 0x07, 0x1F, 0x03, 0x17, 0x73, 0x6F,
-+ 0xFB, 0xCE, 0xDB, 0x8C, 0xDB, 0xC0, 0xFB, 0x6C,
-+ 0x77, 0xFC, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03,
-+ 0x94, 0xA6, 0x63, 0x3C, 0x63, 0x18, 0x94, 0x90,
-+};
- int confirm(int b){
- Mouse down, up;
- esetcursor(&confirmcursor);
-diff -r b619d1fc23f6 sys/src/cmd/mothra/mothra.h
---- a/sys/src/cmd/mothra/mothra.h Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/mothra.h Wed Feb 13 15:03:32 2019 +0100
-@@ -1,7 +1,7 @@
- enum{
- NWWW=64, /* # of pages we hold in the log */
-- NXPROC=5, /* # of parallel procs loading the pix */
-- NPIXMB=8, /* megabytes of image data to keep arround */
-+ NXPROC=16, /* # of parallel procs loading the pix */
-+ NPIXMB=48, /* megabytes of image data to keep arround */
- NNAME=512,
- NLINE=256,
- NAUTH=128,
-diff -r b619d1fc23f6 sys/src/cmd/mothra/rdhtml.c
---- a/sys/src/cmd/mothra/rdhtml.c Mon Feb 11 23:43:14 2019 +0100
-+++ b/sys/src/cmd/mothra/rdhtml.c Wed Feb 13 15:03:32 2019 +0100
-@@ -13,25 +13,25 @@
- Font *font;
- int space;
- }fontlist[4][4]={
-- "dejavusans/unicode.12", 0, 0,
-- "dejavusans/unicode.12", 0, 0,
-- "dejavusans/unicode.14", 0, 0,
-- "dejavusans/unicode.16", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.14", 0, 0,
-+ "unifont/unifont.16", 0, 0,
-
-- "dejavusansit/unicode.12", 0, 0,
-- "dejavusansit/unicode.12", 0, 0,
-- "dejavusansit/unicode.14", 0, 0,
-- "dejavusansit/unicode.16", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.14", 0, 0,
-+ "unifont/unifont.16", 0, 0,
-
-- "dejavusansbd/unicode.12", 0, 0,
-- "dejavusansbd/unicode.12", 0, 0,
-- "dejavusansbd/unicode.14", 0, 0,
-- "dejavusansbd/unicode.16", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.14", 0, 0,
-+ "unifont/unifont.16", 0, 0,
-
-- "terminus/unicode.12", 0, 0,
-- "terminus/unicode.14", 0, 0,
-- "terminus/unicode.16", 0, 0,
-- "terminus/unicode.18", 0, 0,
-+ "unifont/unifont.12", 0, 0,
-+ "unifont/unifont.14", 0, 0,
-+ "unifont/unifont.16", 0, 0,
-+ "unifont/unifont.18", 0, 0,
- };
-
- Font *pl_whichfont(int f, int s, int *space){
--- a/spred-col
+++ /dev/null
@@ -1,38 +1,0 @@
-diff -r 4136602b93e9 sys/src/cmd/spred/cmdw.c
---- a/sys/src/cmd/spred/cmdw.c Wed Nov 14 11:33:52 2018 -0800
-+++ b/sys/src/cmd/spred/cmdw.c Fri Nov 23 17:25:25 2018 +0100
-@@ -332,9 +332,11 @@
- .rmb = cmdrmb,
- .key = cmdkey,
- .hexcols = {
-- [BORD] DPurpleblue,
-- [DISB] 0xCCCCEEFF,
-- [BACK] 0xCCFFFFFF,
-- [HIGH] DPalegreygreen
-+ [BORD] 0x440000FF,
-+ [TEXT] 0x770000FF,
-+ [DISB] 0x111111FF,
-+ [BACK] 0x000000FF,
-+ [HIGH] 0x111111FF,
-+ [HTEXT] 0x770000FF,
- }
- };
-diff -r 4136602b93e9 sys/src/cmd/spred/win.c
---- a/sys/src/cmd/spred/win.c Wed Nov 14 11:33:52 2018 -0800
-+++ b/sys/src/cmd/spred/win.c Fri Nov 23 17:25:25 2018 +0100
-@@ -38,6 +38,7 @@
- scr = allocscreen(screen, display->white, 0);
- if(scr == nil)
- sysfatal("allocscreen: %r");
-+ draw(screen, screen->r, display->black, nil, ZP);
- for(i = 0; i < NTYPES; i++)
- for(j = 0; j < NCOLS; j++)
- tabs[i]->cols[j] = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, tabs[i]->hexcols[j]);
-@@ -254,6 +255,7 @@
- scr = allocscreen(screen, display->white, 0);
- if(scr == nil)
- sysfatal("allocscreen: %r");
-+ draw(screen, screen->r, display->black, nil, ZP);
- for(w = wlist.next; w != &wlist; w = w->next){
- r = rectsubpt(w->entire, old.min);
- r.min.x = muldiv(r.min.x, dxn, dxo);